diff --git a/cmake/CMakeLists.txt b/cmake/CMakeLists.txt index 76c28fcb72..967f229759 100644 --- a/cmake/CMakeLists.txt +++ b/cmake/CMakeLists.txt @@ -6,8 +6,8 @@ cmake_minimum_required(VERSION 3.1) project(lammps) set(SOVERSION 0) -set(LAMMPS_SOURCE_DIR ${CMAKE_SOURCE_DIR}/../src) -set(LAMMPS_LIB_SOURCE_DIR ${CMAKE_SOURCE_DIR}/../lib) +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 @@ -16,20 +16,18 @@ 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_SOURCE_DIR}/Modules) +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) -foreach(STYLE_FILE style_angle.h style_atom.h style_body.h style_bond.h style_command.h style_compute.h style_dihedral.h style_dump.h - style_fix.h style_improper.h style_integrate.h style_kspace.h style_minimize.h style_nbin.h style_npair.h style_nstencil.h - style_ntopo.h style_pair.h style_reader.h style_region.h) - if(EXISTS ${LAMMPS_SOURCE_DIR}/${STYLE_FILE}) - message(FATAL_ERROR "There is a ${STYLE_FILE} in ${LAMMPS_SOURCE_DIR}, please clean up the source directory first") - endif() -endforeach() +# 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) @@ -39,14 +37,22 @@ enable_language(CXX) ##################################################################### 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) -option(INSTALL_LIB "Install lammps library and header" ON) +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) @@ -58,13 +64,15 @@ if(ENABLE_MPI) endif() else() file(GLOB MPI_SOURCES ${LAMMPS_SOURCE_DIR}/STUBS/mpi.c) - list(APPEND LIB_SOURCES ${MPI_SOURCES}) + 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}) @@ -72,6 +80,13 @@ 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) @@ -85,12 +100,12 @@ 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 - USER-ATC USER-AWPMD USER-CGDNA +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-MOLFILE USER-NETCDF USER-PHONON USER-QTB USER-REAXC USER-SMD - USER-SMTBQ USER-SPH USER-TALLY USER-VTK USER-QUIP USER-QMMM) + 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}) @@ -120,8 +135,10 @@ endif() ###################################################### # packages with special compiler needs or external libs ###################################################### -if(ENABLE_REAX OR ENABLE_MEAM OR ENABLE_USER-QUIP OR ENABLE_USER-QMMM) +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) @@ -156,18 +173,22 @@ endif() if(ENABLE_MISC) option(LAMMPS_XDR "include XDR compatibility files for doing particle dumps in XTC format" OFF) if(LAMMPS_XDR) - add_definitions(-DLAMMPS_XDR) + add_definitions(-DLAMMPS_XDR) # for liblammps endif() endif() -if(ENABLE_MSCG OR ENABLE_USER-ATC OR ENABLE_USER-AWPMD OR ENABLE_USER-QUIP) +if(ENABLE_MSCG OR ENABLE_USER-ATC OR ENABLE_USER-AWPMD OR ENABLE_USER-QUIP OR ENABLE_LATTE) find_package(LAPACK) - if(LAPACK_FOUND) - list(APPEND LAMMPS_LINK_LIBS ${LAPACK_LIBRARIES}) - else() + if(NOT LAPACK_FOUND) enable_language(Fortran) file(GLOB LAPACK_SOURCES ${LAMMPS_LIB_SOURCE_DIR}/linalg/*.f) - list(APPEND LIB_SOURCES ${LAPACK_SOURCES}) + 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() @@ -182,7 +203,7 @@ if(ENABLE_PYTHON) -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_SOURCE_DIR}/../python/lammps.py DESTINATION ${PYTHON_INSTDIR}) + install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/../python/lammps.py DESTINATION ${PYTHON_INSTDIR}) if(NOT BUILD_SHARED_LIBS) message(FATAL_ERROR "Python package need lammps to be build shared, use -DBUILD_SHARED_LIBS=ON") endif() @@ -221,8 +242,29 @@ if(ENABLE_VORONOI) 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) - list(APPEND LAMMPS_LINK_LIBS ${CMAKE_DL_LIBS}) + 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) @@ -239,7 +281,7 @@ endif() if(ENABLE_USER-QUIP) find_package(QUIP REQUIRED) - list(APPEND LAMMPS_LINK_LIBS ${QUIP_LIBRARIES} ${CMAKE_Fortran_IMPLICIT_LINK_LIBRARIES}) + list(APPEND LAMMPS_LINK_LIBS ${QUIP_LIBRARIES} ${LAPACK_LIBRARIES} ${CMAKE_Fortran_IMPLICIT_LINK_LIBRARIES}) endif() if(ENABLE_USER-QMMM) @@ -248,17 +290,6 @@ if(ENABLE_USER-QMMM) list(APPEND LAMMPS_LINK_LIBS ${QE_LIBRARIES} ${CMAKE_Fortran_IMPLICIT_LINK_LIBRARIES}) endif() -if(ENABLE_USER-AWPMD) - include_directories(${LAMMPS_LIB_SOURCE_DIR}/awpmd/systems/interact - ${LAMMPS_LIB_SOURCE_DIR}/awpmd/ivutils/include) -endif() - -if(ENABLE_USER-H5MD) - find_package(HDF5 REQUIRED) - list(APPEND LAMMPS_LINK_LIBS ${HDF5_LIBRARIES}) - include_directories(${HDF5_INCLUDE_DIRS} ${LAMMPS_LIB_SOURCE_DIR}/h5md/include) -endif() - if(ENABLE_USER-VTK) find_package(VTK REQUIRED NO_MODULE) include(${VTK_USE_FILE}) @@ -289,13 +320,11 @@ if(ENABLE_MSCG) WORKING_DIRECTORY ${LAMMPS_LIB_BINARY_DIR}/mscg) endif() file(GLOB MSCG_SOURCES ${LAMMPS_LIB_MSCG_BIN_DIR}/*.cpp) - list(APPEND LIB_SOURCES ${MSCG_SOURCES}) - foreach(MSCG_SOURCE ${MSCG_SOURCES}) - set_property(SOURCE ${MSCG_SOURCE} APPEND PROPERTY COMPILE_DEFINITIONS - DIMENSION=3 _exclude_gromacs=1) - endforeach() - include_directories(${LAMMPS_LIB_MSCG_BIN_DIR} ${GSL_INCLUDE_DIRS}) - list(APPEND LAMMPS_LINK_LIBS ${GSL_LIBRARIES}) + 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() ######################################################################## @@ -321,7 +350,7 @@ endforeach(FUNC) list(APPEND LAMMPS_LINK_LIBS ${MATH_LIBRARIES}) ###################################### -# Generate Basic Style files +# Generate Basic Style files ###################################### include(StyleHeaderUtils) RegisterStyles(${LAMMPS_SOURCE_DIR}) @@ -330,13 +359,27 @@ RegisterStyles(${LAMMPS_SOURCE_DIR}) # add sources of enabled packages ############################################ foreach(PKG ${DEFAULT_PACKAGES} ${OTHER_PACKAGES}) - if(ENABLE_${PKG}) - set(${PKG}_SOURCES_DIR ${LAMMPS_SOURCE_DIR}/${PKG}) + 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}) - file(GLOB ${PKG}_SOURCES ${${PKG}_SOURCES_DIR}/*.cpp) list(APPEND LIB_SOURCES ${${PKG}_SOURCES}) include_directories(${${PKG}_SOURCES_DIR}) endif() @@ -346,17 +389,53 @@ endforeach() # add lib sources of (simple) enabled packages ############################################ foreach(SIMPLE_LIB REAX MEAM POEMS USER-ATC USER-AWPMD USER-COLVARS USER-H5MD - USER-MOLFILE USER-QMMM) + USER-QMMM) if(ENABLE_${SIMPLE_LIB}) - string(REGEX REPLACE "^USER-" "" SIMPLE_LIB "${SIMPLE_LIB}") - string(TOLOWER "${SIMPLE_LIB}" INC_DIR) - file(GLOB_RECURSE ${SIMPLE_LIB}_SOURCES ${LAMMPS_LIB_SOURCE_DIR}/${INC_DIR}/*.F - ${LAMMPS_LIB_SOURCE_DIR}/${INC_DIR}/*.c ${LAMMPS_LIB_SOURCE_DIR}/${INC_DIR}/*.cpp) - list(APPEND LIB_SOURCES ${${SIMPLE_LIB}_SOURCES}) - include_directories(${LAMMPS_LIB_SOURCE_DIR}/${INC_DIR}) + 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) + 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 @@ -453,62 +532,130 @@ if(ENABLE_USER-INTEL) endif() if(ENABLE_GPU) - 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() - include_directories(${CUDA_INCLUDE_DIRS}) - list(APPEND LAMMPS_LINK_LIBS ${CUDA_LIBRARIES} ${CUDA_CUDA_LIBRARY}) - set(GPU_PREC "SINGLE_DOUBLE" CACHE STRING "Lammps gpu precision size") - set_property(CACHE GPU_PREC PROPERTY STRINGS SINGLE_DOUBLE SINGLE_SINGLE DOUBLE_DOUBLE) - add_definitions(-D_${GPU_PREC}) - add_definitions(-DNV_KERNEL -DUCL_CUDADR) - option(CUDPP_OPT "Enable CUDPP_OPT" ON) - set(GPU_SOURCES_DIR ${LAMMPS_SOURCE_DIR}/GPU) - set(GPU_SOURCES ${GPU_SOURCES_DIR}/gpu_extra.h) + 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} opt GPU_SOURCES) + RegisterStylesExt(${GPU_SOURCES_DIR} gpu GPU_SOURCES) get_property(GPU_SOURCES GLOBAL PROPERTY GPU_SOURCES) - - file(GLOB GPU_LIB_SOURCES ${LAMMPS_LIB_SOURCE_DIR}/gpu/*.cpp) - file(GLOB GPU_LIB_CU ${LAMMPS_LIB_SOURCE_DIR}/gpu/*.cu ${CMAKE_SOURCE_DIR}/gpu/*.cu) - file(GLOB_RECURSE GPU_NOT_LIB_CU ${LAMMPS_LIB_SOURCE_DIR}/gpu/lal_pppm.cu) - list(REMOVE_ITEM GPU_LIB_CU ${GPU_NOT_LIB_CU}) - include_directories(${GPU_SOURCES_DIR} ${LAMMPS_LIB_SOURCE_DIR}/gpu ${LAMMPS_LIB_BINARY_DIR}/gpu) - if(CUDPP_OPT) - include_directories(${LAMMPS_LIB_SOURCE_DIR}/gpu/cudpp_mini) - add_definitions(-DCUDPP_OPT) - 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(GPU_OBJS ${GPU_LIB_CU} ${GPU_LIB_CUDPP_CU} OPTIONS $<$:-Xcompiler=-fPIC>) - file(MAKE_DIRECTORY ${LAMMPS_LIB_BINARY_DIR}/gpu) - foreach(CU_OBJ ${GPU_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 LIB_SOURCES ${LAMMPS_LIB_BINARY_DIR}/gpu/${CU_NAME}_cubin.h) - if(${CU_NAME} STREQUAL "pppm_d") #pppm_d doesn't get linked into the lib - set(CU_FORBIDDEN_OBJ "${CU_OBJ}") - endif() - endforeach() - list(REMOVE_ITEM GPU_OBJS "${CU_FORBIDDEN_OBJ}") - list(APPEND LIB_SOURCES ${GPU_SOURCES} ${GPU_LIB_SOURCES} ${GPU_LIB_CUDPP_SOURCES} ${GPU_OBJS}) - set_directory_properties(PROPERTIES ADDITIONAL_MAKE_CLEAN_FILES "${LAMMPS_LIB_BINARY_DIR}/gpu/*_cubin.h") + + 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 +# styles registered during package selection ###################################################### set(LAMMPS_STYLE_HEADERS_DIR ${CMAKE_CURRENT_BINARY_DIR}/styles) @@ -522,19 +669,24 @@ include_directories(${LAMMPS_STYLE_HEADERS_DIR}) ############################################ add_library(lammps ${LIB_SOURCES}) target_link_libraries(lammps ${LAMMPS_LINK_LIBS}) -set_target_properties(lammps PROPERTIES SOVERSION ${SOVERSION}) -if(INSTALL_LIB) +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}/lammps.h DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}) -elseif(BUILD_SHARED_LIBS) - message(FATAL_ERROR "Shared library has to be installed, use -DINSTALL_LIB=ON to install lammps with a library") + 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 ${CMAKE_CURRENT_BINARY_DIR}/lmp -help) + add_test(ShowHelp lmp${LAMMPS_MACHINE} -help) endif() ################################## @@ -545,3 +697,27 @@ foreach(PKG ${DEFAULT_PACKAGES} ${OTHER_PACKAGES} ${ACCEL_PACKAGES}) 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/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/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 index 9939a7505a..32054c53ba 100644 --- a/cmake/Modules/StyleHeaderUtils.cmake +++ b/cmake/Modules/StyleHeaderUtils.cmake @@ -85,6 +85,35 @@ function(RegisterStyles search_path) 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}) diff --git a/cmake/README b/cmake/README.md similarity index 100% rename from cmake/README rename to cmake/README.md 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/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 index f62ae28bc4..b5f39bb470 100644 Binary files a/doc/src/Eqs/fix_mvv_dpd.jpg 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 index 4652d54b77..685d527763 100644 --- a/doc/src/Eqs/fix_mvv_dpd.tex +++ b/doc/src/Eqs/fix_mvv_dpd.tex @@ -15,7 +15,7 @@ $$ $$ $$ - v(t+\Delta t) = v(t+\frac{\Delta t}{2}) + \frac{\Delta t}{2}\cdot a(t++\Delta t), + 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/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 7ec83b3207..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 bb2e1b8114..303e951fab 100644 --- a/doc/src/Manual.txt +++ b/doc/src/Manual.txt @@ -1,7 +1,7 @@ LAMMPS Users Manual - + @@ -21,7 +21,7 @@

LAMMPS Documentation :c,h3 -17 Aug 2017 version :c,h4 +22 Sep 2017 version :c,h4 Version info: :h4 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 ad15752107..ef1ed3b545 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_commands.txt b/doc/src/Section_commands.txt index 48f11b3c63..24f687e56e 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, @@ -718,6 +720,8 @@ 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, @@ -726,6 +730,7 @@ package"_Section_start.html#start_3. "qtb"_fix_qtb.html, "reax/c/bonds"_fix_reax_bonds.html, "reax/c/species"_fix_reaxc_species.html, +"rhok"_fix_rhok.html, "rx"_fix_rx.html, "saed/vtk"_fix_saed_vtk.html, "shardlow"_fix_shardlow.html, @@ -755,6 +760,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, @@ -853,6 +859,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, @@ -881,6 +888,7 @@ package"_Section_start.html#start_3. "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 @@ -914,9 +922,9 @@ KOKKOS, o = USER-OMP, t = OPT. "born/coul/wolf (go)"_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, @@ -931,12 +939,12 @@ 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, +"dpd (gio)"_pair_dpd.html, "dpd/tstat (go)"_pair_dpd.html, "dsmc"_pair_dsmc.html, -"eam (gkiot)"_pair_eam.html, -"eam/alloy (gkiot)"_pair_eam.html, -"eam/fs (gkiot)"_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, @@ -950,9 +958,9 @@ KOKKOS, o = USER-OMP, t = OPT. "kim"_pair_kim.html, "lcbop"_pair_lcbop.html, "line/lj"_pair_line_lj.html, -"lj/charmm/coul/charmm (kio)"_pair_charmm.html, +"lj/charmm/coul/charmm (iko)"_pair_charmm.html, "lj/charmm/coul/charmm/implicit (ko)"_pair_charmm.html, -"lj/charmm/coul/long (gkio)"_pair_charmm.html, +"lj/charmm/coul/long (giko)"_pair_charmm.html, "lj/charmm/coul/msm"_pair_charmm.html, "lj/charmmfsw/coul/charmmfsh"_pair_charmm.html, "lj/charmmfsw/coul/long"_pair_charmm.html, @@ -1002,9 +1010,9 @@ KOKKOS, o = USER-OMP, t = OPT. "resquared (go)"_pair_resquared.html, "snap"_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, @@ -1108,6 +1116,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, @@ -1174,7 +1183,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, @@ -1187,7 +1196,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, @@ -1210,7 +1219,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 diff --git a/doc/src/Section_howto.txt b/doc/src/Section_howto.txt index 6d699fe24b..65ae2220fe 100644 --- a/doc/src/Section_howto.txt +++ b/doc/src/Section_howto.txt @@ -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_packages.txt b/doc/src/Section_packages.txt index 6122dfac78..912d371cd9 100644 --- a/doc/src/Section_packages.txt +++ b/doc/src/Section_packages.txt @@ -96,6 +96,7 @@ Package, Description, Doc page, Example, Library "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 @@ -149,6 +150,7 @@ 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-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 @@ -695,6 +697,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", 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 apporpriate +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:] @@ -2191,7 +2253,7 @@ src/USER-MESO/README "pair_style edpd"_pair_meso.html "pair_style mdpd"_pair_meso.html "pair_style tdpd"_pair_meso.html -"fix mvv/dpd"_fix_mvv.html +"fix mvv/dpd"_fix_mvv_dpd.html examples/USER/meso http://lammps.sandia.gov/movies.html#mesodpd :ul @@ -2710,13 +2772,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 visuzlization packages. :link(vtk,http://www.vtk.org) :link(paraview,http://www.paraview.org) diff --git a/doc/src/Section_start.txt b/doc/src/Section_start.txt index 5f9ac36a4a..3711342f76 100644 --- a/doc/src/Section_start.txt +++ b/doc/src/Section_start.txt @@ -920,7 +920,7 @@ CPUs and KNLs; the KOKKOS package builds for CPUs (OpenMP), GPUs Makefile.intel_cpu Makefile.intel_phi Makefile.kokkos_omp -Makefile.kokkos_cuda +Makefile.kokkos_cuda_mpi Makefile.kokkos_phi Makefile.omp Makefile.opt :ul diff --git a/doc/src/accelerate_intel.txt b/doc/src/accelerate_intel.txt index a7c3382caa..aaa38d7de2 100644 --- a/doc/src/accelerate_intel.txt +++ b/doc/src/accelerate_intel.txt @@ -25,14 +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: airebo, airebo/morse, buck/coul/cut, buck/coul/long, -buck, 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 +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 @@ -54,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 @@ -82,6 +83,11 @@ 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 @@ -108,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 @@ -119,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 @@ -237,14 +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". +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 @@ -361,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 8d87751f94..2b07ed035f 100644 --- a/doc/src/accelerate_kokkos.txt +++ b/doc/src/accelerate_kokkos.txt @@ -135,10 +135,10 @@ GPUs, or Phi. You can do any of these in one line, using the suitable make command line flags as described in "Section 4"_Section_packages.html of the manual. If run from the src directory, these -commands will create src/lmp_kokkos_omp, lmp_kokkos_cuda, and +commands will create src/lmp_kokkos_omp, lmp_kokkos_cuda_mpi, 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. +option uses src/MAKE/OPTIONS/Makefile.kokkos_cuda_mpi. The latter two steps can be done using the "-k on", "-pk kokkos" and "-sf kk" "command-line switches"_Section_start.html#start_6 @@ -159,7 +159,7 @@ CPU-only (only MPI, no threading): cd lammps/src make yes-kokkos -make kokkos_mpi :pre +make kokkos_mpi_only :pre Intel Xeon Phi (Intel Compiler, Intel MPI): @@ -167,11 +167,11 @@ cd lammps/src make yes-kokkos make kokkos_phi :pre -CPUs and GPUs (with MPICH): +CPUs and GPUs (with MPICH or OpenMPI): 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 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/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_pressure_uef.txt b/doc/src/compute_pressure_uef.txt new file mode 100644 index 0000000000..065fc04441 --- /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 specificed 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_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/computes.txt b/doc/src/computes.txt index c443bfaba2..1b64e2e5b4 100644 --- a/doc/src/computes.txt +++ b/doc/src/computes.txt @@ -65,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 @@ -114,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/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_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_cmap.txt b/doc/src/fix_cmap.txt index 2b14a20c1d..e80154bccf 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 diff --git a/doc/src/fix_deform.txt b/doc/src/fix_deform.txt index 63d872eded..12d84e8fcb 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 (extensional flow) system +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_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_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 0b505a85b3..be3a1669d2 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} or {bodyforces} :l +keyword = {temp} or {press} or {energy} or {virial} or {respa} or {dynamic/dof} or {bodyforces} :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 @@ -54,11 +55,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 @@ -71,6 +71,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. @@ -130,4 +149,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, bodyforces = late. +by fix, energy = no, virial = varies by fix style, respa = 0, bodyforces = late. \ No newline at end of file diff --git a/doc/src/fix_neb.txt b/doc/src/fix_neb.txt index 52d8a7df84..73b3e31266 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 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_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 9630c26463..2b5e5efa03 100644 --- a/doc/src/fix_rigid.txt +++ b/doc/src/fix_rigid.txt @@ -703,6 +703,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..9f82fc0fb6 100644 --- a/doc/src/fix_shake.txt +++ b/doc/src/fix_shake.txt @@ -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_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_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 7000a66c51..ad3e95fa41 100644 --- a/doc/src/fixes.txt +++ b/doc/src/fixes.txt @@ -59,6 +59,7 @@ Fixes :h1 fix_langevin fix_langevin_drude fix_langevin_eff + fix_latte fix_lb_fluid fix_lb_momentum fix_lb_pc @@ -76,6 +77,7 @@ Fixes :h1 fix_neb fix_nh fix_nh_eff + fix_nh_uef fix_nph_asphere fix_nph_body fix_nph_sphere @@ -124,6 +126,7 @@ Fixes :h1 fix_reaxc_species fix_recenter fix_restrain + fix_rhok fix_rigid fix_rx fix_saed_vtk diff --git a/doc/src/lammps.book b/doc/src/lammps.book index f4d3566a6e..0691f43e9b 100644 --- a/doc/src/lammps.book +++ b/doc/src/lammps.book @@ -62,6 +62,7 @@ dump_modify.html dump_molfile.html dump_netcdf.html dump_vtk.html +dump_cfg_uef.html echo.html fix.html fix_modify.html @@ -116,6 +117,7 @@ suffix.html tad.html temper.html temper_grem.html +temper_npt.html thermo.html thermo_modify.html thermo_style.html @@ -186,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 @@ -230,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 @@ -252,6 +256,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 @@ -353,6 +358,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 @@ -402,6 +408,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 @@ -513,7 +520,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 @@ -521,6 +528,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 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_dpd.txt b/doc/src/pair_dpd.txt index 8d194bb092..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 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 a0026432ec..03e77f53ab 100644 --- a/doc/src/pair_eam.txt +++ b/doc/src/pair_eam.txt @@ -294,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) @@ -442,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_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_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_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/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/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/examples/README b/examples/README index dc622ef7c4..a8dfe63d92 100644 --- a/examples/README +++ b/examples/README @@ -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/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/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/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..7df354a742 --- /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= "/home/user/LATTE/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/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/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..e0c768dbc9 100644 --- a/lib/colvars/Makefile.deps +++ b/lib/colvars/Makefile.deps @@ -4,73 +4,232 @@ $(COLVARS_OBJ_DIR)colvaratoms.o: colvaratoms.cpp colvarmodule.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 + 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 + colvarbias_alb.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.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 + 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 colvartypes.h colvarproxy.h \ - colvarvalue.h colvar.h colvarparse.h colvardeps.h colvarbias_histogram.h \ - colvarbias.h colvargrid.h + colvarvalue.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 colvar.h \ colvarmodule.h colvars_version.h colvartypes.h colvarproxy.h \ - colvarvalue.h colvarparse.h colvardeps.h colvarbias_meta.h colvarbias.h \ - colvargrid.h + colvarvalue.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 + 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 + colvarvalue.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 $(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 \ + 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 + 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 $(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 + colvarvalue.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 $(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 + colvarvalue.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 $(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 + colvarvalue.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 $(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 + 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 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 + 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 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 + 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 \ + 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 colvartypes.h colvarproxy.h colvarvalue.h \ colvarparse.h $(COLVARS_OBJ_DIR)colvarproxy.o: colvarproxy.cpp colvarmodule.h \ colvars_version.h colvartypes.h colvarproxy.h colvarvalue.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 + colvarvalue.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)colvartypes.o: colvartypes.cpp colvarmodule.h \ colvars_version.h colvartypes.h colvarproxy.h colvarvalue.h \ colvarparse.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/README b/lib/colvars/README index 5df9612dfa..087528748b 100644 --- a/lib/colvars/README +++ b/lib/colvars/README @@ -47,6 +47,10 @@ 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 diff --git a/lib/colvars/colvar.cpp b/lib/colvars/colvar.cpp index d23bd852aa..d1a398ce4d 100644 --- a/lib/colvars/colvar.cpp +++ b/lib/colvars/colvar.cpp @@ -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(); @@ -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; diff --git a/lib/colvars/colvar.h b/lib/colvars/colvar.h index dfa9e093a5..20dad2771b 100644 --- a/lib/colvars/colvar.h +++ b/lib/colvars/colvar.h @@ -60,7 +60,10 @@ public: /// \brief Current actual value (not extended DOF) colvarvalue const & actual_value() 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; @@ -96,6 +99,12 @@ public: { 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 @@ -592,6 +601,10 @@ public: } }; +inline cvm::real const & colvar::force_constant() const +{ + return ext_force_k; +} inline colvarvalue const & colvar::value() const { diff --git a/lib/colvars/colvar_UIestimator.h b/lib/colvars/colvar_UIestimator.h new file mode 100644 index 0000000000..2fb250b71d --- /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(pow(y_size, 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(pow(y_size, 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..d2a0f0a807 100644 --- a/lib/colvars/colvaratoms.cpp +++ b/lib/colvars/colvaratoms.cpp @@ -817,6 +817,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 6113fb38a9..71c587e230 100644 --- a/lib/colvars/colvaratoms.h +++ b/lib/colvars/colvaratoms.h @@ -214,6 +214,12 @@ public: { 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: @@ -280,6 +286,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 636727ca39..902ea4605d 100644 --- a/lib/colvars/colvarbias.cpp +++ b/lib/colvars/colvarbias.cpp @@ -10,6 +10,7 @@ #include "colvarmodule.h" #include "colvarvalue.h" #include "colvarbias.h" +#include "colvargrid.h" colvarbias::colvarbias(char const *key) @@ -31,12 +32,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 +65,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 +151,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 +174,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 +216,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 +229,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]; + } } @@ -389,6 +405,248 @@ std::ostream & colvarbias::write_traj(std::ostream &os) 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"); + } + + // Collect total colvar forces from the previous step + size_t i; + if (cvm::step_relative() > 0) { + 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); + } + } + + // Set the index to be used 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 a147cd3210..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(); @@ -183,6 +186,12 @@ public: { 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: @@ -194,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; @@ -209,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..5f5fe14978 100644 --- a/lib/colvars/colvarbias_abf.cpp +++ b/lib/colvars/colvarbias_abf.cpp @@ -14,6 +14,8 @@ colvarbias_abf::colvarbias_abf(char const *key) : colvarbias(key), + b_UI_estimator(false), + b_CZAR_estimator(false), system_force(NULL), gradients(NULL), samples(NULL), @@ -159,6 +161,7 @@ int colvarbias_abf::init(std::string const &conf) // Data for eABF 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); @@ -187,8 +190,38 @@ int colvarbias_abf::init(std::string const &conf) read_gradients_samples(); } - cvm::log("Finished ABF setup.\n"); + // 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 (size_t i = 0; i < colvars.size(); 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; } @@ -332,7 +365,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 +397,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(colvars.size(),0); + std::vector y(colvars.size(),0); + for (size_t i = 0; i < colvars.size(); 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; } @@ -479,8 +526,8 @@ void colvarbias_abf::write_gradients_samples(const std::string &prefix, bool app 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"; @@ -588,7 +635,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 +668,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); @@ -655,7 +702,7 @@ std::istream & colvarbias_abf::read_state_data(std::istream& is) return is; } - 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..1defe72268 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; @@ -50,6 +51,12 @@ private: /// 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; /// Cap applied biasing force? bool cap_force; diff --git a/lib/colvars/colvarbias_meta.cpp b/lib/colvars/colvarbias_meta.cpp index 66806fc9fc..b0d154dfc9 100644 --- a/lib/colvars/colvarbias_meta.cpp +++ b/lib/colvars/colvarbias_meta.cpp @@ -33,7 +33,7 @@ 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 +44,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 +105,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 +231,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 +243,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 +347,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 +1014,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 +1392,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 +1494,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 +1651,7 @@ std::ostream & colvarbias_meta::write_state_data(std::ostream& os) } } + colvarbias_ti::write_state_data(os); return os; } @@ -1651,6 +1672,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 6879190968..23534f56eb 100644 --- a/lib/colvars/colvarbias_restraint.cpp +++ b/lib/colvars/colvarbias_restraint.cpp @@ -14,7 +14,7 @@ colvarbias_restraint::colvarbias_restraint(char const *key) - : colvarbias(key) + : colvarbias(key), colvarbias_ti(key) { } @@ -24,6 +24,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 +88,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) { } @@ -145,7 +147,7 @@ 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; } @@ -237,6 +239,7 @@ 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) @@ -284,14 +287,17 @@ int colvarbias_restraint_centers_moving::init(std::string const &conf) target_centers[i], 0.5); } + + get_keyval(conf, "outputAccumulatedWork", b_output_acc_work, + b_output_acc_work); // TODO this conflicts with stages + } 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); // TODO this conflicts with stages return COLVARS_OK; } @@ -308,7 +314,7 @@ int colvarbias_restraint_centers_moving::update_centers(cvm::real lambda) colvarvalue const c_new = colvarvalue::interpolate(initial_centers[i], target_centers[i], lambda); - centers_incr[i] = (c_new).dist2_grad(colvar_centers[i]); + centers_incr[i] = 0.5 * c_new.dist2_grad(colvar_centers[i]); colvar_centers[i] = c_new; variables(i)->wrap(colvar_centers[i]); } @@ -475,6 +481,7 @@ 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) @@ -712,6 +719,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), @@ -743,17 +751,22 @@ 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(); - return COLVARS_OK; + return error_code; } @@ -798,6 +811,18 @@ int colvarbias_restraint_harmonic::set_state_params(std::string const &conf) } +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); @@ -845,6 +870,7 @@ 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), @@ -967,11 +993,15 @@ 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(); + + return error_code; } @@ -1065,6 +1095,18 @@ int colvarbias_restraint_harmonic_walls::set_state_params(std::string const &con } +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); @@ -1084,6 +1126,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), @@ -1120,17 +1163,22 @@ 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(); - return COLVARS_OK; + return error_code; } @@ -1196,6 +1244,18 @@ int colvarbias_restraint_linear::set_state_params(std::string const &conf) } +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 8c3a1537fc..b10649cab1 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: @@ -95,7 +96,7 @@ protected: /// 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); @@ -226,6 +227,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); @@ -252,6 +255,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); @@ -292,6 +297,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 3c1ec2495c..b94d798be9 100644 --- a/lib/colvars/colvarcomp.h +++ b/lib/colvars/colvarcomp.h @@ -140,7 +140,12 @@ public: { 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(); diff --git a/lib/colvars/colvarcomp_coordnums.cpp b/lib/colvars/colvarcomp_coordnums.cpp index 369d489e27..edfea96795 100644 --- a/lib/colvars/colvarcomp_coordnums.cpp +++ b/lib/colvars/colvarcomp_coordnums.cpp @@ -87,6 +87,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; diff --git a/lib/colvars/colvarcomp_distances.cpp b/lib/colvars/colvarcomp_distances.cpp index 18d154515a..ce8055843f 100644 --- a/lib/colvars/colvarcomp_distances.cpp +++ b/lib/colvars/colvarcomp_distances.cpp @@ -1066,8 +1066,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 +1105,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 +1113,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/colvardeps.cpp b/lib/colvars/colvardeps.cpp index 8f241a6255..ac906e7be7 100644 --- a/lib/colvars/colvardeps.cpp +++ b/lib/colvars/colvardeps.cpp @@ -413,15 +413,27 @@ 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_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 +443,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; } @@ -504,9 +519,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 +526,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); @@ -693,7 +705,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 dfb10d00e4..bd892fbca8 100644 --- a/lib/colvars/colvardeps.h +++ b/lib/colvars/colvardeps.h @@ -180,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, @@ -229,10 +227,18 @@ public: f_cvb_get_total_force, /// \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.h b/lib/colvars/colvargrid.h index 6f06cb1066..a01104dba8 100644 --- a/lib/colvars/colvargrid.h +++ b/lib/colvars/colvargrid.h @@ -1403,6 +1403,15 @@ public: /// Constructor from a vector of colvars colvar_grid_gradient(std::vector &colvars); + /// \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] += values[imult].real_value; + } + if (samples) + samples->incr_count(ix); + } + /// \brief Accumulate the gradient inline void acc_grad(std::vector const &ix, cvm::real const *grads) { for (size_t imult = 0; imult < mult; imult++) { diff --git a/lib/colvars/colvarmodule.cpp b/lib/colvars/colvarmodule.cpp index 780dc28afa..f293aac63f 100644 --- a/lib/colvars/colvarmodule.cpp +++ b/lib/colvars/colvarmodule.cpp @@ -22,7 +22,7 @@ #include "colvarbias_restraint.h" #include "colvarscript.h" #include "colvaratoms.h" - +#include "colvarcomp.h" colvarmodule::colvarmodule(colvarproxy *proxy_in) { @@ -274,9 +274,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,22 +409,12 @@ 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) { @@ -441,7 +431,7 @@ int colvarmodule::parse_biases(std::string const &conf) } -int colvarmodule::num_biases_feature(int feature_id) +int colvarmodule::num_biases_feature(int feature_id) const { colvarmodule *cv = cvm::main(); size_t n = 0; @@ -456,7 +446,7 @@ 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; @@ -471,6 +461,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 < biases.size(); 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 +679,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; @@ -916,21 +929,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 +1019,15 @@ colvarmodule::~colvarmodule() { if ((proxy->smp_thread_id() == COLVARS_NOT_IMPLEMENTED) || (proxy->smp_thread_id() == 0)) { + + // Delete contents of static arrays + colvarbias::delete_features(); + colvar::delete_features(); + colvar::cvc::delete_features(); + atom_group::delete_features(); + reset(); + delete parse; parse = NULL; proxy = NULL; @@ -1261,7 +1277,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 +1293,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 +1307,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 +1408,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(); diff --git a/lib/colvars/colvarmodule.h b/lib/colvars/colvarmodule.h index 0f6efd14c4..3f13ae88cf 100644 --- a/lib/colvars/colvarmodule.h +++ b/lib/colvars/colvarmodule.h @@ -293,10 +293,13 @@ private: public: /// Return how many biases have this feature enabled - static int num_biases_feature(int feature_id); + int num_biases_feature(int feature_id) const; /// Return how many biases are defined with this type - static int num_biases_type(std::string const &type); + int num_biases_type(std::string const &type) const; + + /// Return the names of time-dependent biases with forces enabled + std::vector const time_dependent_biases() const; private: /// Useful wrapper to interrupt parsing if any error occurs @@ -334,9 +337,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 +583,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(); }; diff --git a/lib/colvars/colvarproxy.cpp b/lib/colvars/colvarproxy.cpp index fa24091d52..8160144c6b 100644 --- a/lib/colvars/colvarproxy.cpp +++ b/lib/colvars/colvarproxy.cpp @@ -10,6 +10,10 @@ #include #include +#if defined(_OPENMP) +#include +#endif + #include "colvarmodule.h" #include "colvarproxy.h" #include "colvarscript.h" @@ -40,6 +44,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 +214,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 +229,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() {} diff --git a/lib/colvars/colvarproxy.h b/lib/colvars/colvarproxy.h index 95d13cd7e0..e51ddfbe3b 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; }; diff --git a/lib/colvars/colvars_version.h b/lib/colvars/colvars_version.h index 312c0fd1a0..9dfeb17898 100644 --- a/lib/colvars/colvars_version.h +++ b/lib/colvars/colvars_version.h @@ -1,5 +1,5 @@ #ifndef COLVARS_VERSION -#define COLVARS_VERSION "2017-08-06" +#define COLVARS_VERSION "2017-10-11" // 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/lib/colvars/colvarscript.cpp b/lib/colvars/colvarscript.cpp index 89302a16a2..9570acd832 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,7 @@ int colvarscript::run(int objc, unsigned char *const objv[]) } if (objc < 2) { - result = help_string(); - return COLVARS_OK; + return exec_command(cv_help, NULL, objc, objv); } std::string const cmd(obj_to_str(objv[1])); @@ -167,17 +174,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 +201,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 +254,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; } @@ -295,7 +298,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 +379,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 +429,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; } @@ -528,7 +534,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 +544,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 +570,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.h b/lib/colvars/colvartypes.h index fe3160eb4b..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()) { 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 9ad6046a09..7b5254e480 100644 --- a/lib/gpu/.gitignore +++ b/lib/gpu/.gitignore @@ -4,3 +4,4 @@ /nvc_get_devices /*.cubin /*_cubin.h +/*_cl.h diff --git a/lib/gpu/Makefile.linux b/lib/gpu/Makefile.linux index dfcc5bf7d3..ed5b6092d3 100644 --- a/lib/gpu/Makefile.linux +++ b/lib/gpu/Makefile.linux @@ -35,7 +35,7 @@ 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 = 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 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_sw.cu b/lib/gpu/lal_sw.cu index a5c9f49d08..517de70691 100644 --- a/lib/gpu/lal_sw.cu +++ b/lib/gpu/lal_sw.cu @@ -217,7 +217,7 @@ __kernel void k_sw(const __global numtyp4 *restrict x_, if (ii /dev/null),) $(error $(KIM_CONFIG_HELPER) utility is not available. Something is wrong with your KIM API package setup) diff --git a/lib/kokkos/CHANGELOG.md b/lib/kokkos/CHANGELOG.md index 43d3f17d63..d414056187 100644 --- a/lib/kokkos/CHANGELOG.md +++ b/lib/kokkos/CHANGELOG.md @@ -1,5 +1,24 @@ # Change Log +## [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) diff --git a/lib/kokkos/Makefile.kokkos b/lib/kokkos/Makefile.kokkos index b8236e8fd1..4641232a1f 100644 --- a/lib/kokkos/Makefile.kokkos +++ b/lib/kokkos/Makefile.kokkos @@ -443,7 +443,7 @@ endif ifeq ($(KOKKOS_INTERNAL_USE_MEMKIND), 1) KOKKOS_CPPFLAGS += -I$(MEMKIND_PATH)/include KOKKOS_LDFLAGS += -L$(MEMKIND_PATH)/lib - KOKKOS_LIBS += -lmemkind + KOKKOS_LIBS += -lmemkind -lnuma tmp := $(shell echo "\#define KOKKOS_HAVE_HBWSPACE 1" >> KokkosCore_config.tmp ) endif @@ -614,9 +614,18 @@ ifeq ($(KOKKOS_INTERNAL_USE_ARCH_POWER8), 1) 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 + 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 @@ -626,9 +635,18 @@ ifeq ($(KOKKOS_INTERNAL_USE_ARCH_POWER9), 1) 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=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 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/Makefile b/lib/kokkos/algorithms/unit_tests/Makefile index b74192ef18..a5a10c82ee 100644 --- a/lib/kokkos/algorithms/unit_tests/Makefile +++ b/lib/kokkos/algorithms/unit_tests/Makefile @@ -30,6 +30,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 +57,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 +72,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/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/bin/hpcbind b/lib/kokkos/bin/hpcbind index ca34648780..b88b334f8b 100755 --- a/lib/kokkos/bin/hpcbind +++ b/lib/kokkos/bin/hpcbind @@ -27,7 +27,7 @@ fi HPCBIND_HWLOC_PARENT_CPUSET="" if [[ ${HPCBIND_HAS_HWLOC} -eq 1 ]]; then MY_PID="$BASHPID" - HPCBIND_HWLOC_PARENT_CPUSET=$(hwloc-ps --cpuset | grep "${MY_PID}" | cut -f 2) + HPCBIND_HWLOC_PARENT_CPUSET="$(hwloc-ps -a --cpuset | grep ${MY_PID} | cut -f 2)" fi ################################################################################ @@ -58,23 +58,34 @@ declare -i HPCBIND_ENABLE_GPU_MAPPING=$((NUM_GPUS > 0)) ################################################################################ HPCBIND_QUEUE_NAME="" declare -i HPCBIND_QUEUE_INDEX=0 -declare -i HPCBIND_QUEUE_GPU_MAPPING=0 +declare -i HPCBIND_QUEUE_MAPPING=0 -if [[ ! -z "${SLURM_LOCAL_ID}" ]]; then - HPCBIND_QUEUE_GPU_MAPPING=1 - HPCBIND_QUEUE_NAME="sbatch" +if [[ ! -z "${PMI_RANK}" ]]; then + HPCBIND_QUEUE_MAPPING=1 + HPCBIND_QUEUE_NAME="mpich" + HPCBIND_QUEUE_INDEX=${PMI_RANK} +elif [[ ! -z "${OMPI_COMM_WORLD_RANK}" ]]; then + HPCBIND_QUEUE_MAPPING=1 + HPCBIND_QUEUE_NAME="openmpi" + HPCBIND_QUEUE_INDEX=${OMPI_COMM_WORLD_RANK} +elif [[ ! -z "${MV2_COMM_WORLD_RANK}" ]]; then + HPCBIND_QUEUE_MAPPING=1 + HPCBIND_QUEUE_NAME="mvapich2" + HPCBIND_QUEUE_INDEX=${MV2_COMM_WORLD_RANK} +elif [[ ! -z "${SLURM_LOCAL_ID}" ]]; then + HPCBIND_QUEUE_MAPPING=1 + HPCBIND_QUEUE_NAME="slurm" HPCBIND_QUEUE_INDEX=${SLURM_LOCAL_ID} elif [[ ! -z "${LBS_JOBINDEX}" ]]; then - HPCBIND_QUEUE_GPU_MAPPING=1 + HPCBIND_QUEUE_MAPPING=1 HPCBIND_QUEUE_NAME="bsub" HPCBIND_QUEUE_INDEX=${LBS_JOBINDEX} elif [[ ! -z "${ALPS_APP_PE}" ]]; then - HPCBIND_QUEUE_GPU_MAPPING=1 + HPCBIND_QUEUE_MAPPING=1 HPCBIND_QUEUE_NAME="aprun" HPCBIND_QUEUE_INDEX=${ALPS_APP_PE} fi - ################################################################################ # Show help ################################################################################ @@ -91,13 +102,14 @@ function show_help { 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 " --gpu-ignore-queue Ignore queue job id when choosing visible GPU" + 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" @@ -110,22 +122,30 @@ function show_help { echo " --force-openmp-proc-bind=" echo " Override logic for selecting OMP_PROC_BIND" echo " --no-openmp-nested Set OMP_NESTED to false" - echo " --show-bindings Show the bindings" - echo " --lstopo Show bindings in lstopo without executing a command" - echo " -v|--verbose Show options and relevant environment variables" + echo " --output-prefix=

Save the output to files of the form" + echo " P-N.log, P-N.out and P-N.err where P is the prefix" + echo " and N is the queue index or mpi 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 " Split the current process cpuset into 4 and use the 3rd partition" echo " ${cmd} --distribute=4 --distribute-partition=2 -v -- command ..." - echo " Bing the process to all even cores" + 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 " Bind the process to all even cores" echo " ${cmd} --proc-bind=core:even -v -- command ..." - echo " Bind to the first 64 cores and split the current process cpuset into 4" - echo " ${cmd} --proc-bind=core:0-63 --distribute=4 --distribute-partition=0 -- command ..." - echo " skip GPU 0 when mapping visible devices" + 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 " Skip GPU 0 when mapping visible devices" echo " ${cmd} --distribute=4 --distribute-partition=0 --visible-gpus=1,2 -v -- command ..." echo " Display the current bindings" - echo " ${cmd} --proc-bind=numa:0 --show-bindings -- command" + echo " ${cmd} --proc-bind=numa:0 -- command" echo " Display the current bindings using lstopo" echo " ${cmd} --proc-bind=numa:0.core:odd --lstopo" echo "" @@ -144,7 +164,7 @@ fi declare -a UNKNOWN_ARGS=() declare -i HPCBIND_ENABLE_HWLOC_BIND=${HPCBIND_HAS_HWLOC} declare -i HPCBIND_DISTRIBUTE=1 -declare -i HPCBIND_PARTITION=0 +declare -i HPCBIND_PARTITION=-1 HPCBIND_PROC_BIND="all" HPCBIND_OPENMP_VERSION=4.0 declare -i HPCBIND_OPENMP_PERCENT=100 @@ -155,11 +175,15 @@ HPCBIND_OPENMP_FORCE_PROC_BIND="" HPCBIND_OPENMP_NESTED=${OMP_NESTED:-true} declare -i HPCBIND_VERBOSE=0 -declare -i HPCBIND_SHOW_BINDINGS=0 declare -i HPCBIND_LSTOPO=0 -for i in $@; do - case $i in +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 @@ -169,6 +193,10 @@ for i in $@; do HPCBIND_PROC_BIND="${i#*=}" shift ;; + --whole-system) + HPCBIND_HWLOC_PARENT_CPUSET="" + shift + ;; --distribute=*) HPCBIND_DISTRIBUTE="${i#*=}" shift @@ -182,8 +210,8 @@ for i in $@; do HPCBIND_VISIBLE_GPUS=$(echo "${i#*=}" | tr ',' ' ') shift ;; - --gpu-ignore-queue) - HPCBIND_QUEUE_GPU_MAPPING=0 + --ignore-queue) + HPCBIND_QUEUE_MAPPING=0 shift ;; --no-gpu-mapping) @@ -218,14 +246,18 @@ for i in $@; do HPCBIND_OPENMP_NESTED="false" shift ;; - --show-bindings) - HPCBIND_VERBOSE=1 - HPCBIND_SHOW_BINDINGS=1 + --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_SHOW_BINDINGS=0 HPCBIND_LSTOPO=1 shift ;; @@ -239,6 +271,7 @@ for i in $@; do ;; # ignore remaining arguments --) + HPCBIND_HAS_COMMAND=1 shift break ;; @@ -250,16 +283,41 @@ for i in $@; do 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_INDEX} -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 + HPCBIND_LOG="${HPCBIND_OUTPUT_PREFIX}-${HPCBIND_QUEUE_INDEX}.hpc.log" + HPCBIND_ERR="${HPCBIND_OUTPUT_PREFIX}-${HPCBIND_QUEUE_INDEX}.err" + HPCBIND_OUT="${HPCBIND_OUTPUT_PREFIX}-${HPCBIND_QUEUE_INDEX}.out" + > ${HPCBIND_LOG} +fi + ################################################################################ # Check unknown arguments ################################################################################ if [[ ${#UNKNOWN_ARGS[*]} > 0 ]]; then - echo "Uknown options: ${UNKNOWN_ARGS[*]}" + echo "HPCBIND Uknown options: ${UNKNOWN_ARGS[*]}" > >(tee -a ${HPCBIND_LOG}) exit 1 fi - ################################################################################ # Check that visible gpus are valid ################################################################################ @@ -268,22 +326,19 @@ 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 "Invaild GPU ID ${HPCBIND_VISIBLE_GPUS[$i]}, setting to 0" + 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 - ################################################################################ # Check OpenMP percent ################################################################################ if [[ ${HPCBIND_OPENMP_PERCENT} -lt 1 ]]; then - echo "OpenMP percent < 1, setting to 1" HPCBIND_OPENMP_PERCENT=1 elif [[ ${HPCBIND_OPENMP_PERCENT} -gt 100 ]]; then - echo "OpenMP percent > 100, setting to 100" HPCBIND_OPENMP_PERCENT=100 fi @@ -291,15 +346,21 @@ fi # Check distribute ################################################################################ if [[ ${HPCBIND_DISTRIBUTE} -le 0 ]]; then - echo "Invalid input for distribute, changing distribute to 1" HPCBIND_DISTRIBUTE=1 fi -if [[ ${HPCBIND_PARTITION} -ge ${HPCBIND_DISTRIBUTE} ]]; then - echo "Invalid input for distribute-partition, changing to 0" +################################################################################ +#choose the correct partition +################################################################################ +if [[ ${HPCBIND_PARTITION} -lt 0 && ${HPCBIND_QUEUE_MAPPING} -eq 1 ]]; then + HPCBIND_PARTITION=${HPCBIND_QUEUE_INDEX} +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 @@ -309,13 +370,17 @@ 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}) + BINDING=$(hwloc-calc ${HPCBIND_PROC_BIND[*]}) else - BINDING=$(hwloc-calc --restrict ${HPCBIND_HWLOC_PARENT_CPUSET} ${HPCBIND_PROC_BIND}) + BINDING=$(hwloc-calc --restrict ${HPCBIND_HWLOC_PARENT_CPUSET} ${HPCBIND_PROC_BIND[*]}) fi - CPUSETS=($(hwloc-distrib --restrict ${BINDING} --at core ${HPCBIND_DISTRIBUTE})) - HPCBIND_HWLOC_CPUSET=${CPUSETS[${HPCBIND_PARTITION}]} + 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-ls --restrict ${HPCBIND_HWLOC_CPUSET} --only pu | wc -l) else HPCBIND_NUM_PUS=$(cat /proc/cpuinfo | grep -c processor) @@ -373,13 +438,13 @@ export OMP_NESTED=${HPCBIND_OPENMP_NESTED} ################################################################################ if [[ ${HPCBIND_ENABLE_GPU_MAPPING} -eq 1 ]]; then - if [[ ${HPCBIND_QUEUE_GPU_MAPPING} -eq 0 ]]; 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}]} + export CUDA_VISIBLE_DEVICES="${HPCBIND_VISIBLE_GPUS[${GPU_ID}]}" else declare -i MY_TASK_ID=$((HPCBIND_QUEUE_INDEX * HPCBIND_DISTRIBUTE + HPCBIND_PARTITION)) declare -i GPU_ID=$((MY_TASK_ID % NUM_GPUS)) - export CUDA_VISIBLE_DEVICES=${HPCBIND_VISIBLE_GPUS[${GPU_ID}]} + export CUDA_VISIBLE_DEVICES="${HPCBIND_VISIBLE_GPUS[${GPU_ID}]}" fi fi @@ -389,22 +454,22 @@ fi export HPCBIND_HAS_HWLOC=${HPCBIND_HAS_HWLOC} export HPCBIND_HAS_NVIDIA=${HPCBIND_HAS_NVIDIA} export HPCBIND_NUM_PUS=${HPCBIND_NUM_PUS} -export HPCBIND_HWLOC_CPUSET=${HPCBIND_HWLOC_CPUSET} +export HPCBIND_HWLOC_CPUSET="${HPCBIND_HWLOC_CPUSET}" export HPCBIND_HWLOC_DISTRIBUTE=${HPCBIND_DISTRIBUTE} export HPCBIND_HWLOC_DISTRIBUTE_PARTITION=${HPCBIND_PARTITION} if [[ "${HPCBIND_HWLOC_PARENT_CPUSET}" == "" ]]; then export HPCBIND_HWLOC_PARENT_CPUSET="all" else - export HPCBIND_HWLOC_PARENT_CPUSET=${HPCBIND_HWLOC_PARENT_CPUSET} + export HPCBIND_HWLOC_PARENT_CPUSET="${HPCBIND_HWLOC_PARENT_CPUSET}" fi -export HPCBIND_HWLOC_PROC_BIND=${HPCBIND_PROC_BIND} +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} +export HPCBIND_OPENMP_VERSION="${HPCBIND_OPENMP_VERSION}" if [[ "${HPCBIND_QUEUE_NAME}" != "" ]]; then export HPCBIND_QUEUE_INDEX=${HPCBIND_QUEUE_INDEX} - export HPCBIND_QUEUE_NAME=${HPCBIND_QUEUE_NAME} - export HPCBIND_QUEUE_GPU_MAPPING=${HPCBIND_QUEUE_GPU_MAPPING} + export HPCBIND_QUEUE_NAME="${HPCBIND_QUEUE_NAME}" + export HPCBIND_QUEUE_MAPPING=${HPCBIND_QUEUE_MAPPING} fi @@ -412,43 +477,63 @@ fi # Print verbose ################################################################################ -if [[ ${HPCBIND_VERBOSE} -eq 1 ]]; then - MY_ENV=$(env | sort) - echo "[HPCBIND]" - echo "${MY_ENV}" | grep -E "^HPCBIND_" - echo "[CUDA]" - echo "${MY_ENV}" | grep -E "^CUDA_" - echo "[OPENMP]" - echo "${MY_ENV}" | grep -E "^OMP_" -fi +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} -if [[ ${HPCBIND_HAS_HWLOC} -eq 1 && ${HPCBIND_SHOW_BINDINGS} -eq 1 ]]; then - echo "[BINDINGS]" - hwloc-ls --restrict ${HPCBIND_HWLOC_CPUSET} --only pu -elif [[ ${HPCBIND_SHOW_BINDINGS} -eq 1 ]]; then - echo "Unable to show bindings, hwloc not available." + if [[ ${HPCBIND_HAS_HWLOC} -eq 1 ]]; then + echo "[BINDINGS]" >> ${HPCBIND_LOG} + hwloc-ls --restrict "${HPCBIND_HWLOC_CPUSET}" --only pu >> ${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}) + + if [[ ${HPCBIND_HAS_HWLOC} -eq 1 ]]; then + echo "[BINDINGS]" > >(tee -a ${HPCBIND_LOG}) + hwloc-ls --restrict "${HPCBIND_HWLOC_CPUSET}" --only pu > >(tee -a ${HPCBIND_LOG}) + else + echo "Unable to show bindings, hwloc not available." > >(tee -a ${HPCBIND_LOG}) + fi fi ################################################################################ # Run command ################################################################################ -if [[ ${HPCBIND_LSTOPO} -eq 0 ]]; then - if [[ ${HPCBIND_ENABLE_HWLOC_BIND} -eq 1 ]]; then - hwloc-bind ${HPCBIND_HWLOC_CPUSET} -- $@ - else - eval $@ - fi -else - if [[ ${HPCBIND_HAS_HWLOC} -eq 1 ]]; then - if [[ ${HPCBIND_ENABLE_HWLOC_BIND} -eq 1 && ! -z ${DISPLAY} ]]; then - echo "[BINDINGS]" - hwloc-ls --restrict ${HPCBIND_HWLOC_CPUSET} --only pu - hwloc-bind ${HPCBIND_HWLOC_CPUSET} -- lstopo --pid 0 +# 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 - hwloc-ls --restrict ${HPCBIND_HWLOC_CPUSET} + eval $@ > ${HPCBIND_OUT} 2> ${HPCBIND_ERR} fi else - echo "Unable to show bindings, hwloc not available." + 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/kokkos-bind b/lib/kokkos/bin/kokkos-bind deleted file mode 100755 index b6fe07a1bd..0000000000 --- a/lib/kokkos/bin/kokkos-bind +++ /dev/null @@ -1,221 +0,0 @@ -#!/usr/bin/env bash - -# check if hwloc commands exist -declare -i HAS_HWLOC=0 -type hwloc-bind >/dev/null 2>&1 -HAS_HWLOC="${HAS_HWLOC} + $?" - -type hwloc-distrib >/dev/null 2>&1 -HAS_HWLOC="${HAS_HWLOC} + $?" - -type hwloc-ls >/dev/null 2>&1 -HAS_HWLOC="${HAS_HWLOC} + $?" - -type hwloc-calc >/dev/null 2>&1 -HAS_HWLOC="${HAS_HWLOC} + $?" - -type hwloc-ps >/dev/null 2>&1 -HAS_HWLOC="${HAS_HWLOC} + $?" - - -#parse args -declare -a UNKNOWN_ARGS=() -declare -i DISTRIBUTE=1 -declare -i INDEX=0 -PROC_BIND="all" -CURRENT_CPUSET="" -OPENMP_VERSION=4.0 -OPENMP_PROC_BIND=True -OPENMP_NESTED=True -VERBOSE=False - -#get the current process cpuset -if [[ ${HAS_HWLOC} -eq 0 ]]; then - MY_PID="$BASHPID" - CURRENT_CPUSET=$(hwloc-ps --cpuset | grep "${MY_PID}" | cut -f 2) - echo "$CURRENT_CPUSET" -fi - -function show_help { - local cmd=$(basename "$0") - echo "Usage: ${cmd} -- command ..." - echo " Uses hwloc to divide the node into the given number of groups," - echo " set the appropriate OMP_NUM_THREADS and execute the command on the" - echo " selected group." - echo "" - echo " NOTE: This command assumes it has exclusive use of the node" - echo "" - echo "Options:" - echo " --proc-bind= Set the initial process mask for the script. " - echo " LOC can be any valid location argumnet for" - echo " hwloc-calc. Defaults to the entire machine" - echo " --distribute=N Distribute the current proc-bind into N groups" - echo " --index=I Use the i'th group (zero based)" - echo " --openmp=M.m Set env variables for the given OpenMP version" - echo " (default 4.0)" - echo " --no-openmp-proc-bind Set OMP_PROC_BIND to false and unset OMP_PLACES" - echo " --no-openmp-nested Set OMP_NESTED to false" - echo " -v|--verbose" - echo " -h|--help" - echo "" - echo "Sample Usage:" - echo " ${cmd} --distribute=4 --index=2 -v -- command ..." - echo "" -} - -if [[ "$#" -eq 0 ]]; then - show_help - exit 0 -fi - - -for i in $@; do - case $i in - # number of partitions to create - --proc-bind=*) - PROC_BIND="${i#*=}" - shift - ;; - --distribute=*) - DISTRIBUTE="${i#*=}" - shift - ;; - # which group to use - --index=*) - INDEX="${i#*=}" - shift - ;; - --openmp=*) - OPENMP_VERSION="${i#*=}" - shift - ;; - --no-openmp-proc-bind) - OPENMP_PROC_BIND=False - shift - ;; - --no-openmp-nested) - OPENMP_NESTED=False - shift - ;; - -v|--verbose) - VERBOSE=True - shift - ;; - -h|--help) - show_help - exit 0 - ;; - # ignore remaining arguments - --) - shift - break - ;; - # unknown option - *) - UNKNOWN_ARGS+=("$i") - shift - ;; - esac -done - -if [[ ${#UNKNOWN_ARGS[*]} > 0 ]]; then - echo "Uknown options: ${UNKNOWN_ARGS[*]}" - exit 1 -fi - -if [[ ${DISTRIBUTE} -le 0 ]]; then - echo "Invalid input for distribute, changing distribute to 1" - DISTRIBUTE=1 -fi - -if [[ ${INDEX} -ge ${DISTRIBUTE} ]]; then - echo "Invalid input for index, changing index to 0" - INDEX=0 -fi - -if [[ ${HAS_HWLOC} -ne 0 ]]; then - echo "hwloc not found, no process binding will occur" - DISTRIBUTE=1 - INDEX=0 -fi - -if [[ ${HAS_HWLOC} -eq 0 ]]; then - - if [[ "${CURRENT_CPUSET}" == "" ]]; then - BINDING=$(hwloc-calc ${PROC_BIND}) - else - BINDING=$(hwloc-calc --restrict ${CURRENT_CPUSET} ${PROC_BIND}) - fi - - CPUSETS=($(hwloc-distrib --restrict ${BINDING} --at core ${DISTRIBUTE})) - CPUSET=${CPUSETS[${INDEX}]} - NUM_THREADS=$(hwloc-ls --restrict ${CPUSET} --only pu | wc -l) - - if [[ "${VERBOSE}" == "True" ]]; then - echo "hwloc: true" - echo " proc_bind: ${PROC_BIND}" - echo " distribute: ${DISTRIBUTE}" - echo " index: ${INDEX}" - echo " parent_cpuset: ${CURRENT_CPUSET}" - echo " cpuset: ${CPUSET}" - echo "omp_num_threads: ${NUM_THREADS}" - echo "omp_proc_bind: ${OPENMP_PROC_BIND}" - echo "omp_nested: ${OPENMP_NESTED}" - echo "OpenMP: ${OPENMP_VERSION}" - fi - - # set OMP env - if [[ "${OPENMP_PROC_BIND}" == "True" ]]; then - if [[ "${OPENMP_VERSION}" == "4.0" || "${OPENMP_VERSION}" > "4.0" ]]; then - export OMP_PLACES="threads" - export OMP_PROC_BIND="spread" - else - export OMP_PROC_BIND="true" - unset OMP_PLACES - fi - else - unset OMP_PLACES - unset OMP_PROC_BIND - fi - if [[ "${OPENMP_NESTED}" == "True" ]]; then - export OMP_NESTED="true" - else - export OMP_NESTED="false" - fi - export OMP_NUM_THREADS="${NUM_THREADS}" - - hwloc-bind ${CPUSET} -- $@ -else - NUM_THREADS=$(cat /proc/cpuinfo | grep -c processor) - - if [[ "${VERBOSE}" == "True" ]]; then - echo "hwloc: false" - echo "omp_num_threads: ${NUM_THREADS}" - echo "omp_proc_bind: ${OPENMP_PROC_BIND}" - echo "omp_nested: ${OPENMP_NESTED}" - echo "OpenMP: ${OPENMP_VERSION}" - fi - - # set OMP env - if [[ "${OPENMP_PROC_BIND}" == "True" ]]; then - if [[ "${OPENMP_VERSION}" == "4.0" || "${OPENMP_VERSION}" > "4.0" ]]; then - export OMP_PLACES="threads" - export OMP_PROC_BIND="spread" - else - export OMP_PROC_BIND="true" - unset OMP_PLACES - fi - else - unset OMP_PLACES - unset OMP_PROC_BIND - fi - if [[ "${OPENMP_NESTED}" == "True" ]]; then - export OMP_NESTED="true" - else - export OMP_NESTED="false" - fi - export OMP_NUM_THREADS="${NUM_THREADS}" - - eval $@ -fi - diff --git a/lib/kokkos/bin/nvcc_wrapper b/lib/kokkos/bin/nvcc_wrapper index 09fa5d500a..76e33f3c66 100755 --- a/lib/kokkos/bin/nvcc_wrapper +++ b/lib/kokkos/bin/nvcc_wrapper @@ -78,6 +78,9 @@ 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 + #echo "Arguments: $# $@" while [ $# -gt 0 ] @@ -130,10 +133,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) ;; diff --git a/lib/kokkos/config/master_history.txt b/lib/kokkos/config/master_history.txt index 96b05c02e1..6f9ca897d9 100644 --- a/lib/kokkos/config/master_history.txt +++ b/lib/kokkos/config/master_history.txt @@ -9,3 +9,4 @@ 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 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/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/core/src/Cuda/KokkosExp_Cuda_IterateTile_Refactor.hpp b/lib/kokkos/core/src/Cuda/KokkosExp_Cuda_IterateTile_Refactor.hpp index 46321378d9..c184c14d07 100644 --- a/lib/kokkos/core/src/Cuda/KokkosExp_Cuda_IterateTile_Refactor.hpp +++ b/lib/kokkos/core/src/Cuda/KokkosExp_Cuda_IterateTile_Refactor.hpp @@ -91,11 +91,11 @@ struct DeviceIterateTile<2,RP,Functor,void > // 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; + 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; + 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); } @@ -106,11 +106,11 @@ struct DeviceIterateTile<2,RP,Functor,void > // 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; + 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; + 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); } @@ -143,11 +143,11 @@ struct DeviceIterateTile<2,RP,Functor,Tag> 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; + 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; + 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); } @@ -157,11 +157,11 @@ struct DeviceIterateTile<2,RP,Functor,Tag> } 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; + 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; + 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); } @@ -196,15 +196,15 @@ struct DeviceIterateTile<3,RP,Functor,void > // 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; + 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; + 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; + 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); } @@ -217,15 +217,15 @@ struct DeviceIterateTile<3,RP,Functor,void > // 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; + 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; + 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; + 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); } @@ -259,15 +259,15 @@ struct DeviceIterateTile<3,RP,Functor,Tag> { 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; + 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; + 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; + 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); } @@ -279,15 +279,15 @@ struct DeviceIterateTile<3,RP,Functor,Tag> } 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; + 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; + 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; + 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); } @@ -340,19 +340,19 @@ struct DeviceIterateTile<4,RP,Functor,void > 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; + 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; + 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; + 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); } @@ -378,19 +378,19 @@ struct DeviceIterateTile<4,RP,Functor,void > 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; + 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 = (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; + 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; + 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); } @@ -442,19 +442,19 @@ struct DeviceIterateTile<4,RP,Functor,Tag> 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; + 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; + 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; + 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); } @@ -479,19 +479,19 @@ struct DeviceIterateTile<4,RP,Functor,Tag> 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; + 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 = (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; + 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; + 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); } @@ -558,23 +558,23 @@ struct DeviceIterateTile<5,RP,Functor,void > 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; + 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; + 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); } @@ -613,23 +613,23 @@ struct DeviceIterateTile<5,RP,Functor,void > 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; + 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 = (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; + 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); } @@ -695,23 +695,23 @@ struct DeviceIterateTile<5,RP,Functor,Tag> 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; + 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; + 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); } @@ -750,23 +750,23 @@ struct DeviceIterateTile<5,RP,Functor,Tag> 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; + 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 = (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; + 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); } @@ -845,27 +845,27 @@ struct DeviceIterateTile<6,RP,Functor,void > 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; + 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); } @@ -917,27 +917,27 @@ struct DeviceIterateTile<6,RP,Functor,void > 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; + 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); } @@ -1016,27 +1016,27 @@ struct DeviceIterateTile<6,RP,Functor,Tag> 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; + 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); } @@ -1088,27 +1088,27 @@ struct DeviceIterateTile<6,RP,Functor,Tag> 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; + 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); } diff --git a/lib/kokkos/core/src/Cuda/Kokkos_CudaExec.hpp b/lib/kokkos/core/src/Cuda/Kokkos_CudaExec.hpp index cae8ecd489..079d9f0889 100644 --- a/lib/kokkos/core/src/Cuda/Kokkos_CudaExec.hpp +++ b/lib/kokkos/core/src/Cuda/Kokkos_CudaExec.hpp @@ -164,7 +164,7 @@ static void cuda_parallel_launch_constant_memory() template< class DriverType, unsigned int maxTperB, unsigned int minBperSM > __global__ -__launch_bounds__(maxTperB, minBperSM) +//__launch_bounds__(maxTperB, minBperSM) static void cuda_parallel_launch_constant_memory() { const DriverType & driver = @@ -182,7 +182,7 @@ static void cuda_parallel_launch_local_memory( const DriverType driver ) template< class DriverType, unsigned int maxTperB, unsigned int minBperSM > __global__ -__launch_bounds__(maxTperB, minBperSM) +//__launch_bounds__(maxTperB, minBperSM) static void cuda_parallel_launch_local_memory( const DriverType driver ) { driver(); diff --git a/lib/kokkos/core/src/Kokkos_Complex.hpp b/lib/kokkos/core/src/Kokkos_Complex.hpp index 26b47a8b74..f8355f0d06 100644 --- a/lib/kokkos/core/src/Kokkos_Complex.hpp +++ b/lib/kokkos/core/src/Kokkos_Complex.hpp @@ -242,45 +242,89 @@ public: 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; @@ -288,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; @@ -297,20 +345,70 @@ 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 = 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. @@ -334,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. @@ -396,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. @@ -428,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. @@ -446,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. @@ -539,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 = std::fabs (real (y)) + std::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; } @@ -574,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. @@ -592,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_Crs.hpp b/lib/kokkos/core/src/Kokkos_Crs.hpp index f089c16ad2..b9c131cd7a 100644 --- a/lib/kokkos/core/src/Kokkos_Crs.hpp +++ b/lib/kokkos/core/src/Kokkos_Crs.hpp @@ -353,7 +353,14 @@ struct CountAndFill { struct Fill {}; KOKKOS_INLINE_FUNCTION void operator()(Fill, size_type i) const { auto j = m_crs.row_map(i); - data_type* fill = &(m_crs.entries(j)); + /* 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); } using self_type = CountAndFill; diff --git a/lib/kokkos/core/src/Kokkos_HBWSpace.hpp b/lib/kokkos/core/src/Kokkos_HBWSpace.hpp index 9c9af0dd8b..b811751a2c 100644 --- a/lib/kokkos/core/src/Kokkos_HBWSpace.hpp +++ b/lib/kokkos/core/src/Kokkos_HBWSpace.hpp @@ -147,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_NumericTraits.hpp b/lib/kokkos/core/src/Kokkos_NumericTraits.hpp index 339571941d..a825fd54d3 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,7 +200,7 @@ 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;} }; @@ -208,7 +208,7 @@ 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;} }; diff --git a/lib/kokkos/core/src/Kokkos_ROCm.hpp b/lib/kokkos/core/src/Kokkos_ROCm.hpp index b13b0b01de..0118d4667e 100644 --- a/lib/kokkos/core/src/Kokkos_ROCm.hpp +++ b/lib/kokkos/core/src/Kokkos_ROCm.hpp @@ -211,6 +211,24 @@ struct VerifyExecutionCanAccessMemorySpace } // 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 diff --git a/lib/kokkos/core/src/Makefile b/lib/kokkos/core/src/Makefile index 8fb13b8954..a917cf1656 100644 --- a/lib/kokkos/core/src/Makefile +++ b/lib/kokkos/core/src/Makefile @@ -88,6 +88,7 @@ build-makefile-kokkos: echo "KOKKOS_SRC = $(KOKKOS_SRC)" >> Makefile.kokkos echo "" >> Makefile.kokkos echo "#Variables used in application Makefiles" >> Makefile.kokkos + echo "KOKKOS_OS = $(KOKKOS_OS)" >> 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 diff --git a/lib/kokkos/core/src/OpenMP/Kokkos_OpenMP_Exec.hpp b/lib/kokkos/core/src/OpenMP/Kokkos_OpenMP_Exec.hpp index 37d2ac8318..de84f6e59f 100644 --- a/lib/kokkos/core/src/OpenMP/Kokkos_OpenMP_Exec.hpp +++ b/lib/kokkos/core/src/OpenMP/Kokkos_OpenMP_Exec.hpp @@ -211,6 +211,7 @@ void OpenMP::partition_master( F const& f , thread_local_bytes ); + omp_set_num_threads(partition_size); f( omp_get_thread_num(), omp_get_num_threads() ); Impl::t_openmp_instance->~Exec(); diff --git a/lib/kokkos/core/src/ROCm/Kokkos_ROCm_Reduce.hpp b/lib/kokkos/core/src/ROCm/Kokkos_ROCm_Reduce.hpp index 0b7a1e2583..f2674e5929 100644 --- a/lib/kokkos/core/src/ROCm/Kokkos_ROCm_Reduce.hpp +++ b/lib/kokkos/core/src/ROCm/Kokkos_ROCm_Reduce.hpp @@ -113,7 +113,6 @@ void reduce_enqueue( if (output_length < 1) return; - assert(output_result != nullptr); 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 @@ -176,14 +175,17 @@ void reduce_enqueue( } }); - ValueInit::init(ReducerConditional::select(f, reducer), output_result); + if (output_result != nullptr) + ValueInit::init(ReducerConditional::select(f, reducer), output_result); fut.wait(); copy(result,result_cpu.data()); - for(std::size_t i=0;i result(td.num_tiles); hc::array scratch(len); - tile_for(td, [&,len,td](hc::tiled_index<1> t_idx, tile_buffer buffer) [[hc]] + 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]; @@ -135,7 +135,7 @@ void scan_enqueue( ValueJoin::join(f, &result_cpu[i], &result_cpu[i-1]); copy(result_cpu.data(),result); - hc::parallel_for_each(hc::extent<1>(len).tile(td.tile_size), [&,len,td](hc::tiled_index<1> t_idx) [[hc]] + hc::parallel_for_each(hc::extent<1>(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]; diff --git a/lib/kokkos/core/src/impl/Kokkos_BitOps.hpp b/lib/kokkos/core/src/impl/Kokkos_BitOps.hpp index 3d3029535e..c5e73c8b26 100644 --- a/lib/kokkos/core/src/impl/Kokkos_BitOps.hpp +++ b/lib/kokkos/core/src/impl/Kokkos_BitOps.hpp @@ -68,6 +68,8 @@ int bit_first_zero( unsigned i ) noexcept 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 @@ -90,17 +92,16 @@ int bit_scan_forward( unsigned i ) 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 } @@ -116,17 +117,16 @@ int bit_scan_reverse( unsigned i ) 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 } @@ -142,6 +142,8 @@ int bit_count( unsigned i ) 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_HBWSpace.cpp b/lib/kokkos/core/src/impl/Kokkos_HBWSpace.cpp index e11f8b6d34..cd0553218d 100644 --- a/lib/kokkos/core/src/impl/Kokkos_HBWSpace.cpp +++ b/lib/kokkos/core/src/impl/Kokkos_HBWSpace.cpp @@ -166,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/unit_test/TestComplex.hpp b/lib/kokkos/core/unit_test/TestComplex.hpp index ce5537fed3..c7f681699e 100644 --- a/lib/kokkos/core/unit_test/TestComplex.hpp +++ b/lib/kokkos/core/unit_test/TestComplex.hpp @@ -114,7 +114,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 +125,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 +148,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 @@ -190,6 +197,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/TestMDRange.hpp b/lib/kokkos/core/unit_test/TestMDRange.hpp index f579ddf02c..fbc3a65c2f 100644 --- a/lib/kokkos/core/unit_test/TestMDRange.hpp +++ b/lib/kokkos/core/unit_test/TestMDRange.hpp @@ -286,7 +286,9 @@ struct TestMDRange_2D { // Test with reducers - scalar { typedef typename Kokkos::Experimental::MDRangePolicy< ExecSpace, Rank<2>, Kokkos::IndexType > range_type; - range_type range( {{ 0, 0 }}, {{ N0, N1 }}, {{ 3, 3 }} ); + int s0 = 1; + int s1 = 1; + range_type range( {{ s0, s1 }}, {{ N0, N1 }}, {{ 3, 3 }} ); TestMDRange_2D functor( N0, N1 ); @@ -297,7 +299,7 @@ struct TestMDRange_2D { parallel_reduce( range, functor, reducer_scalar ); - ASSERT_EQ( sum, 2 * N0 * N1 ); + ASSERT_EQ( sum, 2 * (N0 - s0) * (N1 - s1) ); } // Test with reducers - scalar view { @@ -445,7 +447,9 @@ 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 ); parallel_for( range, functor ); @@ -454,8 +458,8 @@ struct TestMDRange_2D { 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; @@ -463,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 ); @@ -699,6 +703,7 @@ struct TestMDRange_2D { ASSERT_EQ( counter, 0 ); } + } // end test_for2 }; // MDRange_2D @@ -749,7 +754,10 @@ 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 ); @@ -757,7 +765,7 @@ struct TestMDRange_3D { double sum = 0.0; parallel_reduce( range, functor, sum ); - ASSERT_EQ( sum, 2 * N0 * N1 * N2 ); + ASSERT_EQ( sum, 2 * (N0 - s0) * (N1 - s1) * (N2 - s2) ); } // Test with reducers - scalar @@ -952,7 +960,10 @@ 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 ); parallel_for( range, functor ); @@ -961,9 +972,9 @@ struct TestMDRange_3D { 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; @@ -971,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 ); @@ -1207,7 +1218,11 @@ 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, 3, 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, 3, 3, 3 } } ); TestMDRange_4D functor( N0, N1, N2, N3 ); @@ -1215,7 +1230,7 @@ struct TestMDRange_4D { double sum = 0.0; parallel_reduce( range, functor, sum ); - ASSERT_EQ( sum, 2 * N0 * N1 * N2 * N3 ); + ASSERT_EQ( sum, 2 * (N0 - s0) * (N1 - s1) * (N2 - s2) * (N3 - s3) ); } // Test with reducers - scalar @@ -1415,7 +1430,11 @@ 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 ); parallel_for( range, functor ); @@ -1424,10 +1443,10 @@ struct TestMDRange_4D { 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; @@ -1435,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 ); @@ -1682,7 +1701,12 @@ 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, 3 } } ); + 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 ); @@ -1690,7 +1714,7 @@ struct TestMDRange_5D { double sum = 0.0; parallel_reduce( range, functor, sum ); - ASSERT_EQ( sum, 2 * N0 * N1 * N2 * N3 * N4 ); + ASSERT_EQ( sum, 2 * (N0 - s0) * (N1 - s1) * (N2 - s2) * (N3 - s3) * (N4 - s4) ); } // Test with reducers - scalar @@ -1810,7 +1834,12 @@ 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, 5 } } ); + 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 ); parallel_for( range, functor ); @@ -1819,11 +1848,11 @@ struct TestMDRange_5D { 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; @@ -1831,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 ); @@ -2084,7 +2113,13 @@ 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, 3, 2 } } ); + 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 ); @@ -2092,7 +2127,7 @@ struct TestMDRange_6D { double sum = 0.0; parallel_reduce( range, functor, sum ); - ASSERT_EQ( sum, 2 * N0 * N1 * N2 * N3 * N4 * N5 ); + ASSERT_EQ( sum, 2 * (N0 - s0) * (N1 - s1) * (N2 - s2) * (N3 - s3) * (N4 - s4) * (N5 - s5) ); } // Test with reducers - scalar @@ -2214,7 +2249,13 @@ 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 ); parallel_for( range, functor ); @@ -2223,12 +2264,12 @@ struct TestMDRange_6D { 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; @@ -2236,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 ); 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.mpi b/lib/latte/Makefile.lammps.mpi new file mode 120000 index 0000000000..6017d01535 --- /dev/null +++ b/lib/latte/Makefile.lammps.mpi @@ -0,0 +1 @@ +Makefile.lammps.gfortran \ 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..6017d01535 --- /dev/null +++ b/lib/latte/Makefile.lammps.serial @@ -0,0 +1 @@ +Makefile.lammps.gfortran \ No newline at end of file diff --git a/lib/latte/README b/lib/latte/README new file mode 100644 index 0000000000..bfa91e62cd --- /dev/null +++ b/lib/latte/README @@ -0,0 +1,55 @@ +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 soft 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 + +4. Choose a Makefile.lammps.* file appropriate for your compiler + (GNU gfortran or Intel ifort) 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" files 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/voronoi/README b/lib/voronoi/README index 2ca11c9221..9c20eff813 100644 --- a/lib/voronoi/README +++ b/lib/voronoi/README @@ -21,7 +21,7 @@ Instructions: tarball either in this /lib/voronoi directory or somewhere else on your system. -2. compile Voro++ from within its home directory +2. Compile Voro++ from within its home directory % make 3. There is no need to install Voro++ if you only wish 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/python/lammps.py b/python/lammps.py index a512efdcda..944eaeabf5 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 @@ -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,48 @@ 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 extract_atom_iarray(self, name, nelem, dim=1): + if dim == 1: + tmp = self.lmp.extract_atom(name, 0) + ptr = cast(tmp, POINTER(c_int * nelem)) + else: + tmp = self.lmp.extract_atom(name, 1) + ptr = cast(tmp[0], POINTER(c_int * nelem * dim)) + + a = np.frombuffer(ptr.contents, dtype=np.intc) + 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): @@ -804,6 +861,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 5513386b1c..8d99776096 100644 --- a/src/.gitignore +++ b/src/.gitignore @@ -46,6 +46,7 @@ /colvarproxy_lammps.cpp /colvarproxy_lammps.h +/colvarproxy_lammps_version.h /fix_colvars.cpp /fix_colvars.h /dump_molfile.cpp @@ -102,6 +103,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 @@ -184,6 +194,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 @@ -404,6 +416,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 @@ -502,6 +516,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 @@ -958,6 +974,8 @@ /temper.h /temper_grem.cpp /temper_grem.h +/temper_npt.cpp +/temper_npt.h /thr_data.cpp /thr_data.h /verlet_split.cpp 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/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..e1c812ebc2 100644 --- a/src/Depend.sh +++ b/src/Depend.sh @@ -115,6 +115,14 @@ if (test $1 = "USER-CGSDK") then 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/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..df5fc3e5f1 100644 --- a/src/KOKKOS/Install.sh +++ b/src/KOKKOS/Install.sh @@ -49,8 +49,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 +81,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 +95,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 +105,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 @@ -124,8 +140,12 @@ action npair_copy_kokkos.cpp action npair_copy_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 +164,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,6 +211,8 @@ 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_sw_kokkos.cpp pair_sw.cpp @@ -191,6 +221,8 @@ 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 @@ -199,6 +231,8 @@ action pair_tersoff_zbl_kokkos.cpp pair_tersoff_zbl.cpp action pair_tersoff_zbl_kokkos.h pair_tersoff_zbl.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 verlet_kokkos.cpp diff --git a/src/KOKKOS/angle_charmm_kokkos.cpp b/src/KOKKOS/angle_charmm_kokkos.cpp index 8dd22022d8..401a00c856 100644 --- a/src/KOKKOS/angle_charmm_kokkos.cpp +++ b/src/KOKKOS/angle_charmm_kokkos.cpp @@ -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/atom_kokkos.cpp b/src/KOKKOS/atom_kokkos.cpp index 577eff2364..31b33dbdc9 100644 --- a/src/KOKKOS/atom_kokkos.cpp +++ b/src/KOKKOS/atom_kokkos.cpp @@ -49,6 +49,7 @@ AtomKokkos::~AtomKokkos() memory->destroy_kokkos(k_radius, radius); memory->destroy_kokkos(k_rmass, rmass); memory->destroy_kokkos(k_omega, omega); + memory->destroy_kokkos(k_angmom, angmom); memory->destroy_kokkos(k_torque, torque); memory->destroy_kokkos(k_nspecial, nspecial); @@ -73,6 +74,19 @@ AtomKokkos::~AtomKokkos() memory->destroy_kokkos(k_improper_atom2, improper_atom2); memory->destroy_kokkos(k_improper_atom3, improper_atom3); memory->destroy_kokkos(k_improper_atom4, improper_atom4); + + // USER-DPD package + memory->destroy_kokkos(k_uCond,uCond); + memory->destroy_kokkos(k_uMech,uMech); + memory->destroy_kokkos(k_uChem,uChem); + memory->destroy_kokkos(k_uCG,uCG); + memory->destroy_kokkos(k_uCGnew,uCGnew); + memory->destroy_kokkos(k_rho,rho); + memory->destroy_kokkos(k_dpdTheta,dpdTheta); + memory->destroy_kokkos(k_duChem,duChem); + + memory->destroy_kokkos(k_dvector,dvector); + dvector = NULL; } /* ---------------------------------------------------------------------- */ @@ -227,6 +241,63 @@ void AtomKokkos::grow(unsigned int 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); + memory->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 { + //memory->destroy_kokkos(dvector); + dvector[index] = NULL; + delete [] dname[index]; + dname[index] = NULL; + } +} + /* ---------------------------------------------------------------------- */ void AtomKokkos::deallocate_topology() 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..05414cf2e4 100644 --- a/src/KOKKOS/atom_vec_angle_kokkos.cpp +++ b/src/KOKKOS/atom_vec_angle_kokkos.cpp @@ -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..6c610c8c11 100644 --- a/src/KOKKOS/atom_vec_atomic_kokkos.cpp +++ b/src/KOKKOS/atom_vec_atomic_kokkos.cpp @@ -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..076144420c 100644 --- a/src/KOKKOS/atom_vec_bond_kokkos.cpp +++ b/src/KOKKOS/atom_vec_bond_kokkos.cpp @@ -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..7b8b74b405 100644 --- a/src/KOKKOS/atom_vec_charge_kokkos.cpp +++ b/src/KOKKOS/atom_vec_charge_kokkos.cpp @@ -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..c4e493bd85 --- /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.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); + + 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"); + + 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"); + + + memory->grow_kokkos(atomKK->k_rho,atomKK->rho,nmax,"atom:rho"); + memory->grow_kokkos(atomKK->k_dpdTheta,atomKK->dpdTheta,nmax,"atom:dpdTheta"); + memory->grow_kokkos(atomKK->k_uCond,atomKK->uCond,nmax,"atom:uCond"); + memory->grow_kokkos(atomKK->k_uMech,atomKK->uMech,nmax,"atom:uMech"); + memory->grow_kokkos(atomKK->k_uChem,atomKK->uChem,nmax,"atom:uChem"); + memory->grow_kokkos(atomKK->k_uCG,atomKK->uCG,nmax,"atom:uCG"); + memory->grow_kokkos(atomKK->k_uCGnew,atomKK->uCGnew,nmax,"atom:uCGnew"); + memory->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..8e9abe4067 100644 --- a/src/KOKKOS/atom_vec_full_kokkos.cpp +++ b/src/KOKKOS/atom_vec_full_kokkos.cpp @@ -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..e5e361e70a --- /dev/null +++ b/src/KOKKOS/atom_vec_hybrid_kokkos.cpp @@ -0,0 +1,1218 @@ +/* ---------------------------------------------------------------------- + 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.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"); +} +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"); +} +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"); +} +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"); +} +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"); +} + +/* ---------------------------------------------------------------------- */ + +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..dbf6a857b2 100644 --- a/src/KOKKOS/atom_vec_molecular_kokkos.cpp +++ b/src/KOKKOS/atom_vec_molecular_kokkos.cpp @@ -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_fene_kokkos.cpp b/src/KOKKOS/bond_fene_kokkos.cpp index 025838340b..8a716a98ef 100644 --- a/src/KOKKOS/bond_fene_kokkos.cpp +++ b/src/KOKKOS/bond_fene_kokkos.cpp @@ -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/comm_kokkos.cpp b/src/KOKKOS/comm_kokkos.cpp index f38a6c21c9..5534341342 100644 --- a/src/KOKKOS/comm_kokkos.cpp +++ b/src/KOKKOS/comm_kokkos.cpp @@ -46,7 +46,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 +58,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; @@ -102,8 +103,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 +135,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 +179,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 +186,29 @@ 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]); - 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"); @@ -248,21 +250,93 @@ 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); + 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); + } 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(); @@ -379,8 +453,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 +482,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 +490,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 +504,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 +562,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 +573,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,26 +589,25 @@ 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); - DeviceType::fence(); } else { while (i < nlocal) { @@ -559,7 +632,6 @@ void CommKokkos::exchange_device() atom->nlocal=avec-> unpack_exchange_kokkos(k_buf_send,nrecv,atom->nlocal,dim,lo,hi, ExecutionSpaceFromDevice::space); - DeviceType::fence(); } } else { MPI_Sendrecv(&nsend,1,MPI_INT,procneigh[dim][0],0, @@ -592,7 +664,6 @@ void CommKokkos::exchange_device() atom->nlocal = avec-> unpack_exchange_kokkos(k_buf_recv,nrecv,atom->nlocal,dim,lo,hi, ExecutionSpaceFromDevice::space); - DeviceType::fence(); } } @@ -623,6 +694,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 +714,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 +731,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 +756,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 +785,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 +835,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"); @@ -908,11 +989,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 +1035,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 +1049,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,6 +1062,11 @@ void CommKokkos::grow_list(int iswap, int n) { int size = static_cast (BUFFACTOR * n); + if (exchange_comm_classic) { // force realloc on Host + k_sendlist.sync(); + k_sendlist.modify(); + } + memory->grow_kokkos(k_sendlist,sendlist,maxswap,size,"comm:sendlist"); for(int i=0;i(); + k_sendlist.modify(); + } + memory->grow_kokkos(k_sendlist,sendlist,maxswap,size,"comm:sendlist"); memory->grow(maxsendlist,n,"comm:maxsendlist"); diff --git a/src/KOKKOS/comm_kokkos.h b/src/KOKKOS/comm_kokkos.h index 71d5e59595..f137655cb8 100644 --- a/src/KOKKOS/comm_kokkos.h +++ b/src/KOKKOS/comm_kokkos.h @@ -25,15 +25,17 @@ class CommKokkos : public CommBrick { bool exchange_comm_classic; bool forward_comm_classic; + bool reverse_comm_classic; bool exchange_comm_on_host; bool forward_comm_on_host; + bool reverse_comm_on_host; CommKokkos(class LAMMPS *); ~CommKokkos(); void init(); void forward_comm(int dummy = 0); // forward comm of atom coords - void reverse_comm(); // reverse comm of atom coords + void reverse_comm(); // reverse comm of atom coords void exchange(); // move atoms to new procs void borders(); // setup list of atoms to comm @@ -47,15 +49,17 @@ class CommKokkos : public CommBrick { void reverse_comm_dump(class Dump *); // reverse comm from a Dump template 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/dihedral_charmm_kokkos.cpp b/src/KOKKOS/dihedral_charmm_kokkos.cpp index a8a8aade60..7f2117c97f 100644 --- a/src/KOKKOS/dihedral_charmm_kokkos.cpp +++ b/src/KOKKOS/dihedral_charmm_kokkos.cpp @@ -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_opls_kokkos.cpp b/src/KOKKOS/dihedral_opls_kokkos.cpp index e37d4d2ef5..0ee00ca8db 100644 --- a/src/KOKKOS/dihedral_opls_kokkos.cpp +++ b/src/KOKKOS/dihedral_opls_kokkos.cpp @@ -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..552141ced2 --- /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.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; + + memory->create_kokkos(d_table->lo,h_table->lo,ntables,"Table::lo"); + memory->create_kokkos(d_table->hi,h_table->hi,ntables,"Table::hi"); + memory->create_kokkos(d_table->invdelta,h_table->invdelta,ntables,"Table::invdelta"); + + if(tabstyle == LINEAR) { + memory->create_kokkos(d_table->r,h_table->r,ntables,tablength,"Table::r"); + memory->create_kokkos(d_table->e,h_table->e,ntables,tablength,"Table::e"); + memory->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_nh_kokkos.cpp b/src/KOKKOS/fix_nh_kokkos.cpp index fb03bf68c6..7136c776a1 100644 --- a/src/KOKKOS/fix_nh_kokkos.cpp +++ b/src/KOKKOS/fix_nh_kokkos.cpp @@ -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..cb52988c31 --- /dev/null +++ b/src/KOKKOS/fix_property_atom_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 +#include +#include "fix_property_atom_kokkos.h" +#include "atom_kokkos.h" +#include "comm.h" +#include "memory.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; +} + +/* ---------------------------------------------------------------------- + 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) { + memory->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..5d2f6a0438 100644 --- a/src/KOKKOS/fix_qeq_reax_kokkos.cpp +++ b/src/KOKKOS/fix_qeq_reax_kokkos.cpp @@ -63,6 +63,7 @@ FixQEqReaxKokkos(LAMMPS *lmp, int narg, char **arg) : nmax = nmax = m_cap = 0; allocated_flag = 0; + nprev = 4; } /* ---------------------------------------------------------------------- */ @@ -79,7 +80,7 @@ template void FixQEqReaxKokkos::init() { atomKK->k_q.modify(); - atomKK->k_q.sync(); + atomKK->k_q.sync(); FixQEqReax::init(); @@ -158,15 +159,15 @@ void FixQEqReaxKokkos::init_hist() { int i,j; - k_s_hist = DAT::tdual_ffloat_2d("qeq/kk:s_hist",atom->nmax,5); + k_s_hist = DAT::tdual_ffloat_2d("qeq/kk:s_hist",atom->nmax,nprev); 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); + k_t_hist = DAT::tdual_ffloat_2d("qeq/kk:t_hist",atom->nmax,nprev); 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++ ) + for( j = 0; j < nprev; j++ ) k_s_hist.h_view(i,j) = k_t_hist.h_view(i,j) = 0.0; k_s_hist.template modify(); @@ -334,11 +335,11 @@ void FixQEqReaxKokkos::allocate_array() 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); + k_s_hist = DAT::tdual_ffloat_2d("qeq/kk:s_hist",nmax,nprev); 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); + k_t_hist = DAT::tdual_ffloat_2d("qeq/kk:t_hist",nmax,nprev); d_t_hist = k_t_hist.template view(); h_t_hist = k_t_hist.h_view; } @@ -368,7 +369,7 @@ 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++ ) + //for( int j = 0; j < nprev; j++ ) //d_s_hist(i,j) = d_t_hist(i,j) = 0.0; } @@ -1087,7 +1088,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 +1174,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); diff --git a/src/KOKKOS/fix_reaxc_bonds_kokkos.cpp b/src/KOKKOS/fix_reaxc_bonds_kokkos.cpp index e4fb9385a5..0d74a49ed3 100644 --- a/src/KOKKOS/fix_reaxc_bonds_kokkos.cpp +++ b/src/KOKKOS/fix_reaxc_bonds_kokkos.cpp @@ -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"); 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..f2719f9f0e 100644 --- a/src/KOKKOS/fix_reaxc_species_kokkos.cpp +++ b/src/KOKKOS/fix_reaxc_species_kokkos.cpp @@ -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..b1cfd20be2 --- /dev/null +++ b/src/KOKKOS/fix_rx_kokkos.cpp @@ -0,0 +1,2279 @@ +/* ---------------------------------------------------------------------- + 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.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 // 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) + memory->destroy_kokkos(k_dpdThetaLocal, dpdThetaLocal); + + memory->destroy_kokkos(k_sumWeights, sumWeights); + //memory->destroy_kokkos(k_sumWeights); + + //delete [] scratchSpace; + memory->destroy_kokkos(d_scratchSpace); + + memory->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"); + + memory->create_kokkos( d_kineticsData.Arr, h_kineticsData.Arr, nreactions, "KineticsType::Arr"); + memory->create_kokkos( d_kineticsData.nArr, h_kineticsData.nArr, nreactions, "KineticsType::nArr"); + memory->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) + { + + memory->create_kokkos( d_kineticsData.nu , h_kineticsData.nu , nreactions, sparseKinetics_maxSpecies, "KineticsType::nu"); + memory->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) + { + memory->create_kokkos( d_kineticsData.inu, h_kineticsData.inu, nreactions, sparseKinetics_maxSpecies, "KineticsType::inu"); + memory->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 + memory->create_kokkos( d_kineticsData.stoich, h_kineticsData.stoich, nreactions, nspecies, "KineticsType::stoich"); + memory->create_kokkos( d_kineticsData.stoichReactants, h_kineticsData.stoichReactants, nreactions, nspecies, "KineticsType::stoichReactants"); + memory->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()) { + memory->destroy_kokkos (k_dpdThetaLocal, dpdThetaLocal); + memory->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) + { + memory->create_kokkos (k_diagnosticCounterPerODEnSteps, diagnosticCounterPerODEnSteps, nlocal, "FixRxKokkos::diagnosticCounterPerODEnSteps"); + memory->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()) { + memory->destroy_kokkos (d_scratchSpace); + memory->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 ); + } + + memory->destroy_kokkos( k_diagnosticCounterPerODEnSteps, diagnosticCounterPerODEnSteps ); + memory->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; + + //memory->create_kokkos (k_cutsq, h_cutsq, ntypes+1, ntypes+1, "pair:cutsq"); + if (ntypes+1 > k_cutsq.dimension_0()) { + memory->destroy_kokkos (k_cutsq); + memory->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); + + //memory->create_kokkos (k_sumWeights, sumWeights, sumWeightsCt, "FixRxKokkos::sumWeights"); + if (sumWeightsCt > k_sumWeights.template view().dimension_0()) { + memory->destroy_kokkos(k_sumWeights, sumWeights); + memory->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..2ef04ad6ee 100644 --- a/src/KOKKOS/fix_setforce_kokkos.cpp +++ b/src/KOKKOS/fix_setforce_kokkos.cpp @@ -89,8 +89,10 @@ 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); + region->match_all_kokkos(groupbit,k_match); + k_match.template sync(); + d_match = k_match.template view(); } // reallocate sforce array if necessary 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..98bbb02714 --- /dev/null +++ b/src/KOKKOS/fix_shardlow_kokkos.cpp @@ -0,0 +1,856 @@ +/* ---------------------------------------------------------------------- + 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.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; + +#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; + maxRNG = 0; +#ifdef DPD_USE_RAN_MARS + pp_random = NULL; +#endif +// } 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; +#ifdef DPD_USE_RAN_MARS + if (pp_random) { + for (int i = 1; i < maxRNG; ++i) delete pp_random[i]; + delete[] pp_random; + pp_random = NULL; + } +#endif +} + +/* ---------------------------------------------------------------------- */ + +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 +) +{ +#ifdef DPD_USE_RAN_MARS + class RanMars *pRNG = pp_random[id]; +#else + rand_type rand_gen = rand_pool.get_state(id); +#endif + + 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 * +#ifdef DPD_USE_RAN_MARS + pRNG->gaussian(); +#else + rand_gen.normal(); +#endif + + 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; + } + +#ifndef DPD_USE_RAN_MARS + rand_pool.free_state(rand_gen); +#endif +} +#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 +{ +#ifdef DPD_USE_RAN_MARS + class RanMars *pRNG = pp_random[id]; +#else + rand_type rand_gen = rand_pool.get_state(id); +#endif + + 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 * +#ifdef DPD_USE_RAN_MARS + pRNG->gaussian(); +#else + rand_gen.normal(); +#endif + + 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 * +#ifdef DPD_USE_RAN_MARS + pRNG->gaussian(); +#else + rand_gen.normal(); +#endif + + 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++; + } + +#ifndef DPD_USE_RAN_MARS + rand_pool.free_state(rand_gen); +#endif +} + + +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) { +#ifdef DPD_USE_RAN_MARS + if (pp_random) { + for (int i = 1; i < maxRNG; ++i) delete pp_random[i]; + delete[] pp_random; + pp_random = NULL; + } + pp_random = new RanMars*[maxWorkItemCt]; + for (int i = 1; i < maxWorkItemCt; ++i) { + pp_random[i] = new RanMars(lmp, k_pairDPDE->seed + comm->me + comm->nprocs*i); + } + pp_random[0] = k_pairDPDE->random; +#else + rand_pool.init(k_pairDPDE->seed + comm->me, maxWorkItemCt); +#endif + 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..70dccf2e2d --- /dev/null +++ b/src/KOKKOS/fix_shardlow_kokkos.h @@ -0,0 +1,196 @@ +/* -*- 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; + + int maxRNG; +#ifdef DPD_USE_RAN_MARS + class RanMars **pp_random; +#elif defined(DPD_USE_Random_XorShift1024) + Kokkos::Random_XorShift1024_Pool rand_pool; + typedef typename Kokkos::Random_XorShift1024_Pool::generator_type rand_type; +#else + Kokkos::Random_XorShift64_Pool rand_pool; + typedef typename Kokkos::Random_XorShift64_Pool::generator_type rand_type; +#endif + + 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; + + 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/improper_harmonic_kokkos.cpp b/src/KOKKOS/improper_harmonic_kokkos.cpp index 1e58e18c51..73e105864f 100644 --- a/src/KOKKOS/improper_harmonic_kokkos.cpp +++ b/src/KOKKOS/improper_harmonic_kokkos.cpp @@ -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..2b02624dce 100644 --- a/src/KOKKOS/kokkos.cpp +++ b/src/KOKKOS/kokkos.cpp @@ -123,8 +123,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 +160,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 +202,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 +233,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 +306,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/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..ab97cb5848 --- /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.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..a674e7cec4 100644 --- a/src/KOKKOS/neigh_bond_kokkos.cpp +++ b/src/KOKKOS/neigh_bond_kokkos.cpp @@ -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(); @@ -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(); @@ -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(); @@ -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(); @@ -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(); @@ -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(); @@ -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(); @@ -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(); @@ -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..04454e53cb 100644 --- a/src/KOKKOS/neigh_list_kokkos.cpp +++ b/src/KOKKOS/neigh_list_kokkos.cpp @@ -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..f34b149864 100644 --- a/src/KOKKOS/neighbor_kokkos.cpp +++ b/src/KOKKOS/neighbor_kokkos.cpp @@ -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]); @@ -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_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_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..0da8a0a3d6 100644 --- a/src/KOKKOS/pair_buck_coul_cut_kokkos.cpp +++ b/src/KOKKOS/pair_buck_coul_cut_kokkos.cpp @@ -261,7 +261,7 @@ void PairBuckCoulCutKokkos::allocate() memory->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..3a5cbd868f 100644 --- a/src/KOKKOS/pair_buck_coul_long_kokkos.cpp +++ b/src/KOKKOS/pair_buck_coul_long_kokkos.cpp @@ -319,7 +319,7 @@ void PairBuckCoulLongKokkos::allocate() 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..e7640471d5 100644 --- a/src/KOKKOS/pair_buck_kokkos.cpp +++ b/src/KOKKOS/pair_buck_kokkos.cpp @@ -197,7 +197,7 @@ void PairBuckKokkos::allocate() memory->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..8edf093e2e 100644 --- a/src/KOKKOS/pair_coul_cut_kokkos.cpp +++ b/src/KOKKOS/pair_coul_cut_kokkos.cpp @@ -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..c331ab8da8 100644 --- a/src/KOKKOS/pair_coul_debye_kokkos.cpp +++ b/src/KOKKOS/pair_coul_debye_kokkos.cpp @@ -221,7 +221,7 @@ void PairCoulDebyeKokkos::allocate() memory->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_long_kokkos.cpp b/src/KOKKOS/pair_coul_long_kokkos.cpp index 7dbadf4834..721e140e33 100644 --- a/src/KOKKOS/pair_coul_long_kokkos.cpp +++ b/src/KOKKOS/pair_coul_long_kokkos.cpp @@ -279,7 +279,7 @@ void PairCoulLongKokkos::allocate() 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_dpd_fdt_energy_kokkos.cpp b/src/KOKKOS/pair_dpd_fdt_energy_kokkos.cpp new file mode 100644 index 0000000000..c559ab412f --- /dev/null +++ b/src/KOKKOS/pair_dpd_fdt_energy_kokkos.cpp @@ -0,0 +1,796 @@ +/* ---------------------------------------------------------------------- + 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.h" +#include "modify.h" +#include "pair_dpd_fdt_energy_kokkos.h" +#include "error.h" +#include "atom_masks.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; + + memory->destroy_kokkos(k_eatom,eatom); + memory->destroy_kokkos(k_vatom,vatom); + + if (allocated) { + memory->destroy_kokkos(k_duCond,duCond); + memory->destroy_kokkos(k_duMech,duMech); + } + + memory->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) { + memory->destroy_kokkos(k_eatom,eatom); + memory->create_kokkos(k_eatom,eatom,maxeatom,"pair:eatom"); + d_eatom = k_eatom.template view(); + } + if (vflag_atom) { + memory->destroy_kokkos(k_vatom,vatom); + memory->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) { + memory->destroy_kokkos(k_duCond,duCond); + memory->destroy_kokkos(k_duMech,duMech); + } + memory->create_kokkos(k_duCond,duCond,nlocal+nghost,"pair:duCond"); + memory->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); + memory->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); + memory->create_kokkos(k_duCond,duCond,nlocal+nghost+1,"pair:duCond"); + memory->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..aa68d0a054 100644 --- a/src/KOKKOS/pair_eam_alloy_kokkos.cpp +++ b/src/KOKKOS/pair_eam_alloy_kokkos.cpp @@ -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..fb07eec32b 100644 --- a/src/KOKKOS/pair_eam_alloy_kokkos.h +++ b/src/KOKKOS/pair_eam_alloy_kokkos.h @@ -130,15 +130,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; diff --git a/src/KOKKOS/pair_eam_fs_kokkos.cpp b/src/KOKKOS/pair_eam_fs_kokkos.cpp index 57820afb26..a982f94ec4 100644 --- a/src/KOKKOS/pair_eam_fs_kokkos.cpp +++ b/src/KOKKOS/pair_eam_fs_kokkos.cpp @@ -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..d71ec2b887 100644 --- a/src/KOKKOS/pair_eam_fs_kokkos.h +++ b/src/KOKKOS/pair_eam_fs_kokkos.h @@ -130,15 +130,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; diff --git a/src/KOKKOS/pair_eam_kokkos.cpp b/src/KOKKOS/pair_eam_kokkos.cpp index e848669947..8ac92a1766 100644 --- a/src/KOKKOS/pair_eam_kokkos.cpp +++ b/src/KOKKOS/pair_eam_kokkos.cpp @@ -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..856cc51f77 100644 --- a/src/KOKKOS/pair_eam_kokkos.h +++ b/src/KOKKOS/pair_eam_kokkos.h @@ -127,15 +127,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; diff --git a/src/KOKKOS/pair_exp6_rx_kokkos.cpp b/src/KOKKOS/pair_exp6_rx_kokkos.cpp new file mode 100644 index 0000000000..8d65be23af --- /dev/null +++ b/src/KOKKOS/pair_exp6_rx_kokkos.cpp @@ -0,0 +1,2644 @@ +/* ---------------------------------------------------------------------- + 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.h" +#include "error.h" +#include "modify.h" +#include "fix.h" +#include +#include "atom_masks.h" +#include "neigh_request.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; + + memory->destroy_kokkos(k_eatom,eatom); + memory->destroy_kokkos(k_vatom,vatom); + + memory->destroy_kokkos(k_cutsq,cutsq); + + for (int i=0; i < nparams; ++i) { + delete[] params[i].name; + delete[] params[i].potential; + } + memory->destroy_kokkos(k_params,params); + + memory->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) { + memory->destroy_kokkos(k_eatom,eatom); + memory->create_kokkos(k_eatom,eatom,maxeatom,"pair:eatom"); + d_eatom = k_eatom.template view(); + } + if (vflag_atom) { + memory->destroy_kokkos(k_vatom,vatom); + memory->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; + + memory->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]; + + memory->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; + memory->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 + + memory->destroy_kokkos(k_mol2param,mol2param); + memory->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..337b56c6ce --- /dev/null +++ b/src/KOKKOS/pair_hybrid_kokkos.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 + + 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.h" +#include "error.h" +#include "respa.h" +#include "atom_masks.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..f0e357270c 100644 --- a/src/KOKKOS/pair_kokkos.h +++ b/src/KOKKOS/pair_kokkos.h @@ -513,6 +513,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..e7cf7ba42a 100644 --- a/src/KOKKOS/pair_lj_charmm_coul_charmm_implicit_kokkos.cpp +++ b/src/KOKKOS/pair_lj_charmm_coul_charmm_implicit_kokkos.cpp @@ -326,7 +326,7 @@ void PairLJCharmmCoulCharmmImplicitKokkos::allocate() 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..a456d6e276 100644 --- a/src/KOKKOS/pair_lj_charmm_coul_charmm_kokkos.cpp +++ b/src/KOKKOS/pair_lj_charmm_coul_charmm_kokkos.cpp @@ -327,7 +327,7 @@ void PairLJCharmmCoulCharmmKokkos::allocate() 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..dffbbb638f 100644 --- a/src/KOKKOS/pair_lj_charmm_coul_long_kokkos.cpp +++ b/src/KOKKOS/pair_lj_charmm_coul_long_kokkos.cpp @@ -347,7 +347,7 @@ void PairLJCharmmCoulLongKokkos::allocate() 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..0081aca4f1 100644 --- a/src/KOKKOS/pair_lj_class2_coul_cut_kokkos.cpp +++ b/src/KOKKOS/pair_lj_class2_coul_cut_kokkos.cpp @@ -264,7 +264,7 @@ void PairLJClass2CoulCutKokkos::allocate() memory->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..b5dc358feb 100644 --- a/src/KOKKOS/pair_lj_class2_coul_long_kokkos.cpp +++ b/src/KOKKOS/pair_lj_class2_coul_long_kokkos.cpp @@ -316,7 +316,7 @@ void PairLJClass2CoulLongKokkos::allocate() memory->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..34cc15279b 100644 --- a/src/KOKKOS/pair_lj_class2_kokkos.cpp +++ b/src/KOKKOS/pair_lj_class2_kokkos.cpp @@ -203,7 +203,7 @@ void PairLJClass2Kokkos::allocate() memory->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..c3fda01ce6 100644 --- a/src/KOKKOS/pair_lj_cut_coul_cut_kokkos.cpp +++ b/src/KOKKOS/pair_lj_cut_coul_cut_kokkos.cpp @@ -256,7 +256,7 @@ void PairLJCutCoulCutKokkos::allocate() memory->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..b7a71cb99a 100644 --- a/src/KOKKOS/pair_lj_cut_coul_debye_kokkos.cpp +++ b/src/KOKKOS/pair_lj_cut_coul_debye_kokkos.cpp @@ -270,7 +270,7 @@ void PairLJCutCoulDebyeKokkos::allocate() memory->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..9df5963676 100644 --- a/src/KOKKOS/pair_lj_cut_coul_dsf_kokkos.cpp +++ b/src/KOKKOS/pair_lj_cut_coul_dsf_kokkos.cpp @@ -288,7 +288,7 @@ void PairLJCutCoulDSFKokkos::allocate() memory->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..9bd79c7341 100644 --- a/src/KOKKOS/pair_lj_cut_coul_long_kokkos.cpp +++ b/src/KOKKOS/pair_lj_cut_coul_long_kokkos.cpp @@ -313,7 +313,7 @@ void PairLJCutCoulLongKokkos::allocate() memory->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..c90d5ad11c 100644 --- a/src/KOKKOS/pair_lj_cut_kokkos.cpp +++ b/src/KOKKOS/pair_lj_cut_kokkos.cpp @@ -198,7 +198,7 @@ void PairLJCutKokkos::allocate() memory->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..95ec252ad5 100644 --- a/src/KOKKOS/pair_lj_expand_kokkos.cpp +++ b/src/KOKKOS/pair_lj_expand_kokkos.cpp @@ -205,7 +205,7 @@ void PairLJExpandKokkos::allocate() memory->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..4b21b08eb3 100644 --- a/src/KOKKOS/pair_lj_gromacs_coul_gromacs_kokkos.cpp +++ b/src/KOKKOS/pair_lj_gromacs_coul_gromacs_kokkos.cpp @@ -310,7 +310,7 @@ void PairLJGromacsCoulGromacsKokkos::allocate() 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..73a17d7b22 100644 --- a/src/KOKKOS/pair_lj_gromacs_kokkos.cpp +++ b/src/KOKKOS/pair_lj_gromacs_kokkos.cpp @@ -252,7 +252,7 @@ void PairLJGromacsKokkos::allocate() 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..2063f62b20 100644 --- a/src/KOKKOS/pair_lj_sdk_kokkos.cpp +++ b/src/KOKKOS/pair_lj_sdk_kokkos.cpp @@ -234,7 +234,7 @@ void PairLJSDKKokkos::allocate() memory->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..08a9b82640 100644 --- a/src/KOKKOS/pair_morse_kokkos.cpp +++ b/src/KOKKOS/pair_morse_kokkos.cpp @@ -212,7 +212,7 @@ void PairMorseKokkos::allocate() memory->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..d9a4f1ab83 --- /dev/null +++ b/src/KOKKOS/pair_multi_lucy_rx_kokkos.cpp @@ -0,0 +1,998 @@ +/* ---------------------------------------------------------------------- + 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.h" +#include "error.h" +#include "citeme.h" +#include "modify.h" +#include "fix.h" +#include "atom_masks.h" +#include "neigh_request.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; + + memory->destroy_kokkos(k_eatom,eatom); + memory->destroy_kokkos(k_vatom,vatom); + + memory->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) { + memory->destroy_kokkos(k_eatom,eatom); + memory->create_kokkos(k_eatom,eatom,maxeatom,"pair:eatom"); + d_eatom = k_eatom.template view(); + } + if (vflag_atom) { + memory->destroy_kokkos(k_vatom,vatom); + memory->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; + + memory->create_kokkos(d_table->innersq,h_table->innersq,ntables,"Table::innersq"); + memory->create_kokkos(d_table->invdelta,h_table->invdelta,ntables,"Table::invdelta"); + + 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"); + } + + 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"); + } + + 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"); + + memory->create_kokkos(k_cutsq,cutsq,nt,nt,"pair:cutsq"); + d_cutsq = k_cutsq.template view(); + k_cutsq.template modify(); + + memory->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..b8ced4c847 --- /dev/null +++ b/src/KOKKOS/pair_multi_lucy_rx_kokkos.h @@ -0,0 +1,266 @@ +/* ---------------------------------------------------------------------- + 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_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: + 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..d5f83f4537 100644 --- a/src/KOKKOS/pair_reaxc_kokkos.cpp +++ b/src/KOKKOS/pair_reaxc_kokkos.cpp @@ -99,26 +99,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 +131,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 @@ -367,7 +369,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 +384,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 +557,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 +1215,7 @@ void PairReaxCKokkos::operator()(PairReaxComputeTabulatedLJCoulomb t = d_LR(tmin,tmax); /* Cubic Spline Interpolation */ 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_sw_kokkos.cpp b/src/KOKKOS/pair_sw_kokkos.cpp index e5c947cc8e..3440f7c639 100644 --- a/src/KOKKOS/pair_sw_kokkos.cpp +++ b/src/KOKKOS/pair_sw_kokkos.cpp @@ -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_rx_kokkos.cpp b/src/KOKKOS/pair_table_rx_kokkos.cpp new file mode 100644 index 0000000000..2f5a670537 --- /dev/null +++ b/src/KOKKOS/pair_table_rx_kokkos.cpp @@ -0,0 +1,1307 @@ +/* ---------------------------------------------------------------------- + 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.h" +#include "error.h" +#include "atom_masks.h" +#include "fix.h" +#include "kokkos_few.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; + + memory->destroy_kokkos(k_eatom,eatom); + memory->destroy_kokkos(k_vatom,vatom); + + if (allocated) { + memory->destroy_kokkos(d_table->cutsq, cutsq); + memory->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) { + memory->destroy_kokkos(k_eatom,eatom); + memory->create_kokkos(k_eatom,eatom,maxeatom,"pair:eatom"); + d_eatom = k_eatom.template view(); + } + if (vflag_atom) { + memory->destroy_kokkos(k_vatom,vatom); + memory->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; + + 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"); + + 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"); + } + + 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"); + } + + 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"); + } + + 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"); + } + + + + 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"); + 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"); + 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..3a5c2227ef 100644 --- a/src/KOKKOS/pair_tersoff_kokkos.cpp +++ b/src/KOKKOS/pair_tersoff_kokkos.cpp @@ -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(); } /* ---------------------------------------------------------------------- diff --git a/src/KOKKOS/pair_tersoff_mod_kokkos.cpp b/src/KOKKOS/pair_tersoff_mod_kokkos.cpp index d77ba2f141..9a59979f4c 100644 --- a/src/KOKKOS/pair_tersoff_mod_kokkos.cpp +++ b/src/KOKKOS/pair_tersoff_mod_kokkos.cpp @@ -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(); } /* ---------------------------------------------------------------------- diff --git a/src/KOKKOS/pair_tersoff_zbl_kokkos.cpp b/src/KOKKOS/pair_tersoff_zbl_kokkos.cpp index 040d8c5230..8468bb01f5 100644 --- a/src/KOKKOS/pair_tersoff_zbl_kokkos.cpp +++ b/src/KOKKOS/pair_tersoff_zbl_kokkos.cpp @@ -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(); } /* ---------------------------------------------------------------------- diff --git a/src/KOKKOS/pair_vashishta_kokkos.cpp b/src/KOKKOS/pair_vashishta_kokkos.cpp index abdcfac89e..fe2394ae84 100644 --- a/src/KOKKOS/pair_vashishta_kokkos.cpp +++ b/src/KOKKOS/pair_vashishta_kokkos.cpp @@ -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/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..e14ac4d0c0 100644 --- a/src/KOKKOS/region_block_kokkos.h +++ b/src/KOKKOS/region_block_kokkos.h @@ -39,14 +39,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/verlet_kokkos.cpp b/src/KOKKOS/verlet_kokkos.cpp index e4a3f857d3..adec5ff1bd 100644 --- a/src/KOKKOS/verlet_kokkos.cpp +++ b/src/KOKKOS/verlet_kokkos.cpp @@ -294,6 +294,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 +305,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 +321,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); @@ -523,11 +524,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..7b140b6f81 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 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/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..2103074ad4 --- /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 < 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..f74b05624f --- /dev/null +++ b/src/LATTE/fix_latte.cpp @@ -0,0 +1,347 @@ +/* ---------------------------------------------------------------------- + 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 * ); +} + +#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 (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; + 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); + + // 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_openmpi b/src/MAKE/MACHINES/Makefile.icex similarity index 83% rename from src/MAKE/OPTIONS/Makefile.kokkos_cuda_openmpi rename to src/MAKE/MACHINES/Makefile.icex index da7046b0b6..ceeec48870 100644 --- a/src/MAKE/OPTIONS/Makefile.kokkos_cuda_openmpi +++ b/src/MAKE/MACHINES/Makefile.icex @@ -1,4 +1,4 @@ -# kokkos_cuda = KOKKOS/CUDA package, OpenMPI 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 OMPI_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/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..41d0f959fe --- a/src/MAKE/OPTIONS/Makefile.intel_cpu +++ b/src/MAKE/OPTIONS/Makefile.intel_cpu @@ -8,14 +8,14 @@ SHELL = /bin/sh 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) +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 6a4c4c14be..ef514f43c6 100644 --- a/src/MAKE/OPTIONS/Makefile.intel_cpu_intelmpi +++ b/src/MAKE/OPTIONS/Makefile.intel_cpu_intelmpi @@ -8,8 +8,8 @@ SHELL = /bin/sh 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) +CCFLAGS = -qopenmp -qno-offload -fno-alias -ansi-alias -restrict \ + -DLMP_INTEL_USELRT -DLMP_USE_MKL_RNG $(OPTFLAGS) SHFLAGS = -fPIC DEPFLAGS = -M diff --git a/src/MAKE/OPTIONS/Makefile.intel_cpu_mpich b/src/MAKE/OPTIONS/Makefile.intel_cpu_mpich index d4cbdbdb03..e4dc74d79b 100644 --- a/src/MAKE/OPTIONS/Makefile.intel_cpu_mpich +++ b/src/MAKE/OPTIONS/Makefile.intel_cpu_mpich @@ -8,14 +8,14 @@ SHELL = /bin/sh CC = mpicxx -cxx=icc 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) +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 50433ce4c6..457a64b223 100644 --- a/src/MAKE/OPTIONS/Makefile.intel_cpu_openmpi +++ b/src/MAKE/OPTIONS/Makefile.intel_cpu_openmpi @@ -9,14 +9,14 @@ SHELL = /bin/sh export OMPI_CXX = icc CC = mpicxx 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) +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_mpich b/src/MAKE/OPTIONS/Makefile.kokkos_cuda_mpi similarity index 95% rename from src/MAKE/OPTIONS/Makefile.kokkos_cuda_mpich rename to src/MAKE/OPTIONS/Makefile.kokkos_cuda_mpi index be0c2d1913..d6568a428f 100644 --- a/src/MAKE/OPTIONS/Makefile.kokkos_cuda_mpich +++ b/src/MAKE/OPTIONS/Makefile.kokkos_cuda_mpi @@ -1,4 +1,4 @@ -# kokkos_cuda = KOKKOS/CUDA package, MPICH with nvcc compiler, Kepler GPU +# kokkos_cuda_mpi = KOKKOS/CUDA package, MPICH or OpenMPI with nvcc compiler, Kepler GPU SHELL = /bin/sh @@ -8,6 +8,7 @@ SHELL = /bin/sh KOKKOS_ABSOLUTE_PATH = $(shell cd $(KOKKOS_PATH); pwd) export MPICH_CXX = $(KOKKOS_ABSOLUTE_PATH)/config/nvcc_wrapper +export OMPI_CXX = $(KOKKOS_ABSOLUTE_PATH)/config/nvcc_wrapper CC = mpicxx CCFLAGS = -g -O3 SHFLAGS = -fPIC 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/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..32bea45996 --- /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; + + // 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; +} + +/* ---------------------------------------------------------------------- + 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/Makefile b/src/Makefile index 91d65a11c5..e0f0db77fe 100644 --- a/src/Makefile +++ b/src/Makefile @@ -53,8 +53,8 @@ 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 \ @@ -63,9 +63,9 @@ PACKUSER = user-atc user-awpmd user-cgdna user-cgsdk user-colvars \ 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 @@ -364,12 +364,12 @@ package-status ps: @echo '' @for p in $(PACKUSERUC); do $(SHELL) Package.sh $$p status; done -package-update pu: +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/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 (; jneighinit(); timer->barrier_start(); time_start = timer->get_wall(Timer::TOTAL); diff --git a/src/REPLICA/tad.cpp b/src/REPLICA/tad.cpp index 5a4d885224..347cd3ba67 100644 --- a/src/REPLICA/tad.cpp +++ b/src/REPLICA/tad.cpp @@ -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); diff --git a/src/RIGID/fix_rigid.cpp b/src/RIGID/fix_rigid.cpp index b39a9a5fdf..14edc26e28 100644 --- a/src/RIGID/fix_rigid.cpp +++ b/src/RIGID/fix_rigid.cpp @@ -74,6 +74,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; diff --git a/src/RIGID/fix_rigid_small.cpp b/src/RIGID/fix_rigid_small.cpp index 93c58f2d48..88e0c35dd7 100644 --- a/src/RIGID/fix_rigid_small.cpp +++ b/src/RIGID/fix_rigid_small.cpp @@ -78,6 +78,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; 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/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..ad2366f3d4 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); @@ -239,6 +233,9 @@ void colvarproxy_lammps::serialize_status(std::string &rst) std::ostringstream os; colvars->write_restart(os); rst = os.str(); + + // TODO separate this as its own function? + colvars->write_output_files(); } // set status from string @@ -331,89 +328,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..849af410f2 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 @@ -140,21 +137,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 0eb6f2d95a..e89e00ba03 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-19" +#define COLVARPROXY_VERSION "2017-10-11" // 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..5897b9c5f0 100644 --- a/src/USER-COLVARS/fix_colvars.cpp +++ b/src/USER-COLVARS/fix_colvars.cpp @@ -913,6 +913,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); 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..cec53ab15f 100644 --- a/src/USER-DPD/fix_shardlow.cpp +++ b/src/USER-DPD/fix_shardlow.cpp @@ -55,6 +55,7 @@ #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; @@ -95,6 +96,8 @@ 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); if(pairDPDE){ comm_forward = 3; @@ -107,26 +110,12 @@ 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); } /* ---------------------------------------------------------------------- */ @@ -135,7 +124,6 @@ int FixShardlow::setmask() { int mask = 0; mask |= INITIAL_INTEGRATE; - mask |= PRE_EXCHANGE | MIN_PRE_EXCHANGE; return mask; } @@ -144,9 +132,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 +148,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; @@ -243,6 +212,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 +225,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; @@ -382,6 +369,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 +382,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; @@ -518,7 +523,19 @@ 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); + } + +#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"); @@ -528,36 +545,69 @@ void FixShardlow::initial_integrate(int vflag) dtsqrt = sqrt(update->dt); - //Loop over all 14 directions (8 stages) - for (airnum = 1; airnum <=8; airnum++){ + 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; - if (airnum > 1) { - // Communicate the updated velocities to all nodes - comm->forward_comm_fix(this); + // process neighbors in the local AIR + for (int workPhase = 0; workPhase < ssa_phaseCt; ++workPhase) { + int workItemCt = ssa_phaseLen[workPhase]; - 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); + for (int workItem = 0; workItem < workItemCt; ++workItem) { + int ct = ssa_itemLen[workPhase][workItem]; + ii = ssa_itemLoc[workPhase][workItem]; + + while (ct-- > 0) { + int len = list->numneigh[ii]; + if (len > 0) { + if (useDPDE) ssa_update_dpde(ilist[ii], list->firstneigh[ii], len); + else ssa_update_dpd(ilist[ii], list->firstneigh[ii], len); + } + ii++; } } + } - // 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); - } + ii = inum; + //Loop over all 13 outward directions (7 stages) + for (airnum = 1; airnum <=7; airnum++){ + int ct = list->AIRct_ssa[airnum]; + + // 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); + } + + // process neighbors in this AIR + while (ct-- > 0) { + int len = list->numneigh[ii]; + if (useDPDE) ssa_update_dpde(ilist[ii], list->firstneigh[ii], len); + else ssa_update_dpd(ilist[ii], list->firstneigh[ii], len); + ii++; } // 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,91 +693,11 @@ 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[] return bytes; } diff --git a/src/USER-DPD/fix_shardlow.h b/src/USER-DPD/fix_shardlow.h index 2ffb96ae7c..e8e5f484a0 100644 --- a/src/USER-DPD/fix_shardlow.h +++ b/src/USER-DPD/fix_shardlow.h @@ -35,21 +35,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 *); @@ -63,7 +56,6 @@ class FixShardlow : public Fix { private: 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 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..a6479d4c4f 100644 --- a/src/USER-DPD/npair_half_bin_newton_ssa.cpp +++ b/src/USER-DPD/npair_half_bin_newton_ssa.cpp @@ -32,15 +32,29 @@ 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; +} /* ---------------------------------------------------------------------- */ -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); +} /* ---------------------------------------------------------------------- binned neighbor list construction with full Newton's 3rd law @@ -65,7 +79,6 @@ void NPairHalfBinNewtonSSA::build(NeighList *list) 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 +94,218 @@ 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, ct; - 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->AIRct_ssa[0] = 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 (int airnum = 1; airnum <= 7; airnum++) { + int locAIRct = 0; + for (i = gairhead_ssa[airnum]; 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]; - } + list->AIRct_ssa[airnum] = locAIRct; } - - 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..ea292316ca 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,18 @@ 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; + NPairHalfBinNewtonSSA(class LAMMPS *); - ~NPairHalfBinNewtonSSA() {} + ~NPairHalfBinNewtonSSA(); void build(class NeighList *); + private: + int ssa_maxPhaseCt; + int ssa_maxPhaseLen; }; } 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_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-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..4163a816ac 100644 --- a/src/USER-DRUDE/pair_lj_cut_thole_long.cpp +++ b/src/USER-DRUDE/pair_lj_cut_thole_long.cpp @@ -378,19 +378,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-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 275b4839f5..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,11 +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 intel_intrinsics_airebo.h pair_airebo_intel.cpp -action verlet_lrt_intel.h pppm.cpp -action verlet_lrt_intel.cpp pppm.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 3b84446057..871d881f39 100644 --- a/src/USER-INTEL/README +++ b/src/USER-INTEL/README @@ -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 434189dd26..62602d5920 100644 --- a/src/USER-INTEL/TEST/README +++ b/src/USER-INTEL/TEST/README @@ -9,6 +9,7 @@ # 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 # ############################################################################# @@ -16,16 +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.airebo - 7.3 11.8 +# 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.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/angle_charmm_intel.cpp b/src/USER-INTEL/angle_charmm_intel.cpp index d55afd4742..031c964200 100644 --- a/src/USER-INTEL/angle_charmm_intel.cpp +++ b/src/USER-INTEL/angle_charmm_intel.cpp @@ -336,7 +336,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..84220277d7 100644 --- a/src/USER-INTEL/angle_harmonic_intel.cpp +++ b/src/USER-INTEL/angle_harmonic_intel.cpp @@ -318,7 +318,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..93d64ed631 100644 --- a/src/USER-INTEL/bond_fene_intel.cpp +++ b/src/USER-INTEL/bond_fene_intel.cpp @@ -295,7 +295,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..0ac466f113 100644 --- a/src/USER-INTEL/bond_harmonic_intel.cpp +++ b/src/USER-INTEL/bond_harmonic_intel.cpp @@ -266,7 +266,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..0e13e92251 100644 --- a/src/USER-INTEL/dihedral_charmm_intel.cpp +++ b/src/USER-INTEL/dihedral_charmm_intel.cpp @@ -942,8 +942,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 +952,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..805ffc0e25 --- /dev/null +++ b/src/USER-INTEL/dihedral_fourier_intel.cpp @@ -0,0 +1,441 @@ +/* ---------------------------------------------------------------------- + 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 "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..5d16b0da74 100644 --- a/src/USER-INTEL/dihedral_harmonic_intel.cpp +++ b/src/USER-INTEL/dihedral_harmonic_intel.cpp @@ -400,7 +400,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..e290ab9061 100644 --- a/src/USER-INTEL/dihedral_opls_intel.cpp +++ b/src/USER-INTEL/dihedral_opls_intel.cpp @@ -427,7 +427,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..eac48b8510 100644 --- a/src/USER-INTEL/fix_intel.cpp +++ b/src/USER-INTEL/fix_intel.cpp @@ -285,6 +285,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 b4b664cb94..ac208f5a0c 100644 --- a/src/USER-INTEL/intel_buffers.cpp +++ b/src/USER-INTEL/intel_buffers.cpp @@ -409,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 @@ -425,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 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/npair_full_bin_ghost_intel.cpp b/src/USER-INTEL/npair_full_bin_ghost_intel.cpp index 12101712f1..e6d45d7b2c 100644 --- a/src/USER-INTEL/npair_full_bin_ghost_intel.cpp +++ b/src/USER-INTEL/npair_full_bin_ghost_intel.cpp @@ -319,7 +319,6 @@ void NPairFullBinGhostIntel::fbi(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++) @@ -341,7 +340,6 @@ void NPairFullBinGhostIntel::fbi(const int offload, NeighList * list, const int bstart = binhead[ibin + stencil[k]]; const int bend = binhead[ibin + stencil[k] + 1]; #if defined(LMP_SIMD_COMPILER) - #pragma vector aligned #pragma simd #endif for (int jj = bstart; jj < bend; jj++) diff --git a/src/USER-INTEL/npair_intel.cpp b/src/USER-INTEL/npair_intel.cpp index 79dc75366e..0068e02635 100644 --- a/src/USER-INTEL/npair_intel.cpp +++ b/src/USER-INTEL/npair_intel.cpp @@ -273,7 +273,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++) @@ -307,7 +306,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++) { 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_gayberne_intel.cpp b/src/USER-INTEL/pair_gayberne_intel.cpp index 3fbb58308b..1f05ad0efc 100644 --- a/src/USER-INTEL/pair_gayberne_intel.cpp +++ b/src/USER-INTEL/pair_gayberne_intel.cpp @@ -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 index 0dc2c275e8..e3afcd64a6 100644 --- a/src/USER-INTEL/pair_lj_charmm_coul_charmm_intel.cpp +++ b/src/USER-INTEL/pair_lj_charmm_coul_charmm_intel.cpp @@ -521,8 +521,8 @@ void PairLJCharmmCoulCharmmIntel::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_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/pppm_intel.cpp b/src/USER-INTEL/pppm_intel.cpp index f1cfe591f2..db855b75ef 100644 --- a/src/USER-INTEL/pppm_intel.cpp +++ b/src/USER-INTEL/pppm_intel.cpp @@ -66,11 +66,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 +78,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 +131,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 +232,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 +559,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 +604,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 +623,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 +640,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 +667,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 +680,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 +896,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 +941,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 +961,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..9ff5f85176 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 diff --git a/src/USER-INTEL/verlet_lrt_intel.h b/src/USER-INTEL/verlet_lrt_intel.h index 0521b161c7..0d7154ff64 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 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-MISC/README b/src/USER-MISC/README index 2fd25df9be..5af5b22eb7 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 @@ -74,3 +75,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..e1e5f579b8 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; 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/temper_npt.cpp b/src/USER-MISC/temper_npt.cpp new file mode 100644 index 0000000000..572a52b1a9 --- /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 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(); + + 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-NETCDF/dump_netcdf.cpp b/src/USER-NETCDF/dump_netcdf.cpp index 971f69f7cc..af9f94a728 100644 --- a/src/USER-NETCDF/dump_netcdf.cpp +++ b/src/USER-NETCDF/dump_netcdf.cpp @@ -88,8 +88,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]; @@ -224,6 +224,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]; @@ -268,14 +286,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 ); @@ -312,8 +330,7 @@ void DumpNetCDF::openfile() // Type mangling if (vtype[perat[i].field[0]] == INT) { xtype = NC_INT; - } - else { + } else { if (double_precision) xtype = NC_DOUBLE; else @@ -337,10 +354,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) + 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]; @@ -348,8 +368,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), @@ -598,15 +618,39 @@ 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); +} + void DumpNetCDF::write() { // open file @@ -638,13 +682,8 @@ void DumpNetCDF::write() 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), + 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 } } } @@ -888,8 +927,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; } @@ -911,68 +953,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..25d64efade 100644 --- a/src/USER-NETCDF/dump_netcdf.h +++ b/src/USER-NETCDF/dump_netcdf.h @@ -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 3b753b1b04..890029371e 100644 --- a/src/USER-NETCDF/dump_netcdf_mpiio.cpp +++ b/src/USER-NETCDF/dump_netcdf_mpiio.cpp @@ -88,8 +88,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]; @@ -217,6 +217,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]; @@ -260,7 +278,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. @@ -270,8 +288,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 ); @@ -333,10 +351,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) + 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]; @@ -344,8 +364,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), @@ -574,15 +594,40 @@ 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); +} + void DumpNetCDFMPIIO::write() { // open file @@ -616,13 +661,8 @@ void DumpNetCDFMPIIO::write() 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), + 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 } } } @@ -883,8 +923,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-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_shear_history_omp.cpp b/src/USER-OMP/fix_neigh_history_omp.cpp similarity index 61% rename from src/USER-OMP/fix_shear_history_omp.cpp rename to src/USER-OMP/fix_neigh_history_omp.cpp index 4180e0af41..05b8fa41b9 100644 --- a/src/USER-OMP/fix_shear_history_omp.cpp +++ b/src/USER-OMP/fix_neigh_history_omp.cpp @@ -13,7 +13,7 @@ #include #include -#include "fix_shear_history_omp.h" +#include "fix_neigh_history_omp.h" #include "atom.h" #include "comm.h" #include "neighbor.h" @@ -31,15 +31,38 @@ using namespace LAMMPS_NS; using namespace FixConst; + +FixNeighHistoryOMP::FixNeighHistoryOMP(class LAMMPS *lmp,int narg,char **argv) + : FixNeighHistory(lmp,narg,argv) { + + if (onesided) + error->all(FLERR,"tri/lj and line/lj are not supported by USER-OMP"); + if (!newton_pair) + error->all(FLERR,"Newton off for granular is not supported by USER-OMP"); +} + + /* ---------------------------------------------------------------------- - copy shear partner info from neighbor lists to per-atom arrays - so it can be exchanged with those atoms + 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 + + the USER-OMP version only supports newton on ------------------------------------------------------------------------- */ -void FixShearHistoryOMP::pre_exchange() +void FixNeighHistoryOMP::pre_exchange() { const int nthreads = comm->nthreads; - maxtouch = 0; + maxpartner = 0; #if defined(_OPENMP) #pragma omp parallel default(none) @@ -54,16 +77,16 @@ void FixShearHistoryOMP::pre_exchange() int i,j,ii,jj,m,n,inum,jnum; int *ilist,*jlist,*numneigh,**firstneigh; - int *touch,**firsttouch; - double *shear,*shearj,*allshear,**firstshear; + int *allflags,**firstflag; + double *allvalues,*onevalues,*jvalues; - MyPage &ipg = ipage[tid]; - MyPage &dpg = dpage[tid]; + MyPage &ipg = ipage_atom[tid]; + MyPage &dpg = dpage_atom[tid]; ipg.reset(); dpg.reset(); // 1st loop over neighbor list - // calculate nparter for each owned atom + // calculate npartner for each owned atom tagint *tag = atom->tag; @@ -72,8 +95,6 @@ void FixShearHistoryOMP::pre_exchange() 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; @@ -94,10 +115,10 @@ void FixShearHistoryOMP::pre_exchange() 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]) { if ((i >= lfrom) && (i < lto)) npartner[i]++; @@ -116,55 +137,55 @@ void FixShearHistoryOMP::pre_exchange() 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"); + 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 atom IDs and shear history for my atoms - // re-zero npartner to use as counter for all my atoms + // 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]; - 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[3*jj]; + if (allflags[jj]) { + onevalues = &allvalues[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); + memcpy(&valuepartner[i][dnum*m],onevalues,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]; + jvalues = &valuepartner[j][dnum*m]; + for (n = 0; n < dnum; n++) jvalues[n] = -onevalues[n]; } } } } - // set maxtouch = max # of partners of any owned atom - maxtouch = m = 0; + // 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 - maxtouch = MAX(m,maxtouch); + maxpartner = MAX(m,maxpartner); } } diff --git a/src/USER-OMP/fix_shear_history_omp.h b/src/USER-OMP/fix_neigh_history_omp.h similarity index 70% rename from src/USER-OMP/fix_shear_history_omp.h rename to src/USER-OMP/fix_neigh_history_omp.h index 95281b2afc..83472391a0 100644 --- a/src/USER-OMP/fix_shear_history_omp.h +++ b/src/USER-OMP/fix_neigh_history_omp.h @@ -13,22 +13,21 @@ #ifdef FIX_CLASS -FixStyle(SHEAR_HISTORY/omp,FixShearHistoryOMP) +FixStyle(NEIGH_HISTORY/omp,FixNeighHistoryOMP) #else -#ifndef LMP_FIX_SHEAR_HISTORY_OMP_H -#define LMP_FIX_SHEAR_HISTORY_OMP_H +#ifndef LMP_FIX_NEIGH_HISTORY_OMP_H +#define LMP_FIX_NEIGH_HISTORY_OMP_H -#include "fix_shear_history.h" +#include "fix_neigh_history.h" namespace LAMMPS_NS { -class FixShearHistoryOMP : public FixShearHistory { +class FixNeighHistoryOMP : public FixNeighHistory { public: - FixShearHistoryOMP(class LAMMPS *lmp, int narg, char **argv) - : FixShearHistory(lmp,narg,argv) {}; + FixNeighHistoryOMP(class LAMMPS *lmp, int narg, char **argv); virtual void pre_exchange(); }; 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/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..6a1cb46ea6 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,30 +39,20 @@ 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,m,n,nn,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 @@ -85,29 +71,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 +100,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 +114,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..d8e1e6da44 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,36 +38,20 @@ 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,m,n,nn,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; @@ -88,29 +68,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 +101,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 +123,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 +137,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..3c7b6b118f 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,34 +41,20 @@ 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,m,n,nn; 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; @@ -89,29 +72,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 +96,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 +109,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..37a4181af7 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,m,n,nn,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_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 diff --git a/src/USER-OMP/respa_omp.cpp b/src/USER-OMP/respa_omp.cpp index 738538a209..aa4aa65a4f 100644 --- a/src/USER-OMP/respa_omp.cpp +++ b/src/USER-OMP/respa_omp.cpp @@ -108,6 +108,7 @@ void RespaOMP::setup() domain->box_too_small_check(); modify->setup_pre_neighbor(); neighbor->build(); + modify->setup_post_neighbor(); neighbor->ncalls = 0; // compute all forces @@ -200,6 +201,7 @@ void RespaOMP::setup_minimal(int flag) domain->box_too_small_check(); modify->setup_pre_neighbor(); neighbor->build(); + modify->setup_post_neighbor(); neighbor->ncalls = 0; } @@ -311,6 +313,10 @@ void RespaOMP::recurse(int ilevel) } neighbor->build(); 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-REAXC/fix_qeq_reax.cpp b/src/USER-REAXC/fix_qeq_reax.cpp index 9d165f3fd3..d1c4f90771 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; @@ -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-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..dd639c34db --- /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(); + 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(); + 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..8ea5b9d4d2 100644 --- a/src/accelerator_kokkos.h +++ b/src/accelerator_kokkos.h @@ -99,7 +99,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 d4c00bc0a5..7d343a0807 100644 --- a/src/atom.cpp +++ b/src/atom.cpp @@ -103,7 +103,6 @@ Atom::Atom(LAMMPS *lmp) : Pointers(lmp) uCond = uMech = uChem = uCG = uCGnew = NULL; duChem = NULL; dpdTheta = NULL; - ssaAIR = NULL; // USER-MESO @@ -305,7 +304,6 @@ Atom::~Atom() memory->destroy(uCG); memory->destroy(uCGnew); memory->destroy(duChem); - memory->destroy(ssaAIR); memory->destroy(cc); memory->destroy(cc_flux); @@ -346,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); @@ -453,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; } /* ---------------------------------------------------------------------- @@ -593,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; diff --git a/src/atom.h b/src/atom.h index 29a1c5d69e..007142a1c0 100644 --- a/src/atom.h +++ b/src/atom.h @@ -93,7 +93,6 @@ class Atom : protected Pointers { double *duChem; double *dpdTheta; int nspecies_dpd; - int *ssaAIR; // Shardlow Splitting Algorithm Active Interaction Region number // USER-MESO package @@ -262,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..9d257d99de 100644 --- a/src/atom_map.cpp +++ b/src/atom_map.cpp @@ -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/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_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..dcfd2ff131 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++; } 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/create_atoms.cpp b/src/create_atoms.cpp index 04a2df91f8..992049a81f 100644 --- a/src/create_atoms.cpp +++ b/src/create_atoms.cpp @@ -343,6 +343,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 @@ -509,6 +514,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; @@ -521,12 +529,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/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/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..80fa00f4b3 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,58 @@ 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..5c677a4338 100644 --- a/src/fix_addforce.cpp +++ b/src/fix_addforce.cpp @@ -51,6 +51,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 +238,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 +290,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 +306,7 @@ void FixAddForce::post_force(int vflag) // wrap with clear/add } else { + double unwrap[3]; modify->clearstep_compute(); @@ -307,20 +324,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_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_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..de94fbecef 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" @@ -33,12 +33,12 @@ enum{DEFAULT,NPARTNER,PERPARTNER}; /* ---------------------------------------------------------------------- */ -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 // 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,4*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,109 @@ 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; + double xtmp,ytmp,ztmp,delx,dely,delz; + double radi,rsq,radsum; + 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 +650,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 +674,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,7 +714,7 @@ 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; @@ -590,7 +722,7 @@ int FixShearHistory::pack_reverse_comm_size(int n, int first) last = first + n; for (i = first; i < last; i++) - m += 1 + (dnum+1)*npartner[i]; + m += 1 + 4*npartner[i]; return m; } @@ -599,7 +731,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 +747,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 +760,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 +778,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 +798,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 +808,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 +829,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 +846,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 +860,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 +877,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 62% rename from src/fix_shear_history.h rename to src/fix_neigh_history.h index 00f219f034..64cc11efec 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(); + void setup_post_neighbor(); virtual void pre_exchange(); void min_pre_exchange(); + 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 + + // per-neighbor data structs pointed to by firstflag & firstvalue + + MyPage *ipage_neigh; // pages of local atom indices + MyPage *dpage_neigh; // pages of partner values void pre_exchange_onesided(); void pre_exchange_newton(); 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_property_atom.cpp b/src/fix_property_atom.cpp index b83aadc95d..002260d8f0 100644 --- a/src/fix_property_atom.cpp +++ b/src/fix_property_atom.cpp @@ -134,7 +134,6 @@ FixPropertyAtom::FixPropertyAtom(LAMMPS *lmp, int narg, char **arg) : // register with Atom class nmax_old = 0; - grow_arrays(atom->nmax); atom->add_callback(0); atom->add_callback(1); if (border) atom->add_callback(2); @@ -190,6 +189,8 @@ int FixPropertyAtom::setmask() void FixPropertyAtom::init() { + grow_arrays(atom->nmax); + // error if atom style has changed since fix was defined // don't allow this b/c user could change to style that defines molecule,q 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_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..f91295d469 100644 --- a/src/fix_wall_harmonic.cpp +++ b/src/fix_wall_harmonic.cpp @@ -34,6 +34,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 +61,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..e8e706ed5e 100644 --- a/src/fix_wall_lj1043.cpp +++ b/src/fix_wall_lj1043.cpp @@ -52,6 +52,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 +80,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..22199fed5b 100644 --- a/src/fix_wall_lj126.cpp +++ b/src/fix_wall_lj126.cpp @@ -48,6 +48,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 +77,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..281a1fafc4 100644 --- a/src/fix_wall_lj93.cpp +++ b/src/fix_wall_lj93.cpp @@ -49,6 +49,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 +80,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_region.cpp b/src/fix_wall_region.cpp index f543c12171..1d22e6141b 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,6 +62,7 @@ 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"); @@ -143,6 +147,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 +204,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 +217,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 +250,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 +356,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/input.cpp b/src/input.cpp index 7d11b8741b..23b89d3040 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" diff --git a/src/library.cpp b/src/library.cpp index 22b54f73a1..8f87d6fab2 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; @@ -370,6 +371,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 +386,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/min.cpp b/src/min.cpp index af23629cad..653cac71e6 100644 --- a/src/min.cpp +++ b/src/min.cpp @@ -246,6 +246,7 @@ void Min::setup(int flag) domain->box_too_small_check(); modify->setup_pre_neighbor(); neighbor->build(); + modify->setup_post_neighbor(); neighbor->ncalls = 0; // remove these restriction eventually @@ -345,6 +346,7 @@ void Min::setup_minimal(int flag) domain->box_too_small_check(); modify->setup_pre_neighbor(); neighbor->build(); + 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(); 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/neigh_list.cpp b/src/neigh_list.cpp index a5ca7a5366..934b9f7d9b 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,8 @@ NeighList::NeighList(LAMMPS *lmp) : Pointers(lmp) // USER-DPD package - ndxAIR_ssa = NULL; + for (int i = 0; i < 8; i++) AIRct_ssa[i] = 0; + np = NULL; } /* ---------------------------------------------------------------------- */ @@ -91,18 +101,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 +128,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 +139,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 +163,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 +178,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 +219,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 +269,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 +306,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..d633ba839e 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,8 @@ 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 + int AIRct_ssa[8]; // count of how many atoms in 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..6325eec566 100644 --- a/src/neigh_request.cpp +++ b/src/neigh_request.cpp @@ -42,7 +42,7 @@ NeighRequest::NeighRequest(LAMMPS *lmp) : Pointers(lmp) // 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,8 +68,6 @@ NeighRequest::NeighRequest(LAMMPS *lmp) : Pointers(lmp) cut = 0; cutoff = 0.0; - dnum = 0; - // skip info, default is no skipping skip = 0; @@ -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 @@ -158,8 +151,6 @@ 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); @@ -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..cc2e5d6d11 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 @@ -1155,8 +1115,6 @@ void Neighbor::morph_halffull() // 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 +1133,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 +1183,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 +1219,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 +1229,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 +1481,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 +1506,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 +1602,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 +1642,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 +1732,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..9244bc575d 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 @@ -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..dd3a73926e 100644 --- a/src/npair.cpp +++ b/src/npair.cpp @@ -66,7 +66,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..289a1348d9 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 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..cf608b5d59 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,20 +36,10 @@ 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,m,n,nn,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; @@ -64,42 +50,20 @@ void NPairHalfSizeBinNewtoff::build(NeighList *list) 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 +80,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 +103,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..662bf91d6e 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,27 +29,16 @@ 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,m,n,nn,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; @@ -63,42 +49,20 @@ void NPairHalfSizeBinNewton::build(NeighList *list) 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 +92,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 +114,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 +128,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..e70c072280 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,27 +30,16 @@ 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,m,n,nn,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; @@ -64,42 +50,20 @@ void NPairHalfSizeBinNewtonTri::build(NeighList *list) 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 +98,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 +112,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..e6f5cba657 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,27 +30,16 @@ 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,m,n,nn,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; @@ -68,42 +54,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 +88,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 +101,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..78811170cb 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,m,n,nn,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_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..075387f5b0 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,24 +29,13 @@ 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 *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; @@ -68,28 +54,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 +68,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 +78,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 +87,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..92eae285d0 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; 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..f2fca7b128 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,7 +33,6 @@ 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) @@ -44,15 +41,6 @@ void NPairSkipSizeOff2onOneside::build(NeighList *list) tagint jtag; 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 +61,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 +107,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 +115,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 +153,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.h b/src/pair.h index b57004d965..eb71e88224 100644 --- a/src/pair.h +++ b/src/pair.h @@ -92,10 +92,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 @@ -211,10 +207,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 31360d13ff..751560deff 100644 --- a/src/pair_hybrid.cpp +++ b/src/pair_hybrid.cpp @@ -39,9 +39,6 @@ PairHybrid::PairHybrid(LAMMPS *lmp) : Pair(lmp), 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); 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_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/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..d2ef481cb7 100644 --- a/src/region.cpp +++ b/src/region.cpp @@ -146,7 +146,7 @@ int Region::match(double x, double y, double z) generate error if Kokkos function defaults to base class ------------------------------------------------------------------------- */ -void Region::match_all_kokkos(int, DAT::t_int_1d) +void Region::match_all_kokkos(int, DAT::tdual_int_1d) { error->all(FLERR,"Can only use Kokkos supported regions with Kokkos package"); } diff --git a/src/region.h b/src/region.h index 9c693bfcd5..5b4238acb4 100644 --- a/src/region.h +++ b/src/region.h @@ -99,7 +99,7 @@ class Region : protected Pointers { // Kokkos function, implemented by each Kokkos region - virtual void match_all_kokkos(int, DAT::t_int_1d); + virtual void match_all_kokkos(int, DAT::tdual_int_1d); protected: void add_contact(int, double *, double, double, double); diff --git a/src/replicate.cpp b/src/replicate.cpp index e2ed718f65..f3d1964169 100644 --- a/src/replicate.cpp +++ b/src/replicate.cpp @@ -74,6 +74,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; @@ -424,4 +429,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..23cd941834 100644 --- a/src/respa.cpp +++ b/src/respa.cpp @@ -442,6 +442,7 @@ void Respa::setup(int flag) domain->box_too_small_check(); modify->setup_pre_neighbor(); neighbor->build(); + modify->setup_post_neighbor(); neighbor->ncalls = 0; // compute all forces @@ -517,6 +518,7 @@ void Respa::setup_minimal(int flag) domain->box_too_small_check(); modify->setup_pre_neighbor(); neighbor->build(); + modify->setup_post_neighbor(); neighbor->ncalls = 0; } @@ -668,6 +670,11 @@ void Respa::recurse(int ilevel) } neighbor->build(); 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/verlet.cpp b/src/verlet.cpp index b242b00722..d74906556b 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); } } @@ -122,6 +121,7 @@ void Verlet::setup(int flag) domain->box_too_small_check(); modify->setup_pre_neighbor(); neighbor->build(); + modify->setup_post_neighbor(); neighbor->ncalls = 0; // compute all forces @@ -183,6 +183,7 @@ void Verlet::setup_minimal(int flag) domain->box_too_small_check(); modify->setup_pre_neighbor(); neighbor->build(); + 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; @@ -284,6 +286,10 @@ void Verlet::run(int n) } neighbor->build(); timer->stamp(Timer::NEIGH); + if (n_post_neighbor) { + modify->post_neighbor(); + timer->stamp(Timer::MODIFY); + } } // force computations diff --git a/src/version.h b/src/version.h index ff33fa3b06..0c4c4fda62 100644 --- a/src/version.h +++ b/src/version.h @@ -1 +1 @@ -#define LAMMPS_VERSION "17 Aug 2017" +#define LAMMPS_VERSION "22 Sep 2017" diff --git a/tools/drude/polarizer.py b/tools/drude/polarizer.py index 2976146f66..d28f284389 100755 --- a/tools/drude/polarizer.py +++ b/tools/drude/polarizer.py @@ -2,7 +2,7 @@ # polarizer.py - add Drude oscillators to LAMMPS data file. # Agilio Padua # Alain Dequidt -# version 2017/02/03 +# version 2017/02/08 import sys import argparse @@ -38,9 +38,9 @@ identification of the atom types within the force field database: This script will add new atom types, new bond types, new atoms and new bonds to the data file. -It will also print some commands to be included in the LAMMPS input script, +It will also generate some commands to be included in the LAMMPS input script, which are related to the topology and force field, namely fix drude, -pair_style and pair coeff_commands. For information on thermostating please +pair_style and pair_coeff commands. For information on thermostating please read the documentation of the USER-DRUDE package. This tool can also be used to revert a Drude-polarized data file to a @@ -549,6 +549,8 @@ class Data(object): def lmpscript(self, drude, outfile, thole = 2.6, cutoff = 12.0): """print lines for input script, including pair_style thole""" + pairfile = "pair-drude.lmp" + dfound = False for att in self.atomtypes: if att['dflag'] == 'd': @@ -564,49 +566,54 @@ class Data(object): print("pair_style hybrid/overlay ... coul/long/cs {0:.1f} "\ "thole {1:.3f} {0:.1f}\n".format(cutoff, thole)) + print("# data file with Drude oscillators added") print("read_data {0}\n".format(outfile)) - print("# add interactions between atoms and Drude particles") - print("pair_coeff * {0:3d}* coul/long/cs".format(att['id'])) + print("# pair interactions with Drude particles written to file") + print("# Thole damping recommended if more than 1 Drude per molecule") + print("include {0}\n".format(pairfile)) - # Thole parameters for I,J pairs - print("# add Thole damping if more than 1 Drude per molecule") - ifound = False - for atti in self.atomtypes: - itype = atti['type'].split()[0] - for ddt in drude.types: - dtype = ddt['type'].split()[0] - if dtype == itype: - alphai = ddt['alpha'] - tholei = ddt['thole'] - ifound = True - break - jfound = False - for attj in self.atomtypes: - if attj['id'] < atti['id']: - continue - jtype = attj['type'].split()[0] + with open(pairfile, "w") as f: + f.write("# interactions involving Drude particles\n") + f.write("pair_coeff * {0:3d}* coul/long/cs\n".format(att['id'])) + + f.write("# Thole damping if more than 1 Drude per molecule\n") + # Thole parameters for I,J pairs + ifound = False + for atti in self.atomtypes: + itype = atti['type'].split()[0] for ddt in drude.types: dtype = ddt['type'].split()[0] - if dtype == jtype: - alphaj = ddt['alpha'] - tholej = ddt['thole'] - jfound = True + if dtype == itype: + alphai = ddt['alpha'] + tholei = ddt['thole'] + ifound = True break - if ifound and jfound: - alphaij = (alphai * alphaj)**0.5 - tholeij = (tholei + tholej) / 2.0 - if tholeij == thole: - print("pair_coeff {0:4} {1:4} thole {2:7.3f}".format( - atti['id'], attj['id'], alphaij)) - else: - print("pair_coeff {0:4} {1:4} thole {2:7.3f} "\ - "{3:7.3f}".format(atti['id'],attj['id'], - alphaij, tholeij)) - jfound = False - ifound = False - print("") + for attj in self.atomtypes: + if attj['id'] < atti['id']: + continue + jtype = attj['type'].split()[0] + for ddt in drude.types: + dtype = ddt['type'].split()[0] + if dtype == jtype: + alphaj = ddt['alpha'] + tholej = ddt['thole'] + jfound = True + break + if ifound and jfound: + alphaij = (alphai * alphaj)**0.5 + tholeij = (tholei + tholej) / 2.0 + if tholeij == thole: + f.write("pair_coeff {0:4} {1:4} thole "\ + "{2:7.3f}\n".format(atti['id'], attj['id'], + alphaij)) + else: + f.write("pair_coeff {0:4} {1:4} thole {2:7.3f} "\ + "{3:7.3f}\n".format(atti['id'],attj['id'], + alphaij, tholeij)) + jfound = False + ifound = False print("# atom groups convenient for thermostats (see package " "documentation), etc.") @@ -631,8 +638,8 @@ class Data(object): print("") print("# ATTENTION!") - print("# * special_bonds may need 'extra' keyword, LAMMPS will exit " - "with a message.") + print("# * read_data may need 'extra/special/per/atom' keyword, " + "LAMMPS will exit with a message.") print("# * If using fix shake the group-ID must not include " "Drude particles.") print("# Use group ATOMS for example.") diff --git a/tools/phonon/Makefile b/tools/phonon/Makefile index 0aacb1e086..67f9b91fdf 100644 --- a/tools/phonon/Makefile +++ b/tools/phonon/Makefile @@ -1,7 +1,7 @@ .SUFFIXES : .o .cpp # compiler and flags -CC = g++ -Wno-unused-result -LINK = $(CC) -static +CC = g++ -Wall +LINK = $(CC) CFLAGS = -O3 $(DEBUG) $(UFLAG) # OFLAGS = -O3 $(DEBUG) @@ -9,18 +9,17 @@ INC = $(LPKINC) $(TCINC) $(SPGINC) LIB = $(LPKLIB) $(TCLIB) $(SPGLIB) # # cLapack library needed -LPKINC = -I/opt/libs/clapack/3.2.1/include -LPKLIB = -L/opt/libs/clapack/3.2.1/lib -lclapack -lblas -lf2c #-lm +LPKINC = +LPKLIB =-llapack # -# Tricubic library needed -TCINC = -I/opt/libs/tricubic/1.0/include -TCLIB = -L/opt/libs/tricubic/1.0/lib -ltricubic # # spglib 1.8.2, used to get the irreducible q-points # if UFLAG is not set, spglib won't be used. -UFLAG = -DUseSPG -SPGINC = -I/opt/libs/spglib/1.8.2/include -SPGLIB = -L/opt/libs/spglib/1.8.2/lib -lsymspg + +# UFLAG = -DUseSPG +# SPGINC = -I/opt/libs/spglib/1.8.2/include +# SPGLIB = -L/opt/libs/spglib/1.8.2/lib -lsymspg + # if spglib other than version 1.8.2 is used, please # modify file phonon.cpp, instruction can be found by searching 1.8.2 @@ -36,7 +35,7 @@ SRC = $(wildcard *.cpp) OBJ = $(SRC:.cpp=.o) #==================================================================== -all: ver ${EXE} +all: ${EXE} ${EXE}: $(OBJ) $(LINK) $(OFLAGS) $(OBJ) $(LIB) -o $@ @@ -59,3 +58,16 @@ ver: $(CC) $(CFLAGS) -c $< .cpp.o: $(CC) $(CFLAGS) $(INC) -c $< + +#==================================================================== +# dependencies +disp.o: disp.cpp phonon.h dynmat.h memory.h interpolate.h green.h timer.h \ + global.h +dynmat.o: dynmat.cpp dynmat.h memory.h interpolate.h version.h global.h +green.o: green.cpp green.h memory.h global.h +interpolate.o: interpolate.cpp interpolate.h memory.h global.h +main.o: main.cpp dynmat.h memory.h interpolate.h phonon.h +memory.o: memory.cpp memory.h +phonon.o: phonon.cpp phonon.h dynmat.h memory.h interpolate.h green.h \ + timer.h global.h +timer.o: timer.cpp timer.h diff --git a/tools/phonon/README b/tools/phonon/README index ae6383b6bd..b54d96d8a3 100644 --- a/tools/phonon/README +++ b/tools/phonon/README @@ -5,15 +5,9 @@ analyse the phonon related information. #------------------------------------------------------------------------------- 1. Dependencies - The clapack library is needed to solve the eigen problems, - which could be downloaded from: - http://www.netlib.org/clapack/ - - The tricubic library is also needed to do tricubic interpolations, - which could be obtained from: - http://orca.princeton.edu/francois/software/tricubic/ - or - http://1drv.ms/1J2WFYk + The LAPACK library is needed to solve the eigen problems. + http://www.netlib.org/lapack/ + Intel MKL can be used as well. The spglib is optionally needed, enabling one to evaluate the phonon density of states or vibrational thermal properties diff --git a/tools/phonon/disp.cpp b/tools/phonon/disp.cpp index 2fa603916c..218e01e7fc 100644 --- a/tools/phonon/disp.cpp +++ b/tools/phonon/disp.cpp @@ -18,7 +18,8 @@ void Phonon::pdisp() { // ask the output file name and write the header. char str[MAXLINE]; - for (int ii = 0; ii < 80; ++ii) printf("="); printf("\n"); + for (int ii = 0; ii < 80; ++ii) printf("="); + printf("\n"); #ifdef UseSPG // ask method to generate q-lines int method = 2; @@ -53,7 +54,6 @@ void Phonon::pdisp() while (1){ for (int i = 0; i < 3; ++i) qstr[i] = qend[i]; - int quit = 0; printf("\nPlease input the start q-point in unit of B1->B3, q to exit [%g %g %g]: ", qstr[0], qstr[1], qstr[2]); int n = count_words(fgets(str, MAXLINE, stdin)); ptr = strtok(str, " \t\n\r\f"); @@ -2844,7 +2844,8 @@ void Phonon::pdisp() printf("\nPhonon dispersion data are written to: %s, you can visualize the results\n", fname); printf("by invoking: `gnuplot pdisp.gnuplot; gv pdisp.eps`\n"); } - for (int ii = 0; ii < 80; ++ii) printf("="); printf("\n"); + for (int ii = 0; ii < 80; ++ii) printf("="); + printf("\n"); delete []fname; nodes.clear(); diff --git a/tools/phonon/dynmat.cpp b/tools/phonon/dynmat.cpp index e82f473130..3b7bfe8268 100644 --- a/tools/phonon/dynmat.cpp +++ b/tools/phonon/dynmat.cpp @@ -3,6 +3,11 @@ #include "version.h" #include "global.h" +extern "C" void zheevd_(char *, char *, long int *, doublecomplex *, + long int *, double *, doublecomplex *, + long int *, double *, long int *, long int *, + long int *, long int *); + // to initialize the class DynMat::DynMat(int narg, char **arg) { @@ -81,7 +86,8 @@ DynMat::DynMat(int narg, char **arg) printf("Number of atoms per unit cell : %d\n", nucell); printf("System dimension : %d\n", sysdim); printf("Boltzmann constant in used units : %g\n", boltz); - for (int i = 0; i < 80; ++i) printf("="); printf("\n"); + for (int i = 0; i < 80; ++i) printf("="); + printf("\n"); if (sysdim < 1||sysdim > 3||nx < 1||ny < 1||nz < 1||nucell < 1){ printf("Wrong values read from header of file: %s, please check the binary file!\n", binfile); fclose(fp); exit(3); @@ -117,11 +123,11 @@ DynMat::DynMat(int narg, char **arg) memory->create(attyp, nucell, "DynMat:attyp"); memory->create(M_inv_sqrt, nucell, "DynMat:M_inv_sqrt"); - if ( fread(&Tmeasure, sizeof(double), 1, fp) != 1 ){printf("\nError while reading temperature from file: %s\n", binfile); fclose(fp); exit(3);} - if ( fread(&basevec[0], sizeof(double), 9, fp) != 9 ){printf("\nError while reading lattice info from file: %s\n", binfile); fclose(fp); exit(3);} - if ( fread(basis[0], sizeof(double), fftdim, fp) != fftdim){printf("\nError while reading basis info from file: %s\n", binfile); fclose(fp); exit(3);} - if ( fread(&attyp[0], sizeof(int), nucell, fp) != nucell){printf("\nError while reading atom types from file: %s\n", binfile); fclose(fp); exit(3);} - if ( fread(&M_inv_sqrt[0], sizeof(double), nucell, fp) != nucell){printf("\nError while reading atomic masses from file: %s\n", binfile); fclose(fp); exit(3);} + if ( (int) fread(&Tmeasure, sizeof(double), 1, fp) != 1 ){printf("\nError while reading temperature from file: %s\n", binfile); fclose(fp); exit(3);} + if ( (int) fread(&basevec[0], sizeof(double), 9, fp) != 9 ){printf("\nError while reading lattice info from file: %s\n", binfile); fclose(fp); exit(3);} + if ( (int) fread(basis[0], sizeof(double), fftdim, fp) != fftdim){printf("\nError while reading basis info from file: %s\n", binfile); fclose(fp); exit(3);} + if ( (int) fread(&attyp[0], sizeof(int), nucell, fp) != nucell){printf("\nError while reading atom types from file: %s\n", binfile); fclose(fp); exit(3);} + if ( (int) fread(&M_inv_sqrt[0], sizeof(double), nucell, fp) != nucell){printf("\nError while reading atomic masses from file: %s\n", binfile); fclose(fp); exit(3);} fclose(fp); car2dir(); @@ -229,9 +235,9 @@ return; int DynMat::geteigen(double *egv, int flag) { char jobz, uplo; - integer n, lda, lwork, lrwork, *iwork, liwork, info; + long int n, lda, lwork, lrwork, *iwork, liwork, info; doublecomplex *work; - doublereal *w = &egv[0], *rwork; + double *w = &egv[0], *rwork; n = fftdim; if (flag) jobz = 'V'; @@ -338,7 +344,8 @@ void DynMat::EnforceASR() char *ptr = strtok(str," \t\n\r\f"); if (ptr) nasr = atoi(ptr); if (nasr < 1){ - for (int i=0; i<80; i++) printf("="); printf("\n"); + for (int i=0; i<80; i++) printf("="); + printf("\n"); return; } @@ -404,7 +411,8 @@ void DynMat::EnforceASR() if (i == 99){ printf("...... (%d more skiped)", fftdim-100); break;} } printf("\n"); - for (int i = 0; i < 80; ++i) printf("="); printf("\n\n"); + for (int i = 0; i < 80; ++i) printf("="); + printf("\n\n"); return; } @@ -456,7 +464,7 @@ return; * --------------------------------------------------------------------*/ void DynMat::GaussJordan(int n, double *Mat) { - int i,icol,irow,j,k,l,ll,idr,idc; + int i,icol=0,irow=0,j,k,l,ll,idr,idc; int *indxc,*indxr,*ipiv; double big, nmjk; double dum, pivinv; diff --git a/tools/phonon/dynmat.h b/tools/phonon/dynmat.h index 1d6e716584..f5bd4010b8 100644 --- a/tools/phonon/dynmat.h +++ b/tools/phonon/dynmat.h @@ -7,11 +7,6 @@ #include "memory.h" #include "interpolate.h" -extern "C"{ -#include "f2c.h" -#include "clapack.h" -} - using namespace std; class DynMat { diff --git a/tools/phonon/green.cpp b/tools/phonon/green.cpp index 8f8946dc4f..35514c03fb 100644 --- a/tools/phonon/green.cpp +++ b/tools/phonon/green.cpp @@ -224,7 +224,6 @@ void Green::recursion() { // local variables std::complex Z, rec_x, rec_x_inv; - std::complex cunit = std::complex(0.,1.); double w = wmin; diff --git a/tools/phonon/interpolate.cpp b/tools/phonon/interpolate.cpp index 8c0cbde1ce..954062d415 100644 --- a/tools/phonon/interpolate.cpp +++ b/tools/phonon/interpolate.cpp @@ -1,7 +1,125 @@ #include "interpolate.h" -#include "math.h" +#include #include "global.h" +/////////////////////// +// tricubic library code +static int A[64][64] = { +{ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, +{ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, +{-3, 3, 0, 0, 0, 0, 0, 0,-2,-1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, +{ 2,-2, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, +{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, +{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, +{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,-3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,-2,-1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, +{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2,-2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, +{-3, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,-2, 0,-1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, +{ 0, 0, 0, 0, 0, 0, 0, 0,-3, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,-2, 0,-1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, +{ 9,-9,-9, 9, 0, 0, 0, 0, 6, 3,-6,-3, 0, 0, 0, 0, 6,-6, 3,-3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 2, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, +{-6, 6, 6,-6, 0, 0, 0, 0,-3,-3, 3, 3, 0, 0, 0, 0,-4, 4,-2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,-2,-2,-1,-1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, +{ 2, 0,-2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, +{ 0, 0, 0, 0, 0, 0, 0, 0, 2, 0,-2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, +{-6, 6, 6,-6, 0, 0, 0, 0,-4,-2, 4, 2, 0, 0, 0, 0,-3, 3,-3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,-2,-1,-2,-1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, +{ 4,-4,-4, 4, 0, 0, 0, 0, 2, 2,-2,-2, 0, 0, 0, 0, 2,-2, 2,-2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, +{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, +{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, +{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,-3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,-2,-1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, +{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2,-2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, +{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, +{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0}, +{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,-3, 3, 0, 0, 0, 0, 0, 0,-2,-1, 0, 0, 0, 0, 0, 0}, +{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2,-2, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0}, +{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,-3, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,-2, 0,-1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, +{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,-3, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,-2, 0,-1, 0, 0, 0, 0, 0}, +{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9,-9,-9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 3,-6,-3, 0, 0, 0, 0, 6,-6, 3,-3, 0, 0, 0, 0, 4, 2, 2, 1, 0, 0, 0, 0}, +{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,-6, 6, 6,-6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,-3,-3, 3, 3, 0, 0, 0, 0,-4, 4,-2, 2, 0, 0, 0, 0,-2,-2,-1,-1, 0, 0, 0, 0}, +{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0,-2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, +{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0,-2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0}, +{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,-6, 6, 6,-6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,-4,-2, 4, 2, 0, 0, 0, 0,-3, 3,-3, 3, 0, 0, 0, 0,-2,-1,-2,-1, 0, 0, 0, 0}, +{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4,-4,-4, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2,-2,-2, 0, 0, 0, 0, 2,-2, 2,-2, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0}, +{-3, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,-2, 0, 0, 0,-1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, +{ 0, 0, 0, 0, 0, 0, 0, 0,-3, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,-2, 0, 0, 0,-1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, +{ 9,-9, 0, 0,-9, 9, 0, 0, 6, 3, 0, 0,-6,-3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6,-6, 0, 0, 3,-3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 2, 0, 0, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, +{-6, 6, 0, 0, 6,-6, 0, 0,-3,-3, 0, 0, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,-4, 4, 0, 0,-2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,-2,-2, 0, 0,-1,-1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, +{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,-3, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,-2, 0, 0, 0,-1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, +{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,-3, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,-2, 0, 0, 0,-1, 0, 0, 0}, +{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9,-9, 0, 0,-9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 3, 0, 0,-6,-3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6,-6, 0, 0, 3,-3, 0, 0, 4, 2, 0, 0, 2, 1, 0, 0}, +{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,-6, 6, 0, 0, 6,-6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,-3,-3, 0, 0, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,-4, 4, 0, 0,-2, 2, 0, 0,-2,-2, 0, 0,-1,-1, 0, 0}, +{ 9, 0,-9, 0,-9, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 3, 0,-6, 0,-3, 0, 6, 0,-6, 0, 3, 0,-3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 2, 0, 2, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0}, +{ 0, 0, 0, 0, 0, 0, 0, 0, 9, 0,-9, 0,-9, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 3, 0,-6, 0,-3, 0, 6, 0,-6, 0, 3, 0,-3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 2, 0, 2, 0, 1, 0}, +{-27,27,27,-27,27,-27,-27,27,-18,-9,18, 9,18, 9,-18,-9,-18,18,-9, 9,18,-18, 9,-9,-18,18,18,-18,-9, 9, 9,-9,-12,-6,-6,-3,12, 6, 6, 3,-12,-6,12, 6,-6,-3, 6, 3,-12,12,-6, 6,-6, 6,-3, 3,-8,-4,-4,-2,-4,-2,-2,-1}, +{18,-18,-18,18,-18,18,18,-18, 9, 9,-9,-9,-9,-9, 9, 9,12,-12, 6,-6,-12,12,-6, 6,12,-12,-12,12, 6,-6,-6, 6, 6, 6, 3, 3,-6,-6,-3,-3, 6, 6,-6,-6, 3, 3,-3,-3, 8,-8, 4,-4, 4,-4, 2,-2, 4, 4, 2, 2, 2, 2, 1, 1}, +{-6, 0, 6, 0, 6, 0,-6, 0, 0, 0, 0, 0, 0, 0, 0, 0,-3, 0,-3, 0, 3, 0, 3, 0,-4, 0, 4, 0,-2, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,-2, 0,-2, 0,-1, 0,-1, 0, 0, 0, 0, 0, 0, 0, 0, 0}, +{ 0, 0, 0, 0, 0, 0, 0, 0,-6, 0, 6, 0, 6, 0,-6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,-3, 0,-3, 0, 3, 0, 3, 0,-4, 0, 4, 0,-2, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0,-2, 0,-2, 0,-1, 0,-1, 0}, +{18,-18,-18,18,-18,18,18,-18,12, 6,-12,-6,-12,-6,12, 6, 9,-9, 9,-9,-9, 9,-9, 9,12,-12,-12,12, 6,-6,-6, 6, 6, 3, 6, 3,-6,-3,-6,-3, 8, 4,-8,-4, 4, 2,-4,-2, 6,-6, 6,-6, 3,-3, 3,-3, 4, 2, 4, 2, 2, 1, 2, 1}, +{-12,12,12,-12,12,-12,-12,12,-6,-6, 6, 6, 6, 6,-6,-6,-6, 6,-6, 6, 6,-6, 6,-6,-8, 8, 8,-8,-4, 4, 4,-4,-3,-3,-3,-3, 3, 3, 3, 3,-4,-4, 4, 4,-2,-2, 2, 2,-4, 4,-4, 4,-2, 2,-2, 2,-2,-2,-2,-2,-1,-1,-1,-1}, +{ 2, 0, 0, 0,-2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, +{ 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0,-2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, +{-6, 6, 0, 0, 6,-6, 0, 0,-4,-2, 0, 0, 4, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,-3, 3, 0, 0,-3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,-2,-1, 0, 0,-2,-1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, +{ 4,-4, 0, 0,-4, 4, 0, 0, 2, 2, 0, 0,-2,-2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2,-2, 0, 0, 2,-2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, +{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0,-2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, +{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0,-2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0}, +{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,-6, 6, 0, 0, 6,-6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,-4,-2, 0, 0, 4, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,-3, 3, 0, 0,-3, 3, 0, 0,-2,-1, 0, 0,-2,-1, 0, 0}, +{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4,-4, 0, 0,-4, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 0, 0,-2,-2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2,-2, 0, 0, 2,-2, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0}, +{-6, 0, 6, 0, 6, 0,-6, 0, 0, 0, 0, 0, 0, 0, 0, 0,-4, 0,-2, 0, 4, 0, 2, 0,-3, 0, 3, 0,-3, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,-2, 0,-1, 0,-2, 0,-1, 0, 0, 0, 0, 0, 0, 0, 0, 0}, +{ 0, 0, 0, 0, 0, 0, 0, 0,-6, 0, 6, 0, 6, 0,-6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,-4, 0,-2, 0, 4, 0, 2, 0,-3, 0, 3, 0,-3, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0,-2, 0,-1, 0,-2, 0,-1, 0}, +{18,-18,-18,18,-18,18,18,-18,12, 6,-12,-6,-12,-6,12, 6,12,-12, 6,-6,-12,12,-6, 6, 9,-9,-9, 9, 9,-9,-9, 9, 8, 4, 4, 2,-8,-4,-4,-2, 6, 3,-6,-3, 6, 3,-6,-3, 6,-6, 3,-3, 6,-6, 3,-3, 4, 2, 2, 1, 4, 2, 2, 1}, +{-12,12,12,-12,12,-12,-12,12,-6,-6, 6, 6, 6, 6,-6,-6,-8, 8,-4, 4, 8,-8, 4,-4,-6, 6, 6,-6,-6, 6, 6,-6,-4,-4,-2,-2, 4, 4, 2, 2,-3,-3, 3, 3,-3,-3, 3, 3,-4, 4,-2, 2,-4, 4,-2, 2,-2,-2,-1,-1,-2,-2,-1,-1}, +{ 4, 0,-4, 0,-4, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 2, 0,-2, 0,-2, 0, 2, 0,-2, 0, 2, 0,-2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0}, +{ 0, 0, 0, 0, 0, 0, 0, 0, 4, 0,-4, 0,-4, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 2, 0,-2, 0,-2, 0, 2, 0,-2, 0, 2, 0,-2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0}, +{-12,12,12,-12,12,-12,-12,12,-8,-4, 8, 4, 8, 4,-8,-4,-6, 6,-6, 6, 6,-6, 6,-6,-6, 6, 6,-6,-6, 6, 6,-6,-4,-2,-4,-2, 4, 2, 4, 2,-4,-2, 4, 2,-4,-2, 4, 2,-3, 3,-3, 3,-3, 3,-3, 3,-2,-1,-2,-1,-2,-1,-2,-1}, +{ 8,-8,-8, 8,-8, 8, 8,-8, 4, 4,-4,-4,-4,-4, 4, 4, 4,-4, 4,-4,-4, 4,-4, 4, 4,-4,-4, 4, 4,-4,-4, 4, 2, 2, 2, 2,-2,-2,-2,-2, 2, 2,-2,-2, 2, 2,-2,-2, 2,-2, 2,-2, 2,-2, 2,-2, 1, 1, 1, 1, 1, 1, 1, 1}}; + +static int ijk2n(int i, int j, int k) { + return(i+4*j+16*k); +} + +/* ---------------------------------------------------------------------------- */ + +static void tricubic_get_coeff_stacked(double a[64], double x[64]) { + int i,j; + for (i=0;i<64;i++) { + a[i]=(double)(0.0); + for (j=0;j<64;j++) { + a[i]+=A[i][j]*x[j]; + } + } +} + +static void tricubic_get_coeff(double a[64], double f[8], double dfdx[8], double dfdy[8], double dfdz[8], double d2fdxdy[8], double d2fdxdz[8], double d2fdydz[8], double d3fdxdydz[8]) { + int i; + double x[64]; + for (i=0;i<8;i++) { + x[0+i]=f[i]; + x[8+i]=dfdx[i]; + x[16+i]=dfdy[i]; + x[24+i]=dfdz[i]; + x[32+i]=d2fdxdy[i]; + x[40+i]=d2fdxdz[i]; + x[48+i]=d2fdydz[i]; + x[56+i]=d3fdxdydz[i]; + } + tricubic_get_coeff_stacked(a,x); +} + +static double tricubic_eval(double a[64], double x, double y, double z) { + int i,j,k; + double ret=(double)(0.0); + /* TRICUBIC EVAL + This is the short version of tricubic_eval. It is used to compute + the value of the function at a given point (x,y,z). To compute + partial derivatives of f, use the full version with the extra args. + */ + for (i=0;i<4;i++) { + for (j=0;j<4;j++) { + for (k=0;k<4;k++) { + ret+=a[ijk2n(i,j,k)]*pow(x,i)*pow(y,j)*pow(z,k); + } + } + } + return(ret); +} + /* ---------------------------------------------------------------------------- * Constructor used to get info from caller, and prepare other necessary data * ---------------------------------------------------------------------------- */ @@ -274,7 +392,8 @@ void Interpolate::set_method() which =2-im%2; printf("Your selection: %d\n", which); - for(int i=0; i<80; i++) printf("="); printf("\n\n"); + for(int i=0; i<80; i++) printf("="); + printf("\n\n"); if (which == 1) tricubic_init(); @@ -306,4 +425,3 @@ void Interpolate::reset_gamma() return; } -/* ---------------------------------------------------------------------------- */ diff --git a/tools/phonon/interpolate.h b/tools/phonon/interpolate.h index e192fcac87..04a358ae71 100644 --- a/tools/phonon/interpolate.h +++ b/tools/phonon/interpolate.h @@ -5,11 +5,8 @@ #include "stdlib.h" #include "string.h" #include "memory.h" -#include -extern "C"{ -#include "f2c.h" -#include "clapack.h" -} + +extern "C" typedef struct { double r, i; } doublecomplex; using namespace std; diff --git a/tools/phonon/phonon.cpp b/tools/phonon/phonon.cpp index 43bea111b4..065885cf3f 100644 --- a/tools/phonon/phonon.cpp +++ b/tools/phonon/phonon.cpp @@ -42,7 +42,8 @@ Phonon::Phonon(DynMat *dm) printf("\n"); for (int i = 0; i < 37; ++i) printf("="); printf(" Menu "); - for (int i = 0; i < 37; ++i) printf("="); printf("\n"); + for (int i = 0; i < 37; ++i) printf("="); + printf("\n"); printf(" 1. Phonon DOS evaluation;\n"); printf(" 2. Phonon dispersion curves;\n"); printf(" 3. Dynamical matrix at arbitrary q;\n"); @@ -60,7 +61,8 @@ Phonon::Phonon(DynMat *dm) printf("Your choice [0]: "); if (count_words(fgets(str,MAXLINE,stdin)) > 0) job = atoi(strtok(str," \t\n\r\f")); printf("\nYour selection: %d\n", job); - for (int i = 0; i < 80; ++i) printf("=");printf("\n\n"); + for (int i = 0; i < 80; ++i) printf("="); + printf("\n\n"); // now to do the job according to user's choice if (job == 1) pdos(); @@ -414,7 +416,8 @@ void Phonon::vfanyq() dynmat->geteigen(egvs, 0); printf("q-point: [%lg %lg %lg], ", q[0], q[1], q[2]); printf("vibrational frequencies at this q-point:\n"); - for (int i = 0; i < ndim; ++i) printf("%lg ", egvs[i]); printf("\n\n"); + for (int i = 0; i < ndim; ++i) printf("%lg ", egvs[i]); + printf("\n\n"); } return; @@ -1001,7 +1004,8 @@ void Phonon::ShowCell() printf("\n"); for (int i = 0; i < 30; ++i) printf("="); printf(" Unit Cell Info "); - for (int i = 0; i < 30; ++i) printf("="); printf("\n"); + for (int i = 0; i < 30; ++i) printf("="); + printf("\n"); printf("Number of atoms in the unit cell: %d\n", dynmat->nucell); printf("Basis vectors of the unit cell:\n"); printf(" %15.8f %15.8f %15.8f\n", dynmat->basevec[0], dynmat->basevec[1], dynmat->basevec[2]); @@ -1091,7 +1095,7 @@ int Phonon::count_words(const char *line) strcpy(copy,line); char *ptr; - if (ptr = strchr(copy,'#')) *ptr = '\0'; + if ((ptr = strchr(copy,'#'))) *ptr = '\0'; if (strtok(copy," \t\n\r\f") == NULL) { memory->destroy(copy); diff --git a/tools/phonon/version.h b/tools/phonon/version.h index 8ed0e80aa7..decab631b0 100644 --- a/tools/phonon/version.h +++ b/tools/phonon/version.h @@ -1 +1 @@ -#define VERSION 7 +#define VERSION 8