diff --git a/.gitignore b/.gitignore index d496fb781..da1f14c2a 100644 --- a/.gitignore +++ b/.gitignore @@ -6,6 +6,8 @@ # whitelist only the files that ever need to be tracked !*.f90 !*.sh +!CMakeLists.txt +!*.cmake !CHANGELOG !README.md !paper/paper.md @@ -77,3 +79,6 @@ python/swiftest/tests/convert_code_type/swifter2swiftest/pl.swifter2swiftest.in python/swiftest/tests/convert_code_type/swifter2swiftest/tp.swifter2swiftest.in !python/swiftest/requirements.txt + +bin/ +build/* diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 000000000..776f386e4 --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,64 @@ +# CMake project file for FOO + +################################################## +# Define the project and the depencies that it has +################################################## + +CMAKE_MINIMUM_REQUIRED(VERSION 2.8.5...3.20.1) +PROJECT(Swiftest Fortran) + +# Set the Swiftest version +SET(VERSION 1.0.0) + +# Add our local modlues to the module path +SET(CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake/Modules/") + +# Uncomment if it is required that Fortran 90 is supported +IF(NOT CMAKE_Fortran_COMPILER_SUPPORTS_F90) + MESSAGE(FATAL_ERROR "Fortran compiler does not support F90") +ENDIF(NOT CMAKE_Fortran_COMPILER_SUPPORTS_F90) + +# Set some options the user may choose +# Uncomment the below if you want the user to choose a parallelization library +OPTION(USE_MPI "Use the MPI library for parallelization" OFF) +OPTION(USE_OPENMP "Use OpenMP for parallelization" OFF) + +# This INCLUDE statement executes code that sets the compile flags for DEBUG, +# RELEASE, and TESTING. You should review this file and make sure the flags +# are to your liking. +INCLUDE(${CMAKE_MODULE_PATH}/SetFortranFlags.cmake) +# Locate and set parallelization libraries. There are some CMake peculiarities +# taken care of here, such as the fact that the FindOpenMP routine doesn't know +# about Fortran. +INCLUDE(${CMAKE_MODULE_PATH}/SetParallelizationLibrary.cmake) + +INCLUDE(${CMAKE_MODULE_PATH}/SetUpNetCDF.cmake) + +# There is an error in CMAKE with this flag for pgf90. Unset it +GET_FILENAME_COMPONENT(FCNAME ${CMAKE_Fortran_COMPILER} NAME) +IF(FCNAME STREQUAL "pgf90") + UNSET(CMAKE_SHARED_LIBRARY_LINK_Fortran_FLAGS) +ENDIF(FCNAME STREQUAL "pgf90") + +############################################################ +# Define the actual files and folders that make up the build +############################################################ + +# Define the executable name +SET(FOOEXE swiftest_driver) + +# Define some directories +SET(SRC ${CMAKE_SOURCE_DIR}/src) +SET(LIB ${CMAKE_SOURCE_DIR}/lib) +SET(BIN ${CMAKE_SOURCE_DIR}/bin) + +# Have the .mod files placed in the lib folder +SET(CMAKE_Fortran_MODULE_DIRECTORY ${LIB}) + +# The source for the FOO binary and have it placed in the bin folder +ADD_SUBDIRECTORY(${SRC} ${BIN}) + +# Add a distclean target to the Makefile +ADD_CUSTOM_TARGET(distclean + COMMAND ${CMAKE_COMMAND} -P ${CMAKE_SOURCE_DIR}/distclean.cmake +) diff --git a/bin/.gitignore b/bin/.gitignore deleted file mode 100644 index e69de29bb..000000000 diff --git a/cmake/Modules/FindNETCDF.cmake b/cmake/Modules/FindNETCDF.cmake new file mode 100644 index 000000000..f8e97dbca --- /dev/null +++ b/cmake/Modules/FindNETCDF.cmake @@ -0,0 +1,9 @@ +# - Finds the NetCDF libraries +find_path(NETCDF_INCLUDE_DIR NAMES netcdf.mod HINTS ENV NETCDF_FORTRAN_HOME) +find_library(NETCDF_LIBRARY NAMES netcdf HINTS ENV NETCDF_FORTRAN_HOME) +find_library(NETCDF_FORTRAN_LIBRARY NAMES netcdff HINTS ENV NETCDF_FORTRAN_HOME) + +set(NETCDF_FOUND TRUE) +set(NETCDF_INCLUDE_DIRS ${NETCDF_INCLUDE_DIR}) +set(NETCDF_LIBRARIES ${NETCDF_LIBRARY} ${NETCDF_FORTRAN_LIBRARY}) +mark_as_advanced(NETCDF_LIBRARY NETCDF_FORTRAN_LIBRARY NETCDF_INCLUDE_DIR) \ No newline at end of file diff --git a/cmake/Modules/FindOpenMP_Fortran.cmake b/cmake/Modules/FindOpenMP_Fortran.cmake new file mode 100644 index 000000000..bc440ae10 --- /dev/null +++ b/cmake/Modules/FindOpenMP_Fortran.cmake @@ -0,0 +1,104 @@ +# - Finds OpenMP support +# This module can be used to detect OpenMP support in a compiler. +# If the compiler supports OpenMP, the flags required to compile with +# openmp support are set. +# +# This module was modified from the standard FindOpenMP module to find Fortran +# flags. +# +# The following variables are set: +# OpenMP_Fortran_FLAGS - flags to add to the Fortran compiler for OpenMP +# support. In general, you must use these at both +# compile- and link-time. +# OMP_NUM_PROCS - the max number of processors available to OpenMP + +#============================================================================= +# Copyright 2009 Kitware, Inc. +# Copyright 2008-2009 André Rigland Brodtkorb +# +# Distributed under the OSI-approved BSD License (the "License"); +# see accompanying file Copyright.txt for details. +# +# This software is distributed WITHOUT ANY WARRANTY; without even the +# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +# See the License for more information. +#============================================================================= +# (To distribute this file outside of CMake, substitute the full +# License text for the above reference.) + +INCLUDE (${CMAKE_ROOT}/Modules/FindPackageHandleStandardArgs.cmake) + +SET (OpenMP_Fortran_FLAG_CANDIDATES + #Microsoft Visual Studio + "/openmp" + #Intel windows + "/Qopenmp" + #Intel + "-qopenmp" + #Gnu + "-fopenmp" + #Empty, if compiler automatically accepts openmp + " " + #Sun + "-xopenmp" + #HP + "+Oopenmp" + #IBM XL C/c++ + "-qsmp" + #Portland Group + "-mp" +) + +IF (DEFINED OpenMP_Fortran_FLAGS) + SET (OpenMP_Fortran_FLAG_CANDIDATES) +ENDIF (DEFINED OpenMP_Fortran_FLAGS) + +# check fortran compiler. also determine number of processors +FOREACH (FLAG ${OpenMP_Fortran_FLAG_CANDIDATES}) + SET (SAFE_CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS}") + SET (CMAKE_REQUIRED_FLAGS "${FLAG}") + UNSET (OpenMP_FLAG_DETECTED CACHE) + MESSAGE (STATUS "Try OpenMP Fortran flag = [${FLAG}]") + FILE (WRITE "${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/testFortranOpenMP.f90" +" +program TestOpenMP + use omp_lib + write(*,'(I2)',ADVANCE='NO') omp_get_num_procs() +end program TestOpenMP +") + SET (MACRO_CHECK_FUNCTION_DEFINITIONS + "-DOpenMP_FLAG_DETECTED ${CMAKE_REQUIRED_FLAGS}") + TRY_RUN (OpenMP_RUN_FAILED OpenMP_FLAG_DETECTED ${CMAKE_BINARY_DIR} + ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/testFortranOpenMP.f90 + COMPILE_DEFINITIONS ${CMAKE_REQUIRED_DEFINITIONS} + CMAKE_FLAGS -DCOMPILE_DEFINITIONS:STRING=${MACRO_CHECK_FUNCTION_DEFINITIONS} + COMPILE_OUTPUT_VARIABLE OUTPUT + RUN_OUTPUT_VARIABLE OMP_NUM_PROCS_INTERNAL) + IF (OpenMP_FLAG_DETECTED) + FILE (APPEND ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeOutput.log + "Determining if the Fortran compiler supports OpenMP passed with " + "the following output:\n${OUTPUT}\n\n") + SET (OpenMP_FLAG_DETECTED 1) + IF (OpenMP_RUN_FAILED) + MESSAGE (FATAL_ERROR "OpenMP found, but test code did not run") + ENDIF (OpenMP_RUN_FAILED) + SET (OMP_NUM_PROCS ${OMP_NUM_PROCS_INTERNAL} CACHE + STRING "Number of processors OpenMP may use" FORCE) + SET (OpenMP_Fortran_FLAGS_INTERNAL "${FLAG}") + BREAK () + ELSE () + FILE (APPEND ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeError.log + "Determining if the Fortran compiler supports OpenMP failed with " + "the following output:\n${OUTPUT}\n\n") + SET (OpenMP_FLAG_DETECTED 0) + ENDIF (OpenMP_FLAG_DETECTED) +ENDFOREACH (FLAG ${OpenMP_Fortran_FLAG_CANDIDATES}) + +SET (OpenMP_Fortran_FLAGS "${OpenMP_Fortran_FLAGS_INTERNAL}" + CACHE STRING "Fortran compiler flags for OpenMP parallization") + +# handle the standard arguments for FIND_PACKAGE +FIND_PACKAGE_HANDLE_STANDARD_ARGS (OpenMP_Fortran DEFAULT_MSG + OpenMP_Fortran_FLAGS) + +MARK_AS_ADVANCED(OpenMP_Fortran_FLAGS) diff --git a/cmake/Modules/SetCompileFlag.cmake b/cmake/Modules/SetCompileFlag.cmake new file mode 100644 index 000000000..04ff3ffbd --- /dev/null +++ b/cmake/Modules/SetCompileFlag.cmake @@ -0,0 +1,112 @@ +############################################################################# +# Given a list of flags, this function will try each, one at a time, +# and choose the first flag that works. If no flags work, then nothing +# will be set, unless the REQUIRED key is given, in which case an error +# will be given. +# +# Call is: +# SET_COMPILE_FLAG(FLAGVAR FLAGVAL (Fortran|C|CXX) flag1 flag2...) +# +# For example, if you have the flag CMAKE_C_FLAGS and you want to add +# warnings and want to fail if this is not possible, you might call this +# function in this manner: +# SET_COMPILE_FLAGS(CMAKE_C_FLAGS "${CMAKE_C_FLAGS}" C REQUIRED +# "-Wall" # GNU +# "-warn all" # Intel +# ) +# The optin "-Wall" will be checked first, and if it works, will be +# appended to the CMAKE_C_FLAGS variable. If it doesn't work, then +# "-warn all" will be tried. If this doesn't work then checking will +# terminate because REQUIRED was given. +# +# The reasong that the variable must be given twice (first as the name then +# as the value in quotes) is because of the way CMAKE handles the passing +# of variables in functions; it is difficult to extract a variable's +# contents and assign new values to it from within a function. +############################################################################# + +INCLUDE(${CMAKE_ROOT}/Modules/CheckCCompilerFlag.cmake) +INCLUDE(${CMAKE_ROOT}/Modules/CheckCXXCompilerFlag.cmake) + +FUNCTION(SET_COMPILE_FLAG FLAGVAR FLAGVAL LANG) + + # Do some up front setup if Fortran + IF(LANG STREQUAL "Fortran") + # Create a list of error messages from compilers + SET(FAIL_REGEX + "ignoring unknown option" # Intel + "invalid argument" # Intel + "unrecognized .*option" # GNU + "[Uu]nknown switch" # Portland Group + "ignoring unknown option" # MSVC + "warning D9002" # MSVC, any lang + "[Uu]nknown option" # HP + "[Ww]arning: [Oo]ption" # SunPro + "command option .* is not recognized" # XL + ) + ENDIF(LANG STREQUAL "Fortran") + + # Make a variable holding the flags. Filter out REQUIRED if it is there + SET(FLAG_REQUIRED FALSE) + SET(FLAG_FOUND FALSE) + UNSET(FLAGLIST) + FOREACH (var ${ARGN}) + STRING(TOUPPER "${var}" UP) + IF(UP STREQUAL "REQUIRED") + SET(FLAG_REQUIRED TRUE) + ELSE() + SET(FLAGLIST ${FLAGLIST} "${var}") + ENDIF(UP STREQUAL "REQUIRED") + ENDFOREACH (var ${ARGN}) + + # Now, loop over each flag + FOREACH(flag ${FLAGLIST}) + + UNSET(FLAG_WORKS) + # Check the flag for the given language + IF(LANG STREQUAL "C") + CHECK_C_COMPILER_FLAG("${flag}" FLAG_WORKS) + ELSEIF(LANG STREQUAL "CXX") + CHECK_CXX_COMPILER_FLAG("${flag}" FLAG_WORKS) + ELSEIF(LANG STREQUAL "Fortran") + # There is no nice function to do this for FORTRAN, so we must manually + # create a test program and check if it compiles with a given flag. + SET(TESTFILE "${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}") + SET(TESTFILE "${TESTFILE}/CMakeTmp/testFortranFlags.f90") + FILE(WRITE "${TESTFILE}" +" +program dummyprog + i = 5 +end program dummyprog +") + TRY_COMPILE(FLAG_WORKS ${CMAKE_BINARY_DIR} ${TESTFILE} + COMPILE_DEFINITIONS "${flag}" OUTPUT_VARIABLE OUTPUT) + + # Check that the output message doesn't match any errors + FOREACH(rx ${FAIL_REGEX}) + IF("${OUTPUT}" MATCHES "${rx}") + SET(FLAG_WORKS FALSE) + ENDIF("${OUTPUT}" MATCHES "${rx}") + ENDFOREACH(rx ${FAIL_REGEX}) + + ELSE() + MESSAGE(FATAL_ERROR "Unknown language in SET_COMPILE_FLAGS: ${LANG}") + ENDIF(LANG STREQUAL "C") + + # If this worked, use these flags, otherwise use other flags + IF(FLAG_WORKS) + # Append this flag to the end of the list that already exists + SET(${FLAGVAR} "${FLAGVAL} ${flag}" CACHE STRING + "Set the ${FLAGVAR} flags" FORCE) + SET(FLAG_FOUND TRUE) + BREAK() # We found something that works, so exit + ENDIF(FLAG_WORKS) + + ENDFOREACH(flag ${FLAGLIST}) + + # Raise an error if no flag was found + IF(FLAG_REQUIRED AND NOT FLAG_FOUND) + MESSAGE(FATAL_ERROR "No compile flags were found") + ENDIF(FLAG_REQUIRED AND NOT FLAG_FOUND) + +ENDFUNCTION() diff --git a/cmake/Modules/SetFortranFlags.cmake b/cmake/Modules/SetFortranFlags.cmake new file mode 100644 index 000000000..926547bbb --- /dev/null +++ b/cmake/Modules/SetFortranFlags.cmake @@ -0,0 +1,296 @@ +###################################################### +# Determine and set the Fortran compiler flags we want +###################################################### + +#################################################################### +# Make sure that the default build type is RELEASE if not specified. +#################################################################### +INCLUDE(${CMAKE_MODULE_PATH}/SetCompileFlag.cmake) + +# Make sure the build type is uppercase +STRING(TOUPPER "${CMAKE_BUILD_TYPE}" BT) + +IF(BT STREQUAL "RELEASE") + SET(CMAKE_BUILD_TYPE RELEASE CACHE STRING + "Choose the type of build, options are DEBUG, RELEASE, or TESTING." + FORCE) +ELSEIF(BT STREQUAL "DEBUG") + SET (CMAKE_BUILD_TYPE DEBUG CACHE STRING + "Choose the type of build, options are DEBUG, RELEASE, or TESTING." + FORCE) +ELSEIF(BT STREQUAL "TESTING") + SET (CMAKE_BUILD_TYPE TESTING CACHE STRING + "Choose the type of build, options are DEBUG, RELEASE, or TESTING." + FORCE) +ELSEIF(NOT BT) + SET(CMAKE_BUILD_TYPE RELEASE CACHE STRING + "Choose the type of build, options are DEBUG, RELEASE, or TESTING." + FORCE) + MESSAGE(STATUS "CMAKE_BUILD_TYPE not given, defaulting to RELEASE") +ELSE() + MESSAGE(FATAL_ERROR "CMAKE_BUILD_TYPE not valid, choices are DEBUG, RELEASE, or TESTING") +ENDIF(BT STREQUAL "RELEASE") + +######################################################### +# If the compiler flags have already been set, return now +######################################################### + +IF(CMAKE_Fortran_FLAGS_RELEASE AND CMAKE_Fortran_FLAGS_TESTING AND CMAKE_Fortran_FLAGS_DEBUG) + RETURN () +ENDIF(CMAKE_Fortran_FLAGS_RELEASE AND CMAKE_Fortran_FLAGS_TESTING AND CMAKE_Fortran_FLAGS_DEBUG) + +######################################################################## +# Determine the appropriate flags for this compiler for each build type. +# For each option type, a list of possible flags is given that work +# for various compilers. The first flag that works is chosen. +# If none of the flags work, nothing is added (unless the REQUIRED +# flag is given in the call). This way unknown compiles are supported. +####################################################################### + +##################### +### GENERAL FLAGS ### +##################### + +# Don't add underscores in symbols for C-compatability +SET_COMPILE_FLAG(CMAKE_Fortran_FLAGS "${CMAKE_Fortran_FLAGS}" + Fortran "-fno-underscoring") + +# There is some bug where -march=native doesn't work on Mac +IF(APPLE) + SET(GNUNATIVE "-mtune=native") +ELSE() + SET(GNUNATIVE "-march=native") +ENDIF() +# Optimize for the host's architecture +SET_COMPILE_FLAG(CMAKE_Fortran_FLAGS "${CMAKE_Fortran_FLAGS}" + Fortran "-xhost" # Intel + "/QxHost" # Intel Windows + ${GNUNATIVE} # GNU + "-ta=host" # Portland Group + ) + +################### +### DEBUG FLAGS ### +################### + +# NOTE: debugging symbols (-g or /debug:full) are already on by default + +# Disable optimizations +SET_COMPILE_FLAG(CMAKE_Fortran_FLAGS_DEBUG "${CMAKE_Fortran_FLAGS_DEBUG}" + Fortran REQUIRED "-O0" # All compilers not on Windows + "/Od" # Intel Windows + "-Og" # GNU (gfortran) + ) + +# Turn on all warnings +SET_COMPILE_FLAG(CMAKE_Fortran_FLAGS_DEBUG "${CMAKE_Fortran_FLAGS_DEBUG}" + Fortran "-warn all" # Intel + "/warn:all" # Intel Windows + "-Wall" # GNU + # Portland Group (on by default) + ) + +# Traceback +SET_COMPILE_FLAG(CMAKE_Fortran_FLAGS_DEBUG "${CMAKE_Fortran_FLAGS_DEBUG}" + Fortran "-traceback" # Intel/Portland Group + "/traceback" # Intel Windows + "-fbacktrace" # GNU (gfortran) + "-ftrace=full" # GNU (g95) + ) + +# Check array bounds +SET_COMPILE_FLAG(CMAKE_Fortran_FLAGS_DEBUG "${CMAKE_Fortran_FLAGS_DEBUG}" + Fortran "-check bounds" # Intel + "/check:bounds" # Intel Windows + "-fcheck=bounds" # GNU (New style) + "-fbounds-check" # GNU (Old style) + "-Mbounds" # Portland Group + ) + +# Initializes matrices/arrays with NaN values +SET_COMPILE_FLAG(CMAKE_Fortran_FLAGS_DEBUG "${CMAKE_Fortran_FLAGS_DEBUG}" + Fortran "-init=snan,arrays" # Intel + ) + +# Does not generate an interface block for each routine in a source file +SET_COMPILE_FLAG(CMAKE_Fortran_FLAGS_DEBUG "${CMAKE_Fortran_FLAGS_DEBUG}" + Fortran "-nogen-interfaces" # Intel + ) + +# Does not generate aposition independent executable +SET_COMPILE_FLAG(CMAKE_Fortran_FLAGS_DEBUG "${CMAKE_Fortran_FLAGS_DEBUG}" + Fortran "-no-pie" # Intel + ) + +# Does not set denormal results from floating-point calculations to zero +SET_COMPILE_FLAG(CMAKE_Fortran_FLAGS_DEBUG "${CMAKE_Fortran_FLAGS_DEBUG}" + Fortran "-no-ftz" # Intel + ) + +# Enables floating-point invalid, divide-by-zero, and overflow exceptions +SET_COMPILE_FLAG(CMAKE_Fortran_FLAGS_DEBUG "${CMAKE_Fortran_FLAGS_DEBUG}" + Fortran "-fpe-all=0" # Intel + ) + +# Improves floating-point precision and consistency +SET_COMPILE_FLAG(CMAKE_Fortran_FLAGS_DEBUG "${CMAKE_Fortran_FLAGS_DEBUG}" + Fortran "-mp1" # Intel + ) + +# Strict model for floating-point calculations (precise and except) +SET_COMPILE_FLAG(CMAKE_Fortran_FLAGS_DEBUG "${CMAKE_Fortran_FLAGS_DEBUG}" + Fortran "-fp-model strict" # Intel + ) + +# Enables floating-point invalid, divide-by-zero, and overflow exceptions +SET_COMPILE_FLAG(CMAKE_Fortran_FLAGS_DEBUG "${CMAKE_Fortran_FLAGS_DEBUG}" + Fortran "-fpe0" # Intel + ) + +# Enables debug info +SET_COMPILE_FLAG(CMAKE_Fortran_FLAGS_DEBUG "${CMAKE_Fortran_FLAGS_DEBUG}" + Fortran "-debug all" # Intel + ) + +# Aligns a variable to a specified boundary and offset +SET_COMPILE_FLAG(CMAKE_Fortran_FLAGS_DEBUG "${CMAKE_Fortran_FLAGS_DEBUG}" + Fortran "-align all" # Intel + ) + +# Enables changing the variable and array memory layout +SET_COMPILE_FLAG(CMAKE_Fortran_FLAGS_DEBUG "${CMAKE_Fortran_FLAGS_DEBUG}" + Fortran "-pad" # Intel + ) + +# Enables additional interprocedural optimizations for a single file cimpilation +SET_COMPILE_FLAG(CMAKE_Fortran_FLAGS_DEBUG "${CMAKE_Fortran_FLAGS_DEBUG}" + Fortran "-ip" # Intel + ) + +# Improves precision when dividing floating-points +SET_COMPILE_FLAG(CMAKE_Fortran_FLAGS_DEBUG "${CMAKE_Fortran_FLAGS_DEBUG}" + Fortran "-prec-div" # Intel + ) + +# Improves precision when taking the square root of floating-points +SET_COMPILE_FLAG(CMAKE_Fortran_FLAGS_DEBUG "${CMAKE_Fortran_FLAGS_DEBUG}" + Fortran "-prec-sqrt" # Intel + ) + +# Treat parentheses in accordance with the Fortran standard (ifort 10 only) +SET_COMPILE_FLAG(CMAKE_Fortran_FLAGS_DEBUG "${CMAKE_Fortran_FLAGS_DEBUG}" + Fortran "-assume protect-parens" # Intel + ) + +# Checks the bounds of arrays at run-time +SET_COMPILE_FLAG(CMAKE_Fortran_FLAGS_DEBUG "${CMAKE_Fortran_FLAGS_DEBUG}" + Fortran "-CB" # Intel + ) + +# Allows for lines longer than 80 characters without truncation +SET_COMPILE_FLAG(CMAKE_Fortran_FLAGS_DEBUG "${CMAKE_Fortran_FLAGS_DEBUG}" + Fortran "-no-wrap-margin" # Intel + "-ffree-line-length-none" # GNU (gfortran) + ) + +##################### +### TESTING FLAGS ### +##################### + +# Optimizations +SET_COMPILE_FLAG(CMAKE_Fortran_FLAGS_TESTING "${CMAKE_Fortran_FLAGS_TESTING}" + Fortran REQUIRED "-O2" # All compilers not on Windows + "/O2" # Intel Windows + ) + +##################### +### RELEASE FLAGS ### +##################### + +# NOTE: agressive optimizations (-O3) are already turned on by default + +# Unroll loops +SET_COMPILE_FLAG(CMAKE_Fortran_FLAGS_RELEASE "${CMAKE_Fortran_FLAGS_RELEASE}" + Fortran "-funroll-loops" # GNU + "-unroll" # Intel + "/unroll" # Intel Windows + "-Munroll" # Portland Group + ) + +# Inline functions +SET_COMPILE_FLAG(CMAKE_Fortran_FLAGS_RELEASE "${CMAKE_Fortran_FLAGS_RELEASE}" + Fortran "-inline" # Intel + "/Qinline" # Intel Windows + "-finline-functions" # GNU + "-Minline" # Portland Group + ) + +# Interprocedural (link-time) optimizations +SET_COMPILE_FLAG(CMAKE_Fortran_FLAGS_RELEASE "${CMAKE_Fortran_FLAGS_RELEASE}" + Fortran "-ipo" # Intel + "/Qipo" # Intel Windows + "-flto" # GNU + "-Mipa" # Portland Group + ) + +# Single-file optimizations +SET_COMPILE_FLAG(CMAKE_Fortran_FLAGS_RELEASE "${CMAKE_Fortran_FLAGS_RELEASE}" + Fortran "-ip" # Intel + "/Qip" # Intel Windows + ) + +# Allows for lines longer than 80 characters without truncation +SET_COMPILE_FLAG(CMAKE_Fortran_FLAGS_RELEASE "${CMAKE_Fortran_FLAGS_RELEASE}" + Fortran "-no-wrap-margin" # Intel + "-ffree-line-length-none" # GNU (gfortran) + ) + +# Disables prefetch insertion optimization +SET_COMPILE_FLAG(CMAKE_Fortran_FLAGS_RELEASE "${CMAKE_Fortran_FLAGS_RELEASE}" + Fortran "-qopt-prefetch=0" # Intel + ) + +# Calls the Matrix Multiply library +SET_COMPILE_FLAG(CMAKE_Fortran_FLAGS_RELEASE "${CMAKE_Fortran_FLAGS_RELEASE}" + Fortran "-qopt-matmul" # Intel + ) + +# Saves the compiler options and version number to the executable +SET_COMPILE_FLAG(CMAKE_Fortran_FLAGS_RELEASE "${CMAKE_Fortran_FLAGS_RELEASE}" + Fortran "-sox" # Intel + ) + +# Enforces vectorization of loops +SET_COMPILE_FLAG(CMAKE_Fortran_FLAGS_RELEASE "${CMAKE_Fortran_FLAGS_RELEASE}" + Fortran "-simd" # Intel + ) + +# Aligns a variable to a specified boundary and offset +SET_COMPILE_FLAG(CMAKE_Fortran_FLAGS_RELEASE "${CMAKE_Fortran_FLAGS_RELEASE}" + Fortran "-align all" # Intel + ) + +# Assume all objects are contiguous in memory +SET_COMPILE_FLAG(CMAKE_Fortran_FLAGS_RELEASE "${CMAKE_Fortran_FLAGS_RELEASE}" + Fortran "-assume contiguous_assumed_shape" # Intel + ) + +# Generate an extended set of vector functions +SET_COMPILE_FLAG(CMAKE_Fortran_FLAGS_RELEASE "${CMAKE_Fortran_FLAGS_RELEASE}" + Fortran "-vecabi=cmdtarget" # Intel + ) + +# No floating-point exceptions +SET_COMPILE_FLAG(CMAKE_Fortran_FLAGS_RELEASE "${CMAKE_Fortran_FLAGS_RELEASE}" + Fortran "-fp-model no-except" # Intel + ) + +# Generate fused multiply-add instructions +SET_COMPILE_FLAG(CMAKE_Fortran_FLAGS_RELEASE "${CMAKE_Fortran_FLAGS_RELEASE}" + Fortran "-fma" # Intel + ) + +# Enables agressive optimixation on floating-points +SET_COMPILE_FLAG(CMAKE_Fortran_FLAGS_RELEASE "${CMAKE_Fortran_FLAGS_RELEASE}" + Fortran "-fp-model=fast" # Intel + ) diff --git a/cmake/Modules/SetParallelizationLibrary.cmake b/cmake/Modules/SetParallelizationLibrary.cmake new file mode 100644 index 000000000..603d4299c --- /dev/null +++ b/cmake/Modules/SetParallelizationLibrary.cmake @@ -0,0 +1,39 @@ +# Turns on either OpenMP or MPI +# If both are requested, the other is disabled +# When one is turned on, the other is turned off +# If both are off, we explicitly disable them just in case + +IF (USE_OPENMP AND USE_MPI) + MESSAGE (FATAL_ERROR "Cannot use both OpenMP and MPI") +ELSEIF (USE_OPENMP) + # Find OpenMP + IF (NOT OpenMP_Fortran_FLAGS) + FIND_PACKAGE (OpenMP_Fortran) + IF (NOT OpenMP_Fortran_FLAGS) + MESSAGE (FATAL_ERROR "Fortran compiler does not support OpenMP") + ENDIF (NOT OpenMP_Fortran_FLAGS) + ENDIF (NOT OpenMP_Fortran_FLAGS) + # Turn of MPI + UNSET (MPI_FOUND CACHE) + UNSET (MPI_COMPILER CACHE) + UNSET (MPI_LIBRARY CACHE) +ELSEIF (USE_MPI) + # Find MPI + IF (NOT MPI_Fortran_FOUND) + FIND_PACKAGE (MPI REQUIRED) + ENDIF (NOT MPI_Fortran_FOUND) + # Turn off OpenMP + SET (OMP_NUM_PROCS 0 CACHE + STRING "Number of processors OpenMP may use" FORCE) + UNSET (OpenMP_C_FLAGS CACHE) + UNSET (GOMP_Fortran_LINK_FLAGS CACHE) +ELSE () + # Turn off both OpenMP and MPI + SET (OMP_NUM_PROCS 0 CACHE + STRING "Number of processors OpenMP may use" FORCE) + UNSET (OpenMP_Fortran_FLAGS CACHE) + UNSET (GOMP_Fortran_LINK_FLAGS CACHE) + UNSET (MPI_FOUND CACHE) + UNSET (MPI_COMPILER CACHE) + UNSET (MPI_LIBRARY CACHE) +ENDIF (USE_OPENMP AND USE_MPI) diff --git a/cmake/Modules/SetUpNetCDF.cmake b/cmake/Modules/SetUpNetCDF.cmake new file mode 100644 index 000000000..dbfe44c4b --- /dev/null +++ b/cmake/Modules/SetUpNetCDF.cmake @@ -0,0 +1,5 @@ +# Find NetCDF if not already found +IF(NOT NETCDF_FOUND) + ENABLE_LANGUAGE(C) # Some libraries need a C compiler to find + FIND_PACKAGE(NETCDF REQUIRED) +ENDIF(NOT NETCDF_FOUND) diff --git a/distclean.cmake b/distclean.cmake new file mode 100644 index 000000000..8e24f9e49 --- /dev/null +++ b/distclean.cmake @@ -0,0 +1,68 @@ +# This CMake script will delete build directories and files to bring the +# package back to it's distribution state + +# We want to start from the top of the source dir, so if we are in build +# we want to start one directory up +GET_FILENAME_COMPONENT(BASEDIR ${CMAKE_SOURCE_DIR} NAME) +IF(${BASEDIR} STREQUAL "build") + SET(TOPDIR "${CMAKE_SOURCE_DIR}/..") +ELSE() + SET(TOPDIR "${CMAKE_SOURCE_DIR}") +ENDIF() + +MACRO(GET_PARENT_DIRECTORIES search_string return_list grandparents) + FILE(GLOB_RECURSE new_list ${search_string}) + SET(dir_list "") + FOREACH(file_path ${new_list}) + GET_FILENAME_COMPONENT(dir_path ${file_path} PATH) + # Remove an extra directory component to return grandparent + IF(${grandparents}) + # Tack on a fake extension to trick CMake into removing a second + # path component + SET(dir_path "${dir_path}.tmp") + GET_FILENAME_COMPONENT(dir_path ${dir_path} PATH) + ENDIF(${grandparents}) + SET(dir_list ${dir_list} ${dir_path}) + ENDFOREACH() + LIST(REMOVE_DUPLICATES dir_list) + SET(${return_list} ${dir_list}) +ENDMACRO() + +# Find directories and files that we will want to remove +FILE(GLOB_RECURSE CMAKECACHE "${TOPDIR}/*CMakeCache.txt") +FILE(GLOB_RECURSE CMAKEINSTALL "${TOPDIR}/*cmake_install.cmake" + "${TOPDIR}/*install_manifest.txt") +FILE(GLOB_RECURSE MAKEFILE "${TOPDIR}/*Makefile") +FILE(GLOB_RECURSE CMAKETESTFILES "${TOPDIR}/*CTestTestfile.cmake") +SET(TOPDIRECTORIES "${TOPDIR}/lib" + "${TOPDIR}/test" + "${TOPDIR}/bin" +) + +# CMake has trouble finding directories recursively, so locate these +# files and then save the parent directory of the files +GET_PARENT_DIRECTORIES(Makefile.cmake CMAKEFILES 0) +GET_PARENT_DIRECTORIES(LastTest.log CMAKETESTING 1) + +# Place these files and directories into a list +SET(DEL ${TOPDIRECTORIES} + ${CMAKECACHE} + ${CMAKEINSTALL} + ${MAKEFILE} + ${CMAKEFILES} + ${CMAKETESTING} + ${CMAKETESTFILES} +) + +# If we are not in the build dir, delete that as well +IF(NOT (${BASEDIR} STREQUAL "build")) + FILE(GLOB BUILD "${TOPDIR}/build") + SET(DEL ${DEL} ${BUILD}) +ENDIF() + +# Loop over the directories and delete each one +FOREACH(D ${DEL}) + IF(EXISTS ${D}) + FILE(REMOVE_RECURSE ${D}) + ENDIF() +ENDFOREACH() diff --git a/examples/helio_neptune_pluto/param.in b/examples/helio_neptune_pluto/param.in new file mode 100644 index 000000000..27c0f31b2 --- /dev/null +++ b/examples/helio_neptune_pluto/param.in @@ -0,0 +1,33 @@ +! VERSION Swiftest parameter input from file param.in +T0 0.0 +TSTOP 100000.0 +DT 5.0 +ISTEP_OUT 20 +ISTEP_DUMP 20 +OUT_FORM XVEL +OUT_TYPE NETCDF_DOUBLE +OUT_STAT REPLACE +IN_TYPE NETCDF_DOUBLE +BIN_OUT bin.nc +CHK_QMIN 0.004650467260962157 +CHK_RMIN 0.004650467260962157 +CHK_RMAX 1000.0 +CHK_EJECT 1000.0 +CHK_QMIN_COORD HELIO +CHK_QMIN_RANGE 0.004650467260962157 1000.0 +MU2KG 1.988409870698051e+30 +TU2S 31557600.0 +DU2M 149597870700.0 +IN_FORM XV +NC_IN init_cond.nc +EXTRA_FORCE NO +BIG_DISCARD NO +CHK_CLOSE NO +RHILL_PRESENT NO +FRAGMENTATION NO +ROTATION NO +TIDES NO +ENERGY YES +GR NO +INTERACTION_LOOPS TRIANGULAR +ENCOUNTER_CHECK TRIANGULAR diff --git a/examples/symba_hungarias/swifter/control_planets/hungarias_5pl_500tp_17_param.in b/examples/symba_hungarias/swifter/control_planets/hungarias_5pl_500tp_17_param.in new file mode 100644 index 000000000..ba1fb3c2b --- /dev/null +++ b/examples/symba_hungarias/swifter/control_planets/hungarias_5pl_500tp_17_param.in @@ -0,0 +1,38 @@ +! VERSION Swiftest parameter input +T0 0.0 +TSTOP 200000000.0 +DT 0.005 +ISTEP_OUT 200000 +ISTEP_DUMP 200000 +OUT_FORM XVEL +OUT_TYPE NETCDF_DOUBLE +OUT_STAT REPLACE +IN_TYPE ASCII +PL_IN hungarias_5pl_500tp_17_pl.in +TP_IN hungarias_5pl_500tp_17_tp.in +CB_IN hungarias_5pl_500tp_17_sun_MsunAUYR.in +BIN_OUT hungarias_5pl_500tp_17_out.nc +CHK_QMIN -1.0 +CHK_RMIN -1.0 +CHK_RMAX 1000.0 +CHK_EJECT 1000.0 +CHK_QMIN_COORD HELIO +CHK_QMIN_RANGE -1.0 -1.0 +MU2KG 1.988409870698051e+30 +TU2S 31557600.0 +DU2M 149597870700.0 +IN_FORM EL +EXTRA_FORCE NO +PARTICLE_OUT hungarias_5pl_500tp_17_particle.dat +BIG_DISCARD NO +CHK_CLOSE YES +RHILL_PRESENT YES +FRAGMENTATION NO +ROTATION YES +TIDES NO +ENERGY YES +GR YES +INTERACTION_LOOPS ADAPTIVE +ENCOUNTER_CHECK ADAPTIVE +ENERGY_OUT hungarias_5pl_500tp_17_energy.dat +GMTINY 3.646098141953443043e-08 diff --git a/examples/symba_hungarias/swifter/control_planets/hungarias_5pl_500tp_17_pl.in b/examples/symba_hungarias/swifter/control_planets/hungarias_5pl_500tp_17_pl.in new file mode 100644 index 000000000..cd9d16020 --- /dev/null +++ b/examples/symba_hungarias/swifter/control_planets/hungarias_5pl_500tp_17_pl.in @@ -0,0 +1,49 @@ +8 +Mercury 6.553709809565314146e-06 0.0014751274117575772341 +1.6306381826061645943e-05 +0.38709894990924181846 0.20562369687869339052 7.0036069691825035832 +48.302897646473702764 29.190213908309409874 163.69992642152809026 +0.0 0.0 0.34599999999999997424 +3.5735549824428292985 -18.380047749494480457 34.361526740492798437 +Venus 9.6633133995815381836e-05 0.006759122875155079725 +4.0453784346544178454e-05 +0.7233300630551103838 0.006773384545514573099 3.394505355540899938 +76.62090440289564697 55.183156101464518883 271.2285045598760007 +0.0 0.0 0.4000000000000000222 +0.17650282045605921225 -3.6612475825356215592 8.702866268072763821 +Earth 0.000120026935827952456416 0.010044657392872289059 +4.25875607065040958e-05 +0.99999328599172943033 0.01668004783869252855 0.0027793940989077428085 +175.84932558359508903 287.2227751976308241 324.72725799674782365 +0.0 0.0 0.33069999999999999396 +4.827962479462605839 0.034731626640621778608 2301.2114260455621944 +Mars 1.2739802010675941808e-05 0.007246146587933918669 +2.265740805092889601e-05 +1.5236121180553410248 0.093387475645674775104 1.8479297186242829021 +49.490271729763087194 286.7387645553690163 252.78317601821959215 +0.0 0.0 0.3644000000000000017 +997.9376283354346323 -909.38573894978675416 1783.4600697011568969 +Jupiter 0.03769225108898567778 0.35525381666404283465 +0.00046732617030490929307 +5.203268729924161562 0.04848413524543258163 1.3035624911873560094 +100.51639734596980702 273.421918018626684 325.351028522703416 +0.0 0.0 0.27560000000000001164 +-80.967241888586720104 -2387.9998942634933492 5008.7344122962876782 +Saturn 0.01128589982009127331 0.43764770913411007376 +0.00038925687730393611812 +9.581513697274186114 0.05248801962394190196 2.4862838811768979141 +113.59546767797320399 335.45662431368151601 228.84653123700309152 +0.0 0.0 0.22000000000000000111 +441.9323685947327233 378.52918410105413535 5135.911248678291292 +Uranus 0.001723658947826773068 0.4699394560146697986 +0.00016953449859497231466 +19.24773626798451076 0.04408736292912442123 0.7704474968533898682 +74.09072726634606454 95.12631113857929677 237.66915583105441101 +0.0 0.0 0.23000000000000000999 +-677.3000258209181323 -3008.109907190578637 -836.301326618569835 +Neptune 0.0020336100526728302882 0.7816500366521773358 +0.000164587904124493665 +30.297815841143489024 0.013873050398302080172 1.7688477929856469828 +131.74107055888509876 246.83916166351488641 334.07963351871291025 +0.0 0.0 0.23000000000000000999 +1231.0256802954641403 -2178.2009371051150557 2329.6179923847095223 diff --git a/examples/symba_hungarias/swifter/control_planets/hungarias_5pl_500tp_17_sun_MsunAUYR.in b/examples/symba_hungarias/swifter/control_planets/hungarias_5pl_500tp_17_sun_MsunAUYR.in new file mode 100644 index 000000000..b2cb85c35 --- /dev/null +++ b/examples/symba_hungarias/swifter/control_planets/hungarias_5pl_500tp_17_sun_MsunAUYR.in @@ -0,0 +1,7 @@ +Sun +39.476926408897626 +0.004650467260962157 +4.7535806948127355e-12 +-2.2473967953572827e-18 +0.0 0.0 0.07 +11.209306302144773 -38.759372036774764 82.25088158389266 diff --git a/examples/symba_hungarias/swifter/control_planets/hungarias_5pl_500tp_17_tp.in b/examples/symba_hungarias/swifter/control_planets/hungarias_5pl_500tp_17_tp.in new file mode 100644 index 000000000..573541ac9 --- /dev/null +++ b/examples/symba_hungarias/swifter/control_planets/hungarias_5pl_500tp_17_tp.in @@ -0,0 +1 @@ +0 diff --git a/examples/symba_hungarias/swifter/control_planets/param.swifter.in b/examples/symba_hungarias/swifter/control_planets/param.swifter.in new file mode 100644 index 000000000..b39e5a947 --- /dev/null +++ b/examples/symba_hungarias/swifter/control_planets/param.swifter.in @@ -0,0 +1,26 @@ +! VERSION Swifter parameter file converted from Swiftest +T0 0.0 +TSTOP 200000000.0 +DT 0.005 +ISTEP_OUT 200000 +ISTEP_DUMP 200000 +OUT_FORM XV +OUT_TYPE REAL8 +OUT_STAT UNKNOWN +IN_TYPE ASCII +PL_IN hungarias_5pl_500tp_17_pl.in +TP_IN hungarias_5pl_500tp_17_tp.in +BIN_OUT hungarias_5pl_500tp_17_out.dat +CHK_QMIN -1.0 +CHK_RMIN -1.0 +CHK_RMAX 1000.0 +CHK_EJECT 1000.0 +CHK_QMIN_COORD HELIO +CHK_QMIN_RANGE -1.0 -1.0 +EXTRA_FORCE NO +PARTICLE_OUT hungarias_5pl_500tp_17_particle.dat +BIG_DISCARD NO +CHK_CLOSE YES +RHILL_PRESENT YES +J2 0.0 +J4 0.0 diff --git a/examples/symba_hungarias/swifter/control_tp/hungarias_5pl_500tp_17_param.in b/examples/symba_hungarias/swifter/control_tp/hungarias_5pl_500tp_17_param.in new file mode 100644 index 000000000..ba1fb3c2b --- /dev/null +++ b/examples/symba_hungarias/swifter/control_tp/hungarias_5pl_500tp_17_param.in @@ -0,0 +1,38 @@ +! VERSION Swiftest parameter input +T0 0.0 +TSTOP 200000000.0 +DT 0.005 +ISTEP_OUT 200000 +ISTEP_DUMP 200000 +OUT_FORM XVEL +OUT_TYPE NETCDF_DOUBLE +OUT_STAT REPLACE +IN_TYPE ASCII +PL_IN hungarias_5pl_500tp_17_pl.in +TP_IN hungarias_5pl_500tp_17_tp.in +CB_IN hungarias_5pl_500tp_17_sun_MsunAUYR.in +BIN_OUT hungarias_5pl_500tp_17_out.nc +CHK_QMIN -1.0 +CHK_RMIN -1.0 +CHK_RMAX 1000.0 +CHK_EJECT 1000.0 +CHK_QMIN_COORD HELIO +CHK_QMIN_RANGE -1.0 -1.0 +MU2KG 1.988409870698051e+30 +TU2S 31557600.0 +DU2M 149597870700.0 +IN_FORM EL +EXTRA_FORCE NO +PARTICLE_OUT hungarias_5pl_500tp_17_particle.dat +BIG_DISCARD NO +CHK_CLOSE YES +RHILL_PRESENT YES +FRAGMENTATION NO +ROTATION YES +TIDES NO +ENERGY YES +GR YES +INTERACTION_LOOPS ADAPTIVE +ENCOUNTER_CHECK ADAPTIVE +ENERGY_OUT hungarias_5pl_500tp_17_energy.dat +GMTINY 3.646098141953443043e-08 diff --git a/examples/symba_hungarias/swifter/control_tp/hungarias_5pl_500tp_17_pl.in b/examples/symba_hungarias/swifter/control_tp/hungarias_5pl_500tp_17_pl.in new file mode 100644 index 000000000..cd9d16020 --- /dev/null +++ b/examples/symba_hungarias/swifter/control_tp/hungarias_5pl_500tp_17_pl.in @@ -0,0 +1,49 @@ +8 +Mercury 6.553709809565314146e-06 0.0014751274117575772341 +1.6306381826061645943e-05 +0.38709894990924181846 0.20562369687869339052 7.0036069691825035832 +48.302897646473702764 29.190213908309409874 163.69992642152809026 +0.0 0.0 0.34599999999999997424 +3.5735549824428292985 -18.380047749494480457 34.361526740492798437 +Venus 9.6633133995815381836e-05 0.006759122875155079725 +4.0453784346544178454e-05 +0.7233300630551103838 0.006773384545514573099 3.394505355540899938 +76.62090440289564697 55.183156101464518883 271.2285045598760007 +0.0 0.0 0.4000000000000000222 +0.17650282045605921225 -3.6612475825356215592 8.702866268072763821 +Earth 0.000120026935827952456416 0.010044657392872289059 +4.25875607065040958e-05 +0.99999328599172943033 0.01668004783869252855 0.0027793940989077428085 +175.84932558359508903 287.2227751976308241 324.72725799674782365 +0.0 0.0 0.33069999999999999396 +4.827962479462605839 0.034731626640621778608 2301.2114260455621944 +Mars 1.2739802010675941808e-05 0.007246146587933918669 +2.265740805092889601e-05 +1.5236121180553410248 0.093387475645674775104 1.8479297186242829021 +49.490271729763087194 286.7387645553690163 252.78317601821959215 +0.0 0.0 0.3644000000000000017 +997.9376283354346323 -909.38573894978675416 1783.4600697011568969 +Jupiter 0.03769225108898567778 0.35525381666404283465 +0.00046732617030490929307 +5.203268729924161562 0.04848413524543258163 1.3035624911873560094 +100.51639734596980702 273.421918018626684 325.351028522703416 +0.0 0.0 0.27560000000000001164 +-80.967241888586720104 -2387.9998942634933492 5008.7344122962876782 +Saturn 0.01128589982009127331 0.43764770913411007376 +0.00038925687730393611812 +9.581513697274186114 0.05248801962394190196 2.4862838811768979141 +113.59546767797320399 335.45662431368151601 228.84653123700309152 +0.0 0.0 0.22000000000000000111 +441.9323685947327233 378.52918410105413535 5135.911248678291292 +Uranus 0.001723658947826773068 0.4699394560146697986 +0.00016953449859497231466 +19.24773626798451076 0.04408736292912442123 0.7704474968533898682 +74.09072726634606454 95.12631113857929677 237.66915583105441101 +0.0 0.0 0.23000000000000000999 +-677.3000258209181323 -3008.109907190578637 -836.301326618569835 +Neptune 0.0020336100526728302882 0.7816500366521773358 +0.000164587904124493665 +30.297815841143489024 0.013873050398302080172 1.7688477929856469828 +131.74107055888509876 246.83916166351488641 334.07963351871291025 +0.0 0.0 0.23000000000000000999 +1231.0256802954641403 -2178.2009371051150557 2329.6179923847095223 diff --git a/examples/symba_hungarias/swifter/control_tp/hungarias_5pl_500tp_17_sun_MsunAUYR.in b/examples/symba_hungarias/swifter/control_tp/hungarias_5pl_500tp_17_sun_MsunAUYR.in new file mode 100644 index 000000000..b2cb85c35 --- /dev/null +++ b/examples/symba_hungarias/swifter/control_tp/hungarias_5pl_500tp_17_sun_MsunAUYR.in @@ -0,0 +1,7 @@ +Sun +39.476926408897626 +0.004650467260962157 +4.7535806948127355e-12 +-2.2473967953572827e-18 +0.0 0.0 0.07 +11.209306302144773 -38.759372036774764 82.25088158389266 diff --git a/examples/symba_hungarias/swifter/control_tp/hungarias_5pl_500tp_17_tp.in b/examples/symba_hungarias/swifter/control_tp/hungarias_5pl_500tp_17_tp.in new file mode 100644 index 000000000..f4ba244e1 --- /dev/null +++ b/examples/symba_hungarias/swifter/control_tp/hungarias_5pl_500tp_17_tp.in @@ -0,0 +1,1501 @@ +500 +TestParticle +1.8454769027014339411 0.13951119042459186881 25.837798047275626345 +328.17117785206306735 237.2860880034895672 64.23008023926446697 +TestParticle +1.8948047399930760815 0.39253684339890981825 30.57401904357708844 +171.8160167926455415 74.67067835186652758 346.82539114732162489 +TestParticle +1.4322956873029448754 0.26682998123758877584 36.888797433998760766 +135.67836179139501951 49.89780708941236753 50.12940813296061293 +TestParticle +1.5422738860284694873 0.37685139101297421282 19.245291067203744717 +242.6056203622448777 190.34039186776647057 265.5775848896740854 +TestParticle +1.4000225346968613316 0.29255853399659431657 19.890767084525684538 +119.10518346196536754 348.49038108835299 47.293501598324468205 +TestParticle +1.456396703278512561 0.21606816556140612251 29.008692147879436618 +108.30731953608933793 221.35606614343436149 135.6522448644592771 +TestParticle +1.4991966146428574724 0.2669401594934397437 30.077755049056197123 +191.15663442447419129 222.38194219090249248 69.087779756302211354 +TestParticle +1.2976220185588704936 0.2964166811906516763 17.074990789432430205 +304.33208099940674174 258.6470139846816778 322.57928297363247339 +TestParticle +1.2284058459883253622 0.02114032275754222992 21.48034199376179032 +253.91897753388707315 121.66008318006832667 48.90451689677965419 +TestParticle +1.3491703154567693534 0.12631152383406446527 12.08570156851411781 +94.79536576066179521 143.49729046755351192 208.82266091055907964 +TestParticle +1.354548306636307764 0.30813073753578051894 26.385704559503864175 +9.340695923175923454 140.9062990975310754 128.60525944669927867 +TestParticle +1.4726763914941964906 0.051608113984077212677 23.16805302210511286 +60.87571895315940651 37.85205814142705094 334.24673224972650587 +TestParticle +1.5463324166991267994 0.049680078831149866725 2.1376306166210978787 +220.16008032774595904 11.76294270807032305 189.70726088424217437 +TestParticle +1.8424848789863070841 0.22250945291262835823 31.15994606422547264 +200.26190393952850854 90.472365503047569746 91.504582635979360816 +TestParticle +1.3344201535197020014 0.22773738327276721316 26.57752464191161934 +153.96142537752339763 186.86606427694519539 35.556703962561442722 +TestParticle +1.9184874234026485507 0.023481756935774280443 35.397883111232822273 +271.86866710708176242 55.05965672749781703 149.58202579969920976 +TestParticle +1.5321856218987717213 0.3979302949006976453 2.3033304058957959626 +1.0080751214383187886 229.5039187263292888 149.08850733126683963 +TestParticle +1.8579680598185155382 0.22191671822921349433 4.132202808256058013 +84.407322217061448555 105.02111083305797479 146.60404199861849861 +TestParticle +1.8191335218869923995 0.081164276322499742666 2.5841250683973493452 +159.5912052269758874 90.717444711181698835 52.736155424681527393 +TestParticle +1.3667350901122115037 0.040168371245059432406 21.275121073210776501 +354.85336821525999085 78.43154031841972085 317.9997578721723812 +TestParticle +1.211310325452651826 0.22495050228658303171 6.171244471860548586 +261.19666701924728613 72.22571277624209074 188.79752520382470493 +TestParticle +1.5325985395295633751 0.31279786859050073833 20.80765006283890628 +318.17303457104600284 237.18051290105893258 171.10337432510698363 +TestParticle +1.8680074840187885776 0.2359667145186353232 3.4681761306941005785 +200.43760942249792834 358.90361110235892284 209.24526446322295214 +TestParticle +1.8902919155434694254 0.083578216274719355217 21.112558775866592242 +196.8514015184809125 347.4309841941474133 73.29619835953663198 +TestParticle +1.3627905330289311614 0.099888583939379896326 10.927033380075510394 +304.94152566655765213 199.55238917120914266 66.700355986912740036 +TestParticle +1.6040569601728904559 0.0037929451167165065088 35.906866500389931218 +99.48570161019421221 264.107310263435636 196.91578900528253371 +TestParticle +1.5861188083181421149 0.12827049258664038889 4.433072269138715882 +250.35776905499878353 45.94314631274010452 78.766936071707490896 +TestParticle +1.8085832921727800215 0.38738844761580382148 38.482814871600758977 +59.61087191956130482 302.66582104517908647 337.43444136948141931 +TestParticle +1.4784945066780474932 0.02330664972959981679 24.805661482861435019 +161.3343149737517308 260.74004269183234328 332.58410511792851594 +TestParticle +1.2147867771614853094 0.16512447645289687892 26.704102750300808822 +342.71215159236965064 303.68316149292064665 267.30686157877283904 +TestParticle +1.2201597354758311198 0.29779565538112623413 9.5137682254248456815 +191.53033272117548336 279.0125127827463416 212.78518850631689929 +TestParticle +1.6306412809893466864 0.17831015307074157827 3.1250419675817919796 +35.17124037365346112 108.44038602029890228 289.87991262900078482 +TestParticle +1.2151606182820764435 0.030818630012030868992 15.255139624036321067 +18.872922094318155928 231.7787216922804987 114.00766773514217789 +TestParticle +1.263893046608108861 0.2365742775318666613 11.945519016269416923 +42.860493283933593034 103.96603523733477914 283.38829024952065083 +TestParticle +1.6208609899851271763 0.084237547629803233296 12.70952077968544458 +283.22127471251508268 16.774057774443846824 300.16022765529646676 +TestParticle +1.369439844040318377 0.02479558882423171795 12.8318676295292597445 +301.63112212878189666 317.34595898371384237 30.617048625074787083 +TestParticle +1.5997694540834734855 0.09458558350377295476 19.448014834633401193 +12.1917196597836952066 3.3679767469261356894 154.78568082871979072 +TestParticle +1.7665402755717471983 0.30325026057285930925 27.633560559304825688 +101.32565005973741279 173.42784439679959974 37.232060344515574002 +TestParticle +1.9955375108845494481 0.36780600821797326816 31.984293078717442427 +282.80116122029363623 340.83055441100248117 39.611552110590793063 +TestParticle +1.8068990906750328485 0.21026617244057629885 1.0616116239923245601 +148.12562556977400163 298.30253571723386585 39.94475612648128049 +TestParticle +1.6630081107132843599 0.2735942970781838346 20.393789507385111648 +186.34515293922132173 65.17268953054855274 249.5770342523899501 +TestParticle +1.7985429554004617181 0.32088199656574384333 3.421215620948947489 +16.760921442599428843 74.095210179753522084 131.64141600391005227 +TestParticle +1.4370805125444752193 0.33325879590334600566 29.297209939601689399 +179.87886700027897291 9.64820682838999133 185.83130754139918395 +TestParticle +1.4655739620290153535 0.017666725980597774298 15.194095015809558902 +272.98954032167330297 58.084307572382229523 205.40990717491945361 +TestParticle +1.8476543863511110111 0.38915614646375812358 11.917542586934226634 +134.42337723208845546 335.9708646376130332 1.2971084841705504687 +TestParticle +1.4590877868615714785 0.00229625206779173743 3.1321552894228821273 +234.02046406252858901 255.12979045887780671 16.475368403924544936 +TestParticle +1.3888300055647480047 0.04773585409741545882 20.980957411518524225 +232.75615771007392141 269.83840631297238133 128.91250646333895702 +TestParticle +1.9931456375147125204 0.36812801925517474322 8.575906190939374341 +75.54998759463583724 336.19060016425089543 128.81172294803698719 +TestParticle +1.8774492133690419138 0.3438244675687084917 23.038981078440741612 +9.8914055387747712444 56.58764160659445963 274.986529163730836 +TestParticle +1.3204375538736723428 0.08737144541036796774 29.974540925371840672 +221.62895491427303796 180.74872085610940076 337.40135640751742585 +TestParticle +1.7927656300808507694 0.117314349174642992835 19.184850306121404628 +206.67799209022632567 27.751086824061687253 298.02149638567931333 +TestParticle +1.7770751091671890265 0.19250351376309945972 9.172954305563960631 +43.26806500508915576 40.25028641050728595 238.70170337404292127 +TestParticle +1.974616589119178478 0.34407442172588997842 9.802858566374489158 +297.25364573770326615 87.77531802870282718 75.66951173963438748 +TestParticle +1.3863166307158814039 0.076685155941225657816 27.402627668756696977 +65.08259549484182571 164.8638775674021133 100.45589134667613962 +TestParticle +1.865440866859517488 0.1196471086364425257 11.945324988836505398 +268.187594819792821 223.64720186520361267 29.40940210460087556 +TestParticle +1.924611171111724417 0.20112445232693854091 27.71898676703103348 +318.34445645026778493 191.25112555799532288 349.89422766228875616 +TestParticle +1.5993892099645203864 0.10968442780595713537 9.326690310948993812 +31.533935713187357663 310.02898225335894722 210.51997485541662058 +TestParticle +1.2359382488484538243 0.32658357473851062913 38.707976308555153366 +144.00217869231852319 119.06805794770258444 79.384200277529473055 +TestParticle +1.6109049166063780234 0.038297945827820673026 19.543826335927839466 +187.13697315293387646 257.17832502585736165 137.87766714187893058 +TestParticle +1.4314628393318562516 0.06605107757031168647 34.48524969280026653 +261.32336202719972107 132.91845049023550018 38.845354985336733478 +TestParticle +1.6270574875899108669 0.34703206127568098083 15.7198484814636287865 +347.55110983950402215 301.80674145531685326 112.25474179150697296 +TestParticle +1.2336395323546296421 0.09729394203067305569 5.1016432554912771735 +233.12366663108903708 146.38256752560837981 198.90738568911748985 +TestParticle +1.3456767380773657639 0.0037474665741684012703 39.938234490697439583 +256.57759604724572 75.054619437472723575 358.3650510442133168 +TestParticle +1.5755427111046413913 0.26176654357687628716 8.3705428253832359076 +37.517264866504824283 65.328654571322900324 91.55626866074713632 +TestParticle +1.6755570822166401257 0.13402717291758836637 24.063895956419415256 +13.799270685071709508 72.62055343894668624 87.31894896673983908 +TestParticle +1.5559490988866435668 0.15176826381840774483 38.48111346610262018 +256.2333379875098558 75.97800331031197629 59.41813313856062706 +TestParticle +1.44994652075586683 0.33986546456988747655 24.751134550954795088 +232.18945993885864709 196.68218102285592863 134.45246030705607154 +TestParticle +1.8429185809905443971 0.017095748280579449452 37.139787427802218645 +161.43471520401584485 307.27501647662722917 355.50902004252696997 +TestParticle +1.8754638534803846905 0.012020551314167439438 25.689663713162978809 +190.79044364156195002 199.61943428385487209 354.13757823278496062 +TestParticle +1.6785085343609076336 0.092751885821403062815 9.210612929641403213 +285.5852225501039925 151.86743084166838003 284.55869958326974256 +TestParticle +1.6543220378661067649 0.21134650270613800083 33.840207882222927083 +304.1335703446064258 326.82908020011677763 324.19035648687139428 +TestParticle +1.532142838634183768 0.38007507167758092237 0.41347334753230935434 +67.05133558163640828 34.399290053628249098 34.840294234675972973 +TestParticle +1.5607062121608026306 0.33781855969656376937 8.967843423326943508 +299.3643723824862377 200.63715648972143413 68.959909224159687824 +TestParticle +1.4493452438508076519 0.0685471748773834183 8.6320194163908645635 +72.080624314054560386 115.122237950328312195 0.4079154529894424286 +TestParticle +1.6460340581063395149 0.39668168452346741493 20.981074587513283802 +204.3451792276263177 201.37614636656564926 213.30860176845612841 +TestParticle +1.5920263567710581931 0.25848484530126630832 37.015946260712674132 +127.874562568991194667 65.19741011690945243 94.70447850395582634 +TestParticle +1.7336512363309442009 0.07029270812373322741 2.7619103909209741232 +186.8230602145383159 227.39378660430725176 98.630627655617857386 +TestParticle +1.2180382444813300236 0.3142235003505371993 28.081856084101627147 +111.345098722858793394 55.920002664921518942 282.87486367297071865 +TestParticle +1.6485319714902004762 0.3152277024193525512 9.613333711481617527 +294.21829832085342105 286.30105207001298595 128.67843292368630159 +TestParticle +1.4661249318513216444 0.05768902442216044396 0.40134055259916312508 +131.60830524837382427 243.75402215940340511 207.34266824752899083 +TestParticle +1.9808876352137643195 0.14308188258148502037 1.4378912336896432222 +80.646845170624999355 231.53252144735679963 232.24754717746816368 +TestParticle +1.2317104124445219515 0.2601604050852836525 0.45344055155487783537 +196.60019387641727917 281.28440095008312483 247.80040663000707468 +TestParticle +1.9766606334273690848 0.34561610666945052905 23.435434834980789276 +34.473035596172188377 271.1594424183512615 48.466138898201464258 +TestParticle +1.902283887520531902 0.11209856668107276434 36.03239655947709963 +294.40684092368923075 270.02199923071918874 114.382104661423511516 +TestParticle +1.6492323095244016962 0.15893979864294510707 37.659784271934086064 +104.66474319501168111 339.31942052690538958 216.02473301930888283 +TestParticle +1.3484148267391067311 0.21111072648635398341 10.89667366492733791 +291.56591682201212734 76.70162083026228572 312.33817224861377326 +TestParticle +1.4294351818194139803 0.088023727454350997323 39.975651469559892348 +198.68831704157523177 24.599669214308292453 112.67218982565516683 +TestParticle +1.7462490440076519072 0.37071438804152889723 21.870120107958371136 +306.73669065023256053 227.86908802150850306 221.53115484665687518 +TestParticle +1.2326287663421375829 0.38251042858385364553 15.802748366587309192 +199.40278420565533679 149.69869717845381274 315.67560896416114247 +TestParticle +1.8450862453370659999 0.35823810152470403345 0.24296995062495163609 +231.11355647090658749 268.36408970924156847 247.20131497380242536 +TestParticle +1.3463306194321635889 0.054152156717265725883 19.291673537548810202 +161.87111271376406307 110.46662751206984865 211.17562619004070257 +TestParticle +1.7304729990392044847 0.0060363382745066036794 4.5425988088905189244 +83.83165898233737323 161.12905358043980186 286.6647995328502816 +TestParticle +1.272415258736352639 0.34812105948963872892 35.045494396081245725 +14.574000729875393745 353.3713665259786012 131.5433867402096837 +TestParticle +1.6439273487752854574 0.36545065070539850538 6.353634441759323792 +208.14453818563018217 10.813063425795590433 206.06730287545840952 +TestParticle +1.6763079933342956984 0.094138501830316120844 9.085159707293687603 +80.58871476637817466 314.0368013316636393 100.690960685859835166 +TestParticle +1.4877140448295171904 0.16166761889883485281 34.241465691047999087 +79.8410863542756033 83.93580251433438377 326.42504725591442138 +TestParticle +1.2162284372972316238 0.0041396912261435492297 18.10971019209766908 +119.24015567046335207 329.67281909144981 104.828869567280364095 +TestParticle +1.8047735542382463692 0.33749016396948239294 0.52972364011479644574 +178.94392698813351217 299.23756071934496958 162.62104380151879468 +TestParticle +1.5839648306862472715 0.10066137160625268643 33.26828317225646714 +263.27920251880794922 68.67162164080139064 57.290691877799474696 +TestParticle +1.782207613297600135 0.28298109588186182162 35.127393670730072017 +210.15608294480230711 329.15212439443854464 156.34171670624388639 +TestParticle +1.3155167265331972892 0.3723026355627080397 31.9899066241260428 +91.31036979040656831 223.20537501312867334 55.827047719351739374 +TestParticle +1.5449962589928503132 0.042895131418722920458 19.621615335811604552 +53.274917868286941314 105.38186162729587636 323.020751462690896 +TestParticle +1.5754411317280814231 0.34816180369684263107 4.7678217298113434452 +120.95128002085144203 157.00930158977180895 240.29746717057042815 +TestParticle +1.5907469291141598244 0.1964357827791012312 32.411571541856559975 +170.61499094134663324 242.1650203501031342 17.501615221478704854 +TestParticle +1.830089894183755117 0.1183426089423230132 39.644525581214999477 +294.65378437812546508 109.07115594302160844 324.16241183209581322 +TestParticle +1.4367780052388956502 0.36401192064177911867 30.631206179017613778 +68.80265368578432117 273.93063220366155974 24.29554655983004352 +TestParticle +1.2142291174104986595 0.26599477562223389215 38.323418486729934784 +308.15266716976327643 181.95454939706644382 25.317934141736472498 +TestParticle +1.3097560558867786806 0.27086655670790987793 26.727111485760552512 +202.01817831967753136 111.97198753257944759 220.9572217341067244 +TestParticle +1.7068002319397266309 0.13225077417056724238 27.615823462695185952 +285.91192474987235528 163.31636137404424858 93.38394269951035653 +TestParticle +1.2055264990732839081 0.30786309414395046646 1.0578708063967390274 +10.359167032075170312 91.437369236993205845 199.49137469503560283 +TestParticle +1.507944679481377559 0.24354603379899894544 13.546984987329334871 +57.02677054315793015 348.2783664994595938 271.03255123935065285 +TestParticle +1.2000480949162781741 0.37393642722973008397 23.203234027939288353 +10.544426197782676979 54.256441116884829512 254.63780531903708493 +TestParticle +1.7449420987438828412 0.24948442565304040919 27.500692921539069857 +95.99564887831238025 273.51317842100650068 326.03984845413532412 +TestParticle +1.3765488182504534986 0.030416876982825514358 31.70464034258963082 +275.78595003182448409 133.87458225546748736 226.00553898246667472 +TestParticle +1.2429016633522536051 0.20958324622273286075 37.67591956683881449 +291.1872246516109044 179.51252843010638571 313.71221570905379394 +TestParticle +1.350836711566139936 0.37146863516149991602 10.648022816293165604 +303.44796444885918163 189.14789607745939293 51.43707686446851568 +TestParticle +1.3606071504125110128 0.33726059408562408803 29.623948782469774699 +174.22516541583135563 294.25596249059782394 95.41136217835122579 +TestParticle +1.2613426667283003102 0.28493782233230641188 2.8418286626483357793 +28.660785941482401995 87.50329638280636857 62.24419865756345871 +TestParticle +1.7174163570319429528 0.3032422501079781174 15.67069716211129915 +199.70972264612359481 32.767912430781642286 213.64123907162533555 +TestParticle +1.7458843970753306074 0.11283265730661723447 31.014841487303186796 +100.348702433335944306 70.42890181497725166 181.6379350423849246 +TestParticle +1.5856984450767472872 0.12800000166780992061 31.429108868252029652 +51.353858554652823898 23.612627758947475343 267.08391560632128403 +TestParticle +1.7153544980924069208 0.009492334383937130193 23.973160269033186864 +225.8121095708202688 166.53019043018878165 111.264606624241494615 +TestParticle +1.5026214783945404108 0.0060590469509819834884 26.922409196875427995 +295.19858318066900438 267.2316600455114326 164.01625566186100968 +TestParticle +1.9160661225785111661 0.2687972938601586037 36.621056515844763624 +334.838998311582543 64.064850181025448705 189.01682882741042135 +TestParticle +1.2176400162982947695 0.34785736514134202313 33.268864900617138858 +225.50438622677125977 227.27950095352301219 349.3797741235012495 +TestParticle +1.2273892818311689101 0.2816869543044054902 29.30501713210593806 +5.1819190308878404494 2.980732803128396391 210.95489861072306326 +TestParticle +1.3751089556704734207 0.2405885452138842584 36.06217993351511808 +199.72275209903938276 20.656954375719962513 63.697518910616103938 +TestParticle +1.5607369467841181176 0.07255978851264624496 7.9579329131271947517 +171.37467949380453547 212.58991825508687157 339.50383959100975062 +TestParticle +1.9532502979079398031 0.32689490765476852951 28.253212569212344363 +181.63986801834479934 358.1359989621613522 109.388744074059957256 +TestParticle +1.6386262719092012929 0.3843259001434648492 30.427684580834899464 +231.68744967547161195 57.857403700081057707 50.909305856223930675 +TestParticle +1.9782962700915884824 0.107957633562424437645 12.967168829872832703 +304.82496750248236594 137.36222813798312359 43.932431234771847528 +TestParticle +1.456906303967715921 0.14977091087281488302 11.183659205458482688 +73.40451433078203536 248.31190118288742497 75.220198402857562314 +TestParticle +1.2534896538060293913 0.32164641810767541363 3.6905727779895203255 +113.638768774667383354 40.160334282501267467 312.87037322501493009 +TestParticle +1.3014118589240171175 0.2335136721159586648 25.377666434917763638 +52.35427893272325406 9.000303326532378634 144.16353907228875642 +TestParticle +1.349118336295686893 0.043025081648941171375 4.3612305774961734883 +243.8860202407295219 2.8265136490351139287 103.60819968189791496 +TestParticle +1.3275933491849711832 0.30130671835155509175 9.869222679372882112 +140.91605869565009357 6.9406462242691979725 239.80228459696834875 +TestParticle +1.6818942627306852078 0.31620420657586079116 20.559233470145720446 +58.349404997197098055 117.22724335851061994 205.33268031856118796 +TestParticle +1.9852083696659352796 0.013418902816453127241 34.384158548277603984 +115.09964166928982365 93.38072290721305535 50.024657651717582496 +TestParticle +1.5693995761001753309 0.16001215059117473993 34.5933607052273544 +148.74442398288778122 35.382707682911650693 307.9784638941427488 +TestParticle +1.5266059802597138351 0.017927011927562432753 36.548915878020643788 +210.40292925773331945 201.71103729618005218 224.16233740901310512 +TestParticle +1.728092867591788595 0.17808919848065529745 20.998516569906101381 +308.92264952207932538 127.645229747456198766 161.89916144859373048 +TestParticle +1.6194915162303571421 0.12309065176675240694 11.294533006684988052 +54.678975810373955824 126.54242973288489793 198.90789595722705485 +TestParticle +1.3289490961949892434 0.29324085207912647943 30.6374181063208475 +269.87631534747202977 37.841881250480767562 348.01538484590025746 +TestParticle +1.992893537374311741 0.18673594337410803767 16.540817363482574365 +17.388276030638827763 78.86833627776049127 145.80382488854473877 +TestParticle +1.222299452110788831 0.30906300615816389987 12.345442063899700003 +306.8123712805751211 180.92912639536746155 259.40768755027107773 +TestParticle +1.4975645450575401085 0.33347394063389190766 1.5908406722909917974 +21.190900575813813589 29.47013297848204516 102.16591862721205075 +TestParticle +1.7529928369432026258 0.37348208125904397425 34.962456206016206295 +93.100816365900570304 51.110432866675402863 102.57164314281175166 +TestParticle +1.2425425262626379475 0.33615312037358630048 13.5646379554957707825 +178.52596605015196474 153.15866826328647221 144.53495382113527512 +TestParticle +1.6649955177303406018 0.2774227948724269921 0.19107601744351665474 +63.095836643914225306 354.85824120341573007 264.91047609564412824 +TestParticle +1.6484772171416994802 0.30267580759790019274 20.681865450161470932 +178.44791810461956061 236.1847171609527436 98.36374690667254583 +TestParticle +1.9932276245336744136 0.28313215139520719887 18.707112367987669188 +219.87647284127007197 126.12068590426943615 215.87266615210091913 +TestParticle +1.7032561164628601258 0.16397636271323282053 25.251751880173408438 +216.40546882883455737 157.48365299675131723 4.688955472432070337 +TestParticle +1.6688736346909214259 0.20206175633607201259 6.8253656041650678787 +216.49653061411731869 167.29352654167502124 264.9681676707442648 +TestParticle +1.8685421164356719181 0.017115665378235479788 37.702745220955684147 +341.22511657108503869 114.98911860271485352 180.97443389686239357 +TestParticle +1.2789089584183417347 0.38311485210375972876 34.310997435004189526 +320.3337196375490521 323.3381621809996318 259.21085923985185673 +TestParticle +1.6140662295704462093 0.22523087980360034788 31.289184028405010451 +342.24508460858135095 15.680010847649224814 231.38490121660879595 +TestParticle +1.9392715602121850527 0.15801671085680726869 28.474643946647489656 +130.88611486656463967 107.8187080577375383 123.51635573428578141 +TestParticle +1.2967745250719693306 0.06567169524305174755 33.95229338812422526 +290.63873117229752552 79.02208966627722475 232.82648238779003691 +TestParticle +1.5129927102068225775 0.035355940722157398748 39.88868697475624714 +192.95122284146495417 161.94702337269632153 136.8613631323482025 +TestParticle +1.6829217923833816872 0.25345881856811941502 11.3639096364677563145 +97.75123136727515316 45.772970150424697522 122.47944569483230737 +TestParticle +1.8496796135868087685 0.13179006688881342302 13.3337440463942780156 +265.13170996725159512 228.43295285296423458 86.46213418755671398 +TestParticle +1.3358066112403499393 0.14376027444378572384 39.375717961581145232 +157.40058260425848857 311.2848447975355839 331.54934076273463006 +TestParticle +1.4724981157763801232 0.09732120033570890172 28.321058818578286775 +59.894734856092107123 278.76518901350408441 80.89976806352470362 +TestParticle +1.2021644761475605012 0.31023967350442599455 28.526439154406524779 +141.17072146741031702 348.00301966689602295 345.1342457342993839 +TestParticle +1.5593994326172748721 0.1667781483451987734 33.654370780663562357 +266.88153921797828616 15.430552831803581171 331.4077165346525362 +TestParticle +1.2450357937715832435 0.028817230992748132934 35.27994061369459189 +170.88739535567884786 353.3811233168729018 235.24134924372253863 +TestParticle +1.9317961733915889333 0.3664316651845210826 24.216703033341396178 +53.371442738369651693 125.538665606108594375 100.18756180685251422 +TestParticle +1.6396980067944455506 0.35320738196817447196 38.908475459351436143 +246.96073709218802605 107.071264330560637745 337.8304256083255268 +TestParticle +1.7122870680368271756 0.33138468975426782492 22.34571124430782163 +41.625350595521808827 260.11274001626304653 319.5586433718779631 +TestParticle +1.7758391618474895779 0.055654577054355419685 14.384020683089943304 +218.7045008460380302 129.23569045343450057 314.73455478475153768 +TestParticle +1.8362854949156799389 0.17009562329070515574 9.220110348963054037 +5.6249185474454588274 94.48961934631255133 267.2078794777070243 +TestParticle +1.7334953226477165522 0.049544865778679184065 1.209613515173937337 +190.91534544660109418 64.56511824447872527 53.933623678817561142 +TestParticle +1.2066506827151026737 0.27307016461379868266 16.286012208431877468 +210.72290400454269843 4.9513407455376867716 217.19883427837939394 +TestParticle +1.9341836813541077866 0.31275777164344914505 21.744449246528134267 +16.671280260299788267 359.76195227232665275 224.80650775703034583 +TestParticle +1.2301271999661356205 0.031548406830605689455 39.849035058731047343 +90.34650036320888944 228.990784368342986 250.85529561169511226 +TestParticle +1.3410010761068889007 0.095083624572690483845 16.924908171363043152 +283.45379909314135602 86.752474366828209895 159.59709647132103782 +TestParticle +1.7698211243948773763 0.31273331984328978095 32.406541703763409146 +142.47083941877434654 108.934565017581746815 272.0311071315450704 +TestParticle +1.2184663095396561783 0.03812658809257066239 19.774618927626171683 +209.47233898474567582 217.91859195187419118 328.76297389338390076 +TestParticle +1.7206223471221142596 0.34602085721486458558 1.7719525390753965155 +165.06371680688690162 58.713339280074663407 131.55475352151159996 +TestParticle +1.3109621100006574324 0.1200549161067526599 35.241813901823853428 +280.10060451829298245 304.5154307276658301 258.67615548166588724 +TestParticle +1.890762195590066419 0.37035990280942132635 39.30878687557294171 +331.52556729751103148 337.10887406621617401 291.2002557551665518 +TestParticle +1.9459727148429868393 0.38159291851530796613 17.491010561827589953 +58.69944071533900143 205.64445683266583842 15.007877403052006571 +TestParticle +1.932411276121311472 0.04777930483056436195 25.073992516822389831 +121.57030712562516328 70.74439140769348455 289.9542940845957446 +TestParticle +1.5709963526669437073 0.10007382494413469276 31.19225199749002897 +25.663181434794644531 158.74882487098793149 349.24010777437848674 +TestParticle +1.335652850395929736 0.2682557203404010715 35.328293558121892204 +297.5826541744638689 60.254502441132032686 46.73892963602791184 +TestParticle +1.2957464098764572835 0.3440291712383192757 7.1735736922541004645 +59.24135447472242788 112.00172550339377153 63.553063734303997023 +TestParticle +1.3376569963037119315 0.3060189431378071423 33.029029350979975277 +152.73585490781837848 358.84231030107730476 37.635854669405638617 +TestParticle +1.771988403745682561 0.3418762364008507415 23.489318587551395012 +127.772934823946343386 203.78581662446330824 143.76143168311298837 +TestParticle +1.5956560402916708519 0.10759642083325884898 23.037334274387120558 +89.123439540602518605 335.80537435903943333 224.2944293252393777 +TestParticle +1.2213248137275627414 0.33273129495412528955 31.736197966218284705 +5.8113766822153190006 136.8878783815157476 64.522354495354704795 +TestParticle +1.5939091087487726739 0.18821654046060146137 30.731370977849337578 +266.58533763467028166 61.609425727717933796 18.235581197999763958 +TestParticle +1.7396585716134431721 0.33855494953671660951 29.449893101775622029 +180.02468739427200717 242.14518561194594781 286.10286226317128921 +TestParticle +1.282393302513987976 0.18117160916878405352 22.308223599873976184 +94.69043575838269078 120.90458523599184559 161.88428102391287666 +TestParticle +1.6814135190699217581 0.06566827687818244108 23.327233678731047917 +13.505074850212492876 48.75637107914376145 337.4546628636448986 +TestParticle +1.7657157709814490509 0.1428403447023711692 17.528150255810068359 +344.59038571613109525 139.36370104693307326 48.933862071120714177 +TestParticle +1.6903656227398606848 0.1881104051902828811 4.8333955434429443088 +225.1651227652955356 185.18882646555431393 132.21080070182574673 +TestParticle +1.994803202974419154 0.07010640681945860819 10.335500705227271823 +49.13850067137512667 6.4534592639328725028 80.823883651112907955 +TestParticle +1.3332640591247215678 0.06033190012542344327 21.035357456357957062 +97.733488288704805314 80.36567051536489714 46.55202086502264791 +TestParticle +1.6243595893431250765 0.19184864274731788791 3.8955991274805690239 +177.92659068814418788 143.40326100313114921 22.678654943892524898 +TestParticle +1.6823664970435372457 0.2224783311899178051 28.355960754425314718 +38.26291967170601538 109.90023925961423856 198.84047030132839495 +TestParticle +1.7191941261517613704 0.33174274738319786682 12.850948299491872007 +119.00419547116645447 97.60779700546201809 294.77008528831782996 +TestParticle +1.8572892923802768461 0.35111820477995814294 13.9604529367616514435 +90.00276864094306006 148.95323888923235245 105.97452396122218943 +TestParticle +1.3153721536816338489 0.19649899863576869574 15.0714118102473335625 +114.91054594701827796 42.412124805715073705 238.87013655434262205 +TestParticle +1.2329176043622995795 0.016982564457388795581 30.243701002322488591 +82.65191789811144929 330.6979385476704465 45.054558348890076047 +TestParticle +1.5821710473264454233 0.3143035815568485103 26.914241767154372553 +284.2538985550680195 218.88177874336824402 323.40347760377426312 +TestParticle +1.9040784761593252394 0.24428308876647972236 7.2140984856285061966 +36.905471182196343705 235.01221091601564694 318.38458893259758042 +TestParticle +1.65303582473123023 0.15480622128373774937 30.612597160930445028 +176.14307295689886246 344.8917806440758227 46.391668294041863874 +TestParticle +1.9906869462994456477 0.08417977136701382257 32.071163809129458855 +190.08888099464044785 12.337459747731131188 44.2017470332212028 +TestParticle +1.8765384210009301569 0.18365454827241262103 21.70846970886060845 +357.147106806575664 129.14807435709019501 12.280707552849744246 +TestParticle +1.4155101547192867617 0.04021447505437234643 9.344979114904226947 +15.0079117011066429654 104.10136849327774655 23.129488238006107537 +TestParticle +1.8212138878170127665 0.08047272581333581032 4.0968495722748254906 +174.58882187338159042 279.87646692565357398 23.324854698976157152 +TestParticle +1.7644240552946159895 0.028115303133601266677 37.495056810553286653 +118.13225365926875554 167.45393279647143459 34.012411764895496447 +TestParticle +1.4525677350618968475 0.30250405555180709394 17.82996354610970613 +220.00796720803919015 344.15563445760545846 123.14676507835467589 +TestParticle +1.548841766197246228 0.09540860671062662002 22.684926251185043355 +218.60911597389889494 90.33458573673138403 102.992143880334552364 +TestParticle +1.2079296534119159379 0.32769989355099571338 38.675927266126485904 +200.13361220962531206 158.78840734969233495 279.3835775172844933 +TestParticle +1.377134208847530239 0.24021816899861267447 9.0547885117482262984 +307.8373588937357681 250.70142057430294358 309.94009295835280682 +TestParticle +1.9686740753046718666 0.039229853667286734842 27.8754113045622951 +44.123357114694904624 256.01312835054108064 261.81824327677321662 +TestParticle +1.5814217806739057082 0.17335298748077404563 11.896107065940920933 +11.863952502714919746 24.317879056812333971 281.83737446678952665 +TestParticle +1.3875566874932281358 0.04186652452005912295 8.374003796839994962 +110.23215119957482955 294.56036703267886878 295.56595853737684365 +TestParticle +1.3902402383167473676 0.19593968424019078678 29.315181048510574158 +282.62385234829253022 324.77635841333739108 19.922520312932118003 +TestParticle +1.2840096543928043449 0.29990999639214999117 38.008971094948456937 +277.38971452757238012 208.06148201248271334 255.09629766073103951 +TestParticle +1.5591506829846155657 0.37436941724804151388 28.992037551395654305 +349.16296285001351407 325.2167596752620966 272.84514086043867565 +TestParticle +1.6470838643939573753 0.08288833139777805614 14.577369178129217175 +285.2260666698484215 331.09186078156602662 265.88764593799055547 +TestParticle +1.4078732644616405167 0.12168143435803764618 12.108634490395427719 +108.46688890223232704 161.29947110408681965 275.03585750375651742 +TestParticle +1.3806299194725459856 0.004926651150672434372 4.619034071475587311 +124.92525284958901466 247.86360149925218366 213.62866269117026263 +TestParticle +1.3192455632849615643 0.2895763215200138352 26.694213488950907731 +156.54596065699396945 129.81140517153278324 134.60446380394492394 +TestParticle +1.4439912056109245331 0.3898931766577775071 8.96508289894697441 +244.87528934455733065 193.64710431202621521 293.37512055758975293 +TestParticle +1.8635206283775769265 0.2795056553246003106 32.898054005194971694 +137.04912054787823195 287.93791057659291255 10.142083183616289688 +TestParticle +1.9812056783962854745 0.2247292940884803858 25.532351672534726816 +201.33822039314060248 254.90475216060337971 359.59652623258176618 +TestParticle +1.9116361511506723136 0.34944272223947114853 5.3334830645261233073 +165.89953551606566862 87.00762822041266986 286.54555713608760925 +TestParticle +1.2300510950958833956 0.09272681808089294764 6.1108306263088341126 +60.392041334648261852 166.06618730050502108 214.40030029409305712 +TestParticle +1.6587060971893274886 0.35283027123356813792 31.860313399205129059 +249.71240866151026694 222.43577149272385896 31.641338378167219503 +TestParticle +1.6042337378433173534 0.37025740688655151 17.202399535173533707 +87.81318396148407146 2.5620013176806422095 357.37399955588330158 +TestParticle +1.6471345300326571959 0.13620174045721983314 22.615216955031499424 +80.62529682810802001 69.592694813600971315 105.76774944494903252 +TestParticle +1.9072984229216274343 0.01501546063666405785 8.290907351796761304 +169.80316939963415734 18.043578597928426888 349.8451486157899808 +TestParticle +1.6906614679737514972 0.18058500638001656613 35.641943093270654686 +155.08172745880321486 318.8449035930426021 193.87642754894059749 +TestParticle +1.5896626347240321309 0.08039921506021037445 26.884736251329634626 +93.207751799271306936 291.57502433845007772 164.72382015911426834 +TestParticle +1.6992934898451703685 0.065201137301299824656 14.269610927403233447 +236.09727012824436088 254.53147047225508004 263.77965229044838225 +TestParticle +1.8538533648632840034 0.04766458860664664343 32.873078543951940844 +204.22879507518445052 106.636047257291238566 249.48280450502983285 +TestParticle +1.4212096807741136928 0.07499446462853280593 23.101996292119086007 +275.60817514452082833 213.13272785623379946 230.30352647630064666 +TestParticle +1.7510124795524912855 0.057099861992605485672 26.912262589245482758 +293.1635508220617794 35.9907631662996792 141.04718451469835827 +TestParticle +1.6563019761734052437 0.025865878674105769602 36.786210320613299984 +182.00701529286254754 302.4937526698793704 324.59294681664295013 +TestParticle +1.729605636071602337 0.11527751871838157194 8.269004569267789151 +347.6614584046645291 246.54991472345386683 257.4460526186617244 +TestParticle +1.5759605048363587443 0.11372511990649024349 2.1138568479458896832 +32.388292718466615838 301.59398434276658918 321.32099521949635346 +TestParticle +1.8344051151510727404 0.26899383835918777574 3.9802801398091425256 +84.71344253866337226 168.80695388443507454 259.706671920307258 +TestParticle +1.9193495257732000603 0.3433984358229728029 11.27141574019314163 +62.069125737912351326 344.62614387614092948 49.455425729806016477 +TestParticle +1.7910635325425254827 0.044197943689674758228 33.673496401958495028 +49.096060175323778196 333.20352819343492 344.1647888658290526 +TestParticle +1.3951416310339623816 0.25049231139019290104 13.926920554033479505 +24.468782285640848784 283.9433213127680915 38.716618949049291132 +TestParticle +1.4774439717601555166 0.34321703341922732422 34.23200733980726085 +253.1569295809615312 208.55072402648170282 142.78123543474748658 +TestParticle +1.8035383416573496085 0.31178214061844072846 38.848219271007792486 +163.78980370879801853 27.192135308956363104 240.49835213590739613 +TestParticle +1.8523952866624258107 0.2010708076570819347 22.034325231090594599 +124.711476085711595374 323.0644792551414639 138.10178915634389796 +TestParticle +1.9173340778250498317 0.2780025712872400967 25.973495130250071838 +193.9471251677579744 256.51445549034934857 68.5799795393802043 +TestParticle +1.2039954656193134763 0.32062119894339707882 11.801770668367792538 +261.58407010163364248 130.72550628237604542 295.22935271302458204 +TestParticle +1.3539793779063435952 0.05619140956045583224 0.39149769265351963554 +54.55272735280637164 335.83544373800691574 89.36258771851326799 +TestParticle +1.9516074079116982887 0.1921645005309346732 35.371640156848229708 +152.55319109406485723 247.31165449235123788 278.83909188690222436 +TestParticle +1.9301130006872968536 0.047382794904003239234 3.296738006904260665 +186.93636419954495409 38.829849755176162773 177.44532754290727894 +TestParticle +1.2580985637358546025 0.21204965723905899733 16.1659140062293325 +3.289189867948967283 190.84482276807500511 67.97050011468211039 +TestParticle +1.5295225293999865634 0.17172263806479373671 39.618093381378386653 +332.6463231490124599 278.70254383892529404 12.693771958962534185 +TestParticle +1.3231257344221201144 0.2573419902802399073 38.0841373767418645 +20.119441148442565037 244.32686028253979771 48.572638095274754733 +TestParticle +1.2390492871187110957 0.23798618359691314783 30.645766685864785472 +87.001950267678836326 278.12670273948640443 330.89492423249123476 +TestParticle +1.3993417216526349289 0.031843494342214208326 14.144935673919892594 +72.465298766095699534 334.2534597720372176 30.48791433958904662 +TestParticle +1.5347486253277040635 0.04338458251454313519 12.0921328741059639356 +120.79694902396420275 355.45117743828626544 160.7907173842522468 +TestParticle +1.2904906197620742425 0.28414011519071485923 33.037713210604835012 +289.81253890944515206 83.576357577029270374 220.09709176383933027 +TestParticle +1.6058032451228929638 0.36018141227094635504 17.994372902660266789 +3.7010845253058599624 141.54942979100397338 198.05616798418643043 +TestParticle +1.7714414500542230435 0.0035609242707668187222 22.050030319794334588 +264.59185760489833683 10.605770272399395182 215.25949766508875882 +TestParticle +1.81709217161712 0.27368429441007163794 17.149545687672187455 +35.988324614781888044 81.77856120500719328 10.201466538617181001 +TestParticle +1.9507969820486321666 0.104826252022570107214 21.570178232673107743 +110.11799658110533073 203.10615346805144554 174.54637699366600145 +TestParticle +1.5513016726876260876 0.0649073896097557973 28.406030811013923909 +294.40827400152136306 308.45384003953444108 250.69412013121518612 +TestParticle +1.6081730286462514457 0.0904772003540942199 8.756397654381963491 +95.30241023766843966 310.97856820924152998 78.51553642084900275 +TestParticle +1.9445060562513780678 0.34581412562291430346 38.93528925234138427 +322.18458452998703478 206.50871262487711988 171.6753679893202218 +TestParticle +1.2867830568980889172 0.23805020747269362014 30.605085071406584518 +107.834941188806425316 172.69897682961376972 231.64156285513004718 +TestParticle +1.5570299212666793842 0.34247490116827700168 25.701729758850273555 +57.759342054473357564 275.21368529820330195 0.5189093555138457603 +TestParticle +1.8297728730942826036 0.0059327247000139143526 26.27006410810665571 +351.91597475003959516 332.46172667657117472 193.83113607968971337 +TestParticle +1.4663451402621732189 0.019337346272064428326 0.491698998445047053 +336.79769240394642793 248.96724280968578569 175.15811073921727825 +TestParticle +1.724576194857081024 0.052697296256256631608 5.7447084496883027427 +66.182723011463494345 29.130322702617217345 339.9870439485365523 +TestParticle +1.3696669727225077029 0.33229023795273532338 39.64244722837145929 +133.49050184888841386 162.12402403598608203 293.04583577859932575 +TestParticle +1.3783417053600715008 0.2855227081254033128 11.873396199324094624 +181.03404330551020962 111.58079564001488393 50.497053185226064898 +TestParticle +1.8637392080726669086 0.0156183905360887560765 26.799919264480482894 +101.416124536033450454 141.64824974137857794 87.10767556818554169 +TestParticle +1.3990411255817394309 0.016424027824586850954 34.17231113580791657 +351.25674680067004374 51.410447621435544363 109.4743571087562799 +TestParticle +1.7113078627771947104 0.087396542572623220346 21.48366722009397023 +331.26077825265491583 87.597172428811916234 351.11237329056922363 +TestParticle +1.6537452602438895699 0.19076978286361276349 30.899468439263419128 +338.97921655361312787 354.2717007607652704 88.459659106615376345 +TestParticle +1.8713204845226436568 0.34948347966477527615 26.694021521206035885 +22.640920338079904894 267.1658484538838252 91.263466282262129425 +TestParticle +1.7800499814903345541 0.21591168642547953205 4.15893255030611364 +284.8692985786169629 273.15026927162216452 163.62920354405895296 +TestParticle +1.2770584465418410858 0.11704921307575957834 23.561299361007908004 +208.69763432291699701 114.84562071374233483 106.557589971007203644 +TestParticle +1.7789101924514278963 0.21089404756926086182 26.446391287965887784 +166.38039683220225129 280.94687192438289003 156.1732356226829097 +TestParticle +1.5095803628848272204 0.37888764670309865723 23.739638145042558648 +147.5462561757028368 320.06107890549310468 221.66365612858550094 +TestParticle +1.431320096709388201 0.090307147024224890264 8.768204975989792871 +86.741239636344801056 122.03132838806067184 343.580887072082362 +TestParticle +1.6349437899113876682 0.14387102541744481443 11.841216176535350968 +51.14042919054931957 69.171034829460595006 213.79008663660533784 +TestParticle +1.689003605562497734 0.13061345081474304286 24.749487065465949343 +180.96919715736157741 204.68845725307318162 260.67277137781871943 +TestParticle +1.3035444430147782313 0.19990048901013623972 15.958381821114077326 +24.968896817823825529 197.33820599380237581 119.001287940231961215 +TestParticle +1.6620625944290643439 0.2734543708115155236 30.556744105988030924 +323.42922129424488276 115.879900714354221236 18.69101695694187626 +TestParticle +1.9572874068027543704 0.3982637334300366816 23.395690692151514867 +282.1199835387070607 264.2819579212129497 226.80637570406867098 +TestParticle +1.7711614884940887205 0.16471476857196881705 34.541413045241888824 +209.78439563147685476 330.68687123431953978 302.79975669488345602 +TestParticle +1.2768346788945352799 0.2680189005217827325 2.3664781607185281231 +4.5230625737162633015 309.27315231219478164 35.64300138830596154 +TestParticle +1.7331467818212080712 0.08199012177664927181 2.5002689592511995187 +16.248296777956340975 8.818474849161844986 133.32825103025075464 +TestParticle +1.5824962842528258467 0.1664685697946028109 39.01047834163395578 +294.62170247515587107 5.127126749923851534 323.21555884047671725 +TestParticle +1.3065419938771187791 0.062752012732249048965 8.378519051225520542 +254.48399542766591708 227.28662992761130113 215.88914339840525258 +TestParticle +1.2803200151108913296 0.39024438031771679913 26.21206496548343523 +86.2004800657045962 86.508225331489853716 295.03587464294588472 +TestParticle +1.9599644739977994945 0.18082768987187250453 26.76260832548297941 +347.08076935823510212 187.06487585242066984 78.43547038210139988 +TestParticle +1.5504457817332411018 0.058138854268877486475 8.311304083318722391 +250.45953202370188251 51.58641776614162211 321.91182873943205323 +TestParticle +1.4030770961210228265 0.2255632436620616521 8.257376872662526068 +110.66653646497886143 331.8743125077128866 326.8827542847423615 +TestParticle +1.3330653778054313285 0.23576894818100968543 16.555280374134500931 +201.04570271621727784 304.9737571038722308 129.38177632189641031 +TestParticle +1.4676189305416613706 0.15334509742223720319 29.730324421851861416 +93.28877448580836074 98.24809064509591394 318.26221325804715434 +TestParticle +1.4959613849179316247 0.26490707510895572518 8.435591899110246317 +121.44478123997235741 352.46125426578402084 269.21443204906552182 +TestParticle +1.2410245922213516412 0.16484650483123386433 29.036807003172221187 +234.59702065989810649 212.29149699166657683 309.02229933747048563 +TestParticle +1.2104445735427551423 0.27493160452164350227 31.472614096909531156 +172.8652728002631136 303.96742459461654562 8.009940254088059319 +TestParticle +1.8791733750261010449 0.2587599416761243165 30.401845910812088647 +330.1151954343364423 190.20401433347646503 104.67843668270934643 +TestParticle +1.3013630074517779089 0.22413535954031660324 32.01650674239483152 +63.549710245898353378 35.89931403059021875 158.56811223007159128 +TestParticle +1.9547724398089645348 0.0786294356900830993 10.0598953139010802715 +69.4839845505388638 123.32244013516246639 31.421777442531322322 +TestParticle +1.6120256585797529958 0.19985700875898035345 13.999189942348966298 +78.857222386685961624 349.6556927780835622 58.475688092723309808 +TestParticle +1.7578912848822172421 0.27207852440462437782 21.16570903311817986 +204.48739950618715966 68.64871257741852162 227.95088374477833781 +TestParticle +1.8170356771723037426 0.24230078833019122464 19.368483713748780417 +184.73419610737784069 272.32723488431577152 126.891658495766833425 +TestParticle +1.8561231261283124283 0.19157748016708203709 1.1886704509024781373 +254.2676067727032887 317.6217024209003057 224.34445674903426493 +TestParticle +1.9710622679246994071 0.14623926742902368381 6.640292860769481109 +190.41063402021279671 187.773358994985756 328.47417804669458974 +TestParticle +1.8390376809348407683 0.39004880820775639227 20.066519467297950996 +211.93199248227401199 289.47815944254944043 137.15839269809171697 +TestParticle +1.6111502808558577637 0.22394676788626455277 20.061937046580968769 +92.54520491825057604 92.01310424807805077 13.375630065565452753 +TestParticle +1.7289359898596003973 0.029780688540387692531 26.014739049810341243 +312.66680607544742543 228.17665637399315415 125.22825394003517374 +TestParticle +1.2705682146072982963 0.029404610289824398284 5.561963728286389852 +84.16555574179947996 331.08838136349748993 315.88331119433712502 +TestParticle +1.8573347647002547145 0.36089888274309028793 33.45261607330014897 +108.58851164869084016 217.00073148209528995 139.41678117547121474 +TestParticle +1.5119662840275136517 0.035019622195022657996 10.463315222301648788 +152.85193304965602579 42.895445465204801394 38.742869188454783114 +TestParticle +1.7622884149632529471 0.03162410217369809179 3.1822974384423297067 +37.26277315140376345 107.89474442992022318 186.6015285726906825 +TestParticle +1.3516643515537363207 0.00042846679844568138443 14.013484979190140578 +216.76556913128737847 329.5425274371341402 157.99664633404185565 +TestParticle +1.3725976866577220825 0.30646538230027742244 11.329739671767651288 +198.97848141965863533 44.651190190469009167 28.049566579775078168 +TestParticle +1.4591070353626824918 0.08119659950059535114 34.28551752565069677 +306.99758279574081143 104.56005980026995417 24.491183217056139654 +TestParticle +1.6809883631745992094 0.12405907090243922797 23.088918298866115464 +81.89324756024211638 45.486408290411304733 5.9086829848113620045 +TestParticle +1.3535618238311779571 0.11072994226846155641 6.1365791065780417313 +96.5917090856876257 125.77992141224173395 180.26956152431557712 +TestParticle +1.5024996182012646528 0.2601294541852439135 20.11839589454453403 +270.4000045350792334 353.011762488246859 34.641037025004784766 +TestParticle +1.5996488376502526751 0.37889391086596613256 18.528995245881297649 +215.86591794372824893 196.33677334782890966 20.482598606365485239 +TestParticle +1.7931356901400370418 0.025945290910749509855 26.661454696830183764 +188.02499061598265939 217.74613305793528184 352.64512058062791766 +TestParticle +1.6808120166727305023 0.26627765088552390882 4.4798421923713638293 +12.471177251742290082 9.432555892002669751 336.72507040011447543 +TestParticle +1.6313081817828176678 0.0086570580622717507174 3.9083339029362873518 +54.248103250365730332 318.7038881970888724 331.85368591582181352 +TestParticle +1.2884450142579531029 0.1681046156164187344 35.34871223758726444 +240.5583121923978922 135.24748641897326706 301.64571007267852565 +TestParticle +1.9196539088974737819 0.055293464951134657648 39.174420254686374676 +13.003093109260595028 224.19261478871260351 272.9340647583842383 +TestParticle +1.3704960962475472019 0.11179773250371188853 23.81208520955706831 +261.70166394043076252 10.650163480395606896 96.095112534597603826 +TestParticle +1.9516781167723931123 0.20402034023295062548 32.535249468476067136 +340.51354688545097815 329.0040653030519593 109.98356406041511946 +TestParticle +1.8140222569343318337 0.12613518245266175377 1.4950171510413001741 +234.61793333937521311 320.05130111528796988 172.88154495883503614 +TestParticle +1.8102010682471065817 0.14811926068150899072 0.47152065059882453113 +231.56413706767099825 205.2503541540525589 214.7508917825621495 +TestParticle +1.3323729215149744398 0.19959213905409678436 1.3073421511548932727 +151.66443112411295147 341.31892085633529632 144.25232896171203834 +TestParticle +1.2204541150545651362 0.068668187712776870835 4.014281498324958619 +174.08147891950491726 47.939506002741296697 254.99017431971773817 +TestParticle +1.2181192459350491664 0.025059093817326606735 7.204862413525972009 +48.60770716273837877 329.11947000106135874 217.6643233891191187 +TestParticle +1.6039675062130638317 0.35797604454305875787 16.056969103103426733 +87.92417372221831329 49.76521958624503128 164.99398402032807098 +TestParticle +1.8725342069546249135 0.106279250804296898636 0.45718402173144045975 +119.596726134790174 107.86697924451233632 232.81352842822093407 +TestParticle +1.7853111973976689697 0.12193477571081268174 3.680789884957089697 +205.60326749430927862 40.207082764860338386 289.2290546833312419 +TestParticle +1.417950447978111761 0.24357413812980258094 1.910476157584461987 +252.61262373556786542 355.48333419302929315 151.32407206005677835 +TestParticle +1.2280461512973894767 0.15278421763439650749 26.714312283832946093 +142.72673485719965925 232.69712275301176874 346.3375478502677538 +TestParticle +1.61151127031616892 0.3744225370958842447 36.56793088861800811 +328.09520081336302155 25.920977978027824662 288.72452391776596414 +TestParticle +1.2239475600090146123 0.24714055634484358159 30.304522847333871027 +52.68180217169934565 356.99734588216864495 56.617981510557434888 +TestParticle +1.2496667763539286433 0.29747468986797759305 21.37154433932160913 +209.20331717962355356 22.663460638340339415 243.0475686976612053 +TestParticle +1.3767605238800932899 0.16005520292207792155 6.1854407103408437507 +301.0924331535983356 324.9040368073589775 194.17256664039328484 +TestParticle +1.2487797979186712194 0.16488755850697139893 27.605925256805747381 +173.22312758245544728 239.01695963206066153 175.97057379774636843 +TestParticle +1.2254722592225348876 0.36803675574552041638 17.169692704564543106 +198.47031096951334916 278.36167082537872375 125.492714298233096315 +TestParticle +1.6464965033862297705 0.1517233377674910566 13.532163365202411143 +147.08019388518567894 177.40254091222027455 340.04568453953692142 +TestParticle +1.2241673144222895431 0.1378443050280294957 35.034429639418924296 +279.5154571951889011 236.88366494050367805 224.20218590463449004 +TestParticle +1.7054405098540872388 0.3610118405579151868 11.466405393735001894 +354.5918155292421261 347.1596768668937898 219.93975816420154956 +TestParticle +1.7400094098497860262 0.11768201787113397039 3.0207223829180174235 +344.79550555000747636 295.17286383856117027 107.65817940211057646 +TestParticle +1.4518563888365596526 0.034369934761878086216 5.703231914559241389 +123.995036213356954136 112.321809800044363215 96.308678475290903975 +TestParticle +1.2222379634093671896 0.14278765376770935491 35.361595327244465636 +315.14729198154049072 321.37175810105372875 262.59992588280709924 +TestParticle +1.2388409450815878188 0.29191544705043231955 14.574148472908646568 +354.52890314367516567 301.2116870378684439 101.6607227628783221 +TestParticle +1.2004854536116522645 0.31759418786438237126 35.64893550976294989 +150.1713542262849046 263.81583006909363576 352.70617164487305217 +TestParticle +1.9942890442362894987 0.19536136516905414084 35.02451517807598691 +125.959361711604387324 266.3424034858336995 225.8398826035477498 +TestParticle +1.5915447637460526931 0.0895260552791858899 24.02901618574255238 +322.40268348510250007 115.71588659763698104 232.13880147735969217 +TestParticle +1.8790673483459361393 0.17433764017862168894 13.878215826572342095 +302.39495868122469346 259.03939837677381774 176.29569985086394013 +TestParticle +1.9699962554990502195 0.38438649317544010264 36.886012906803621547 +71.57770428256088735 76.46325818263683516 152.99488881347215852 +TestParticle +1.9815372834826587845 0.17262153411198999375 2.83353778898145503 +239.37167896200179484 354.1664112035709877 298.12866718881934958 +TestParticle +1.8155595191765212526 0.00946228278143057544 38.64106328673518931 +83.00268912398927057 67.39652732514183242 195.80213873516331091 +TestParticle +1.8868581896910789908 0.10440835820682173307 15.007174114646065988 +3.363490125056509683 163.21113577536885941 277.4874262071848534 +TestParticle +1.5619200947925855338 0.0059432103700412857936 28.417160713316764742 +199.61588156187738718 146.61610611302111806 239.63331133984317489 +TestParticle +1.5212478213877396183 0.39927753429172280208 20.482036387314252579 +328.51885419136107203 7.1256709736876455707 220.89114467811927511 +TestParticle +1.8571870020289564795 0.091291230530104086616 5.8118062401183578913 +90.75198382995706936 192.24228564818409382 97.133874093047666065 +TestParticle +1.9171289936627273764 0.15261088480197210204 38.10675746822411014 +307.07749448841616413 355.13520879558041088 42.711583491490678455 +TestParticle +1.7364144307839262105 0.212129283201967056 18.744823342299753222 +23.928680492317099038 37.437700592246308418 64.10777424122947821 +TestParticle +1.615801582218067356 0.15507189040762445198 5.289237911360147315 +2.9760090649453463385 170.77756092233224194 126.74171547116436898 +TestParticle +1.3071905708698117188 0.34127930871062794882 17.996264880013068677 +181.87012353589301483 211.32152679731703415 284.19737442691894103 +TestParticle +1.2265401930807908748 0.25798059801133454982 34.025699672304931198 +87.484085061199664324 233.26336671618474838 310.39211945198593412 +TestParticle +1.2051260378681512009 0.3069049294618042545 37.351493484362229935 +114.521127203859620636 225.6531083956228656 323.1220799515929798 +TestParticle +1.8334732437656884318 0.37979115889431414033 14.226342594064389502 +331.7883640504541063 109.06927231695421199 144.65450510058425948 +TestParticle +1.757300956926634683 0.03414936250768385584 23.912004140762192606 +322.3724083824729405 134.91275424426311247 171.32647169967813738 +TestParticle +1.8972253261023601656 0.35656552318718498507 28.47629514891832514 +321.29937216619140372 70.71608626545858556 213.57910706058532924 +TestParticle +1.9917616839747163127 0.32376104104249381344 8.91181936527569718 +200.88415597368361887 23.513470382909822831 100.72835347725671795 +TestParticle +1.6165777777920147251 0.32043762073249004718 16.726392824188689445 +319.72153811597894446 76.78830327849077264 138.42254101919101572 +TestParticle +1.8908331674281746437 0.045197492899151252288 1.3383682043347544521 +312.10875470237436957 307.494732749847401 43.074246036675127414 +TestParticle +1.2145287335503922588 0.18257617394552527745 31.629727041908243024 +3.7714421582542145828 327.9557064611080932 329.9790680610109348 +TestParticle +1.8625485962061800738 0.24850308301344462003 2.0061095060140976543 +276.90239618431269264 350.88215248164351578 348.2932770314767481 +TestParticle +1.7953658240966166026 0.23860504712104810277 30.564301023692120651 +268.6736542028508552 254.54176920249031468 269.62615941325310587 +TestParticle +1.8519636256102920413 0.13630536382454808142 25.429742406638986552 +78.06201903944463538 183.89412111638756642 25.670444097748280399 +TestParticle +1.9912586036233026476 0.0062934836627138949355 3.9866901191125192483 +353.92558378078365422 121.86076402069599567 272.13181013382109086 +TestParticle +1.2352461280314077641 0.13108872108404742707 2.4473753819670784893 +223.0667681463768588 134.42147854096177184 161.85468044136672461 +TestParticle +1.3431819133091436047 0.28681705477285673878 22.82513974594832007 +232.7183120134940566 120.199688171678360504 89.77367022064561297 +TestParticle +1.8403545873570172908 0.24879279733973019839 4.0287923881425502515 +15.018525270146003692 85.179302481017629134 62.783331763645470858 +TestParticle +1.381867054141263651 0.041622600218831219687 20.582798332241445394 +16.94221565894110526 117.67293863884100347 301.82514806956680786 +TestParticle +1.8641683600359446604 0.24640721081737218534 5.9107924107914655565 +193.20103651885807494 44.2323469313580091 26.743437036080784708 +TestParticle +1.966054790276180464 0.2690464178872462031 14.878455955491389773 +190.60763663869553852 31.588470897177995056 100.366806653161106055 +TestParticle +1.6058040413293108717 0.29951736276665757996 32.261171438174280013 +128.57574732488706104 32.785220122308132318 5.815690987139072732 +TestParticle +1.6218958057245982385 0.20051601410731448305 35.228407716619500434 +275.05072744657877593 300.36353903970075407 137.58872709072204543 +TestParticle +1.9766063717976680714 0.39029116187457174592 35.936563690886423217 +276.4677919812604614 334.4193480382128314 74.17428380404710708 +TestParticle +1.4924898153539933876 0.12959279079593266637 39.497773315041648345 +306.13052013355064673 297.98869981653200512 134.11781736074624405 +TestParticle +1.8353633188339963933 0.019510947086492525654 35.474352018859882207 +260.37806171878622763 151.50200809864463736 309.73656114784841975 +TestParticle +1.6024488136145134121 0.027272421536337843745 28.531535673798313013 +11.154644928392061232 313.60248630627489774 220.0912732804740699 +TestParticle +1.4120513432815475774 0.29969768596351453738 17.02938110092897972 +269.20328072337844105 42.08893931076963213 126.58679602124011865 +TestParticle +1.7381168022087705172 0.29181610891675680008 0.578376627518526476 +102.38820556898792802 176.55332025897169501 164.93491360823296077 +TestParticle +1.651697945678905155 0.10215579780054198644 29.466376982324295142 +118.66030632495935038 355.77634853151920424 138.86820482744579408 +TestParticle +1.8964095997568284346 0.14855799694311630499 39.315092089557069244 +66.7203702634703717 109.12901978076088483 150.07738642659984407 +TestParticle +1.5884778821144036609 0.34804404474317385265 8.230716828452404599 +238.65003666711348274 19.561503330036060788 172.3300970659766449 +TestParticle +1.4852533118509871901 0.14921150930008680868 19.72836045372870828 +214.04378603222667721 162.09311096493223658 74.70412564882457218 +TestParticle +1.3995786109265431207 0.2170751900351963748 5.6353499706781517986 +136.77890520256397622 41.74190372493747958 352.76491235469808316 +TestParticle +1.9228837399064100389 0.20666458127164555325 31.918474396874408683 +25.57157805855647581 146.61033704579944015 124.85803020390667939 +TestParticle +1.5491200767868975596 0.37703244317878858993 5.088593545490081027 +38.820500192778638393 121.37946795513649079 24.303500272632902579 +TestParticle +1.6942853977776144436 0.090260172320617615416 25.30769952267446854 +161.30886094388631591 116.98046667590497805 38.286029141363265182 +TestParticle +1.6090251866675413517 0.330322662148613444 9.770748848728519675 +263.0814719840412863 130.26024091675910199 286.9327501208536546 +TestParticle +1.9761336997553433648 0.2926123710566602143 11.274914096097191418 +332.1701813530870595 307.94382558508260672 353.807211256272808 +TestParticle +1.9968906969927759931 0.3233230682542853618 26.00314542561351061 +79.80693890771757992 308.2283099476609891 243.34005704939397674 +TestParticle +1.8031947344086236562 0.14995127116151910074 1.730342239053141995 +348.6351290160268377 154.3487630625562872 28.463371915640660603 +TestParticle +1.8395166633814701296 0.3354540599588180516 22.093131712634573205 +86.610640388957989444 239.4548535151652402 312.24619268529380633 +TestParticle +1.3629305527230259898 0.2099232743767838194 30.216497531918712127 +102.43196923936434928 291.32106047341460453 2.1370626980559981334 +TestParticle +1.7455726368986721475 0.026854653926422458743 3.5759919284920771432 +354.23018906949636175 218.20031690429203763 328.7114242710409826 +TestParticle +1.8154807930100198554 0.38785895954054117052 30.190244155261783732 +84.158791911543673336 145.33493614486761203 216.44848876198116727 +TestParticle +1.6499702946012431148 0.38233820338992924315 13.614607279413908358 +33.87451574095803153 90.770300669062208954 180.38849672518907141 +TestParticle +1.607515534627930176 0.059816004314718410062 35.188867073591850954 +58.61309722228839547 253.79649442362003242 91.30583916434224534 +TestParticle +1.9899983350379286673 0.30667218968608733753 39.83983478820580615 +209.92012615445401025 242.81573248914770602 7.221381167673248669 +TestParticle +1.5778501251334575706 0.11118331397677137795 37.590979480700937643 +345.16243909883007746 9.645072368649788785 50.426633047687808187 +TestParticle +1.8837383001263663385 0.20673789324487820696 21.972954461156501083 +78.99100998693006659 24.805859834858065227 136.69965104577451598 +TestParticle +1.8299552552499931402 0.18024309648678646378 33.71418287836082328 +287.1584786318022111 76.47733005592756683 216.63675723929046057 +TestParticle +1.8307526657330810416 0.27679256938591745296 14.42019596286409211 +147.28115682985833246 236.20842913390856666 70.36203841533576053 +TestParticle +1.7619978997528076281 0.014257923627121950327 18.454020582426768016 +275.7628626446463045 152.24331061485040095 103.04339508992384822 +TestParticle +1.2611641121223651218 0.2092199031608525106 17.779518579686019564 +102.7504319389703511 6.548313747168017507 140.31125376249352144 +TestParticle +1.7663975820756958601 0.25859601590736014387 19.29766354922654159 +228.43411110252168328 129.52408847472079856 44.31277736443019677 +TestParticle +1.3455298896696588073 0.051640741433284009787 36.190409530870716992 +63.492703118667094486 178.32472671129730202 219.22272979662204762 +TestParticle +1.8502619397752217978 0.016055258128672856427 24.72292322260771158 +280.24156788062276746 1.0103622910431475646 89.91460784296667441 +TestParticle +1.7394822607661057923 0.13625236700994178274 8.773342269773106494 +131.40116141700701746 79.224373058834927974 282.8109557650995498 +TestParticle +1.6325195629104731765 0.16262358056449152666 8.946438635142083484 +196.95655091099223455 13.582007343579313385 258.10561033792743046 +TestParticle +1.7657479077259037314 0.21823895457628741945 26.194016006374575056 +307.4759621278849977 98.40357006941655982 64.08127327032266862 +TestParticle +1.3184659717472237972 0.20902078438144011674 11.194180638539418027 +209.8144125213535176 233.63319375255508703 171.85375675646986338 +TestParticle +1.6265974791221389228 0.3412246124964996019 31.920108006714791316 +47.471005836654683208 293.97130420183299293 294.00277926085681202 +TestParticle +1.544562457381803755 0.26456236803106419897 16.966290843319804083 +53.617851002077699718 23.906897211735604003 172.46215455198040445 +TestParticle +1.8302658298265410686 0.016558573352333152279 23.88277176507106958 +160.31985284355113208 24.957240748542652398 126.6630513998358083 +TestParticle +1.6333356556090419254 0.25338625439533907224 11.051395862722980468 +182.26698944663951352 1.9926145156870767039 206.81766326774084064 +TestParticle +1.2674061997735568408 0.09083958911004344494 16.414033820600888447 +209.7777498397578313 350.73333597951523188 247.44407246182404947 +TestParticle +1.400118114272113079 0.16683948053104513676 27.357400210939808005 +107.57418681944162131 96.46599300991492498 351.137614793950263 +TestParticle +1.542911801971112773 0.22704910395233757203 35.542775761322914718 +183.89056710921508397 326.93869125935344755 108.004775809479497184 +TestParticle +1.8076126800363871983 0.3514591336111956288 31.06364189291468847 +32.09942049648420692 328.34181095498098557 23.785841162187210784 +TestParticle +1.7657364621109161718 0.22171357606490707526 37.37986273837123008 +76.229451450918475075 186.15095789038804241 272.82850857627113328 +TestParticle +1.5339591135633763308 0.14194102156165430695 16.888317976342129612 +130.44976850069960506 252.36020783978619875 120.456187175611859175 +TestParticle +1.9547780848567972711 0.20899592311387996113 28.868044731219395516 +228.48529363010104021 342.5481929867736426 287.9707078087696459 +TestParticle +1.2418423098941544502 0.2626072565929837288 2.1074243271891202056 +38.080338719023941962 119.27817821310316049 12.056891938029119515 +TestParticle +1.2210546528534078625 0.3775561742151631872 22.111051712315155982 +338.55211294801040367 12.980519500186410653 332.2853401701941607 +TestParticle +1.5963937431999124517 0.23239324239635986147 13.194381854516867847 +58.007673822576016676 88.15306827351753327 155.81366075873469867 +TestParticle +1.5786275082915319778 0.025562551186680871479 4.998454237047265103 +250.39244849302215812 165.61747690949906087 149.37807874408460407 +TestParticle +1.6098684422151645634 0.21941479472017652586 38.283886043658093 +237.71100658433758213 47.01387761056833625 340.9146849041053997 +TestParticle +1.294274143429140933 0.3692138815235402327 37.966030890732696434 +203.45477640609851733 296.29180039237496658 44.323085276308532343 +TestParticle +1.5889819356899443914 0.084869830381732264124 1.0823445911213003257 +301.3291216497269147 146.81272157061789585 2.2993592847625343722 +TestParticle +1.495972566018333838 0.2617122471497527747 13.094048981160977263 +112.72021003020111607 127.77611875010921949 296.87288781423353612 +TestParticle +1.9818950278621338956 0.30723187525460954328 2.2340086246482782073 +253.14761844363803789 165.37409022827591798 191.3408807414710111 +TestParticle +1.7869956116636900312 0.045787597413756889186 8.90426427671208387 +227.8168631112827427 149.58799389390406986 24.858909708161100127 +TestParticle +1.9448897771198014883 0.05694944930378804948 36.311102677736613487 +84.3756745725393813 14.735521995724774058 314.16923571788140634 +TestParticle +1.5778886440600849994 0.054612245238724765883 16.72994958727242576 +293.0541083071825028 260.48271034952341552 308.15802194547808313 +TestParticle +1.3022587146281570103 0.26839233124203137892 18.02838057643581493 +293.20763835009915965 312.4703557364094877 106.58503108046902241 +TestParticle +1.8428500612922003032 0.23594727253001890332 11.315478566151577766 +9.262284156503813648 11.174441070760416039 331.91331034768620611 +TestParticle +1.2400313949450130213 0.37422492957960290516 16.60903446615966672 +240.33042266148279964 153.97322107823731585 191.41559045744850209 +TestParticle +1.9829274684920319416 0.3634611481375451536 25.819601695264427832 +140.99742244780588862 341.49734482956387183 8.731842495851447339 +TestParticle +1.9975413987753882772 0.06592938413948253029 39.49276861893206103 +67.714562888696974596 98.14914061512281762 45.19626721853934015 +TestParticle +1.2436383625451867818 0.3204615517738288455 26.461603913930925813 +266.5125426106603186 127.50909218237357834 0.3132830361456928614 +TestParticle +1.4113215699552892346 0.009827894395237192146 37.858626352737367426 +253.23691224458718807 108.52674294880429784 352.47828245113328194 +TestParticle +1.8148473149676069838 0.017705697189401049807 27.03434752366788274 +244.97100671505916125 96.848173936006702434 232.97923224763914618 +TestParticle +1.8212512693609279602 0.27211932176121911287 4.7578666520375545446 +347.57353058021692505 254.19838041200335965 6.6604121361125034895 +TestParticle +1.6430443076417013959 0.042365150738876616865 28.313700526240026534 +178.6338948507659552 287.94750707892865194 146.775946581025039 +TestParticle +1.2047662238103988841 0.23251833898522478172 17.70944339203029827 +282.07165060128687628 43.193800331112015556 189.58232124886598058 +TestParticle +1.2467705317577537638 0.29356902400030004952 2.8706191725519047964 +242.4004033144470327 28.806681869090574821 296.21360336099968436 +TestParticle +1.3162696178512978129 0.30749173225083181737 9.346008763094072691 +322.38053647407821245 112.34526406313270286 132.09084683753127365 +TestParticle +1.2971409174950825349 0.3376994788613812415 24.652899562822732094 +299.7803539105363484 271.40817959188655095 266.8572235615602608 +TestParticle +1.7684747977650516759 0.02661749740193952718 10.096507324045376208 +3.7221406213358587678 125.36494422546940086 238.11022628505401144 +TestParticle +1.8562458518793771844 0.077017667000931988586 8.7143363020037831745 +136.69548804548151111 320.94977656886021578 128.10172157330882214 +TestParticle +1.5044816034257817439 0.21762930629061374987 27.505997823490588416 +123.58136898241176027 187.9229325893226985 113.043904522795230605 +TestParticle +1.7868133877825629341 0.008087932404090647162 23.413784625415864582 +218.89711766597091014 88.56442540385896223 208.43834176513581724 +TestParticle +1.9402143213090712326 0.14949494785208861103 26.511808095563488052 +107.604663311176523166 130.69889435502176411 346.87469017336604793 +TestParticle +1.5966683044291980487 0.087101617604941061757 35.919427778579809285 +212.8714684966646189 289.47277777746671745 150.30140968266374557 +TestParticle +1.5311077130660335488 0.006686025386596972271 2.6738949911861054076 +164.51009812173990099 316.04513748492058767 258.44750388729431734 +TestParticle +1.327174430660648996 0.16386649979480424899 29.516591637239059764 +42.47034129892313814 297.69030488053482486 179.48650722792217493 +TestParticle +1.3309285665414212207 0.31056216374123679635 33.20416058697580297 +182.12327311281021025 179.4712707903883313 47.404071121072391293 +TestParticle +1.2695626979113197041 0.028739588397623319627 34.7510196296938787 +156.66911337647667324 15.489917584647256987 137.9360720619328049 +TestParticle +1.961564416777008768 0.38198101311209609054 20.407128195470789933 +116.450533784431996764 317.3401517067230202 183.14633665136960872 +TestParticle +1.5940513845582582331 0.25613384894831064953 29.533539385317940429 +118.85654306899444066 250.92868906503659332 22.448371873007765487 +TestParticle +1.8442908242187292522 0.19455300058304564326 38.64468812151265098 +327.51192512776293597 261.15575066638751878 220.98151223015130995 +TestParticle +1.9551136736888132805 0.05881060116092867024 0.025983316883650964257 +229.51441899139550173 217.59860795663826138 108.775137355673251705 +TestParticle +1.3586578999851930405 0.34983150673028151623 31.522812174550345787 +105.68138198042714748 123.58623362447058014 40.330126317320825535 +TestParticle +1.902888826244875764 0.13683561730200419215 16.275257623666469442 +105.98161437435868493 148.2954616585051042 301.45848496238744474 +TestParticle +1.4388714351119729074 0.12902603848379340379 21.287394563627660915 +197.02123109899764586 352.44807359808243064 351.33034912544712824 +TestParticle +1.6931112006676685144 0.013916379702603532201 0.7871365555378062595 +188.64764325380838272 181.38199447667832942 29.813972851285797105 +TestParticle +1.6449616174898105125 0.0310490777007133463 9.657476944838542465 +333.95122687579464582 342.1511167418379955 160.69927097810261785 +TestParticle +1.432310913839848876 0.006987746683723328363 32.61241995358341228 +207.28809337462874396 169.31652720575732474 255.68956575096319739 +TestParticle +1.7327468488118134005 0.03857017036911090241 17.468015575192744393 +143.82903277012908916 99.60548209763706495 166.68173997089294858 +TestParticle +1.5512315858530165702 0.17035757433763087931 28.229428870918749084 +211.42236583345217582 136.37631347760083145 126.78807511085641124 +TestParticle +1.5128716646861577466 0.25892751799964647264 10.396770119409808331 +251.02700694813202631 225.21225462676682127 190.02303419914397864 +TestParticle +1.3509296764855895923 0.19460583033279599263 25.473407765343523579 +153.07999025709941066 160.34541100643662048 39.661129674485906094 +TestParticle +1.6995982689149604639 0.3683946534553529384 13.407331577384432819 +340.26004127001408506 272.0620153240722061 254.6289696923701058 +TestParticle +1.4262589721598459835 0.39380044551624404647 22.273999686412832233 +126.6676609334621304 343.6417878124360641 356.69746962842407356 +TestParticle +1.3261721625529891977 0.39678878113200655164 4.2056417606931040254 +238.10434769519417841 155.06469638647084253 44.875703119243368633 +TestParticle +1.9576977154420573957 0.26084185228864192885 4.55948470669549355 +190.48438127706978662 33.209683105017965943 111.270270586090106235 +TestParticle +1.8552016088932457016 0.13548857795579999364 39.778098090381654117 +36.82048012699509343 277.63542496441021967 284.2017295471840157 +TestParticle +1.6904488396185337606 0.10545628795963413182 32.08178306599211993 +75.246216623590498784 230.69409080017558722 202.52540071832260082 +TestParticle +1.8262524413841534354 0.33415074562628183097 12.176323543258451565 +135.12569593248673527 273.69848190668875532 306.5447498396289916 diff --git a/examples/symba_hungarias/swiftest/control_pl/hungarias_5pl_500tp_17_param.in b/examples/symba_hungarias/swiftest/control_pl/hungarias_5pl_500tp_17_param.in new file mode 100644 index 000000000..ba1fb3c2b --- /dev/null +++ b/examples/symba_hungarias/swiftest/control_pl/hungarias_5pl_500tp_17_param.in @@ -0,0 +1,38 @@ +! VERSION Swiftest parameter input +T0 0.0 +TSTOP 200000000.0 +DT 0.005 +ISTEP_OUT 200000 +ISTEP_DUMP 200000 +OUT_FORM XVEL +OUT_TYPE NETCDF_DOUBLE +OUT_STAT REPLACE +IN_TYPE ASCII +PL_IN hungarias_5pl_500tp_17_pl.in +TP_IN hungarias_5pl_500tp_17_tp.in +CB_IN hungarias_5pl_500tp_17_sun_MsunAUYR.in +BIN_OUT hungarias_5pl_500tp_17_out.nc +CHK_QMIN -1.0 +CHK_RMIN -1.0 +CHK_RMAX 1000.0 +CHK_EJECT 1000.0 +CHK_QMIN_COORD HELIO +CHK_QMIN_RANGE -1.0 -1.0 +MU2KG 1.988409870698051e+30 +TU2S 31557600.0 +DU2M 149597870700.0 +IN_FORM EL +EXTRA_FORCE NO +PARTICLE_OUT hungarias_5pl_500tp_17_particle.dat +BIG_DISCARD NO +CHK_CLOSE YES +RHILL_PRESENT YES +FRAGMENTATION NO +ROTATION YES +TIDES NO +ENERGY YES +GR YES +INTERACTION_LOOPS ADAPTIVE +ENCOUNTER_CHECK ADAPTIVE +ENERGY_OUT hungarias_5pl_500tp_17_energy.dat +GMTINY 3.646098141953443043e-08 diff --git a/examples/symba_hungarias/swiftest/control_pl/hungarias_5pl_500tp_17_pl.in b/examples/symba_hungarias/swiftest/control_pl/hungarias_5pl_500tp_17_pl.in new file mode 100644 index 000000000..8f4ffd063 --- /dev/null +++ b/examples/symba_hungarias/swiftest/control_pl/hungarias_5pl_500tp_17_pl.in @@ -0,0 +1,79 @@ +13 +Mercury 6.553709809565314146e-06 0.0014751274117575772341 +1.6306381826061645943e-05 +0.38709894990924181846 0.20562369687869339052 7.0036069691825035832 +48.302897646473702764 29.190213908309409874 163.69992642152809026 +0.0 0.0 0.34599999999999997424 +3.5735549824428292985 -18.380047749494480457 34.361526740492798437 +Venus 9.6633133995815381836e-05 0.006759122875155079725 +4.0453784346544178454e-05 +0.7233300630551103838 0.006773384545514573099 3.394505355540899938 +76.62090440289564697 55.183156101464518883 271.2285045598760007 +0.0 0.0 0.4000000000000000222 +0.17650282045605921225 -3.6612475825356215592 8.702866268072763821 +Earth 0.000120026935827952456416 0.010044657392872289059 +4.25875607065040958e-05 +0.99999328599172943033 0.01668004783869252855 0.0027793940989077428085 +175.84932558359508903 287.2227751976308241 324.72725799674782365 +0.0 0.0 0.33069999999999999396 +4.827962479462605839 0.034731626640621778608 2301.2114260455621944 +Mars 1.2739802010675941808e-05 0.007246146587933918669 +2.265740805092889601e-05 +1.5236121180553410248 0.093387475645674775104 1.8479297186242829021 +49.490271729763087194 286.7387645553690163 252.78317601821959215 +0.0 0.0 0.3644000000000000017 +997.9376283354346323 -909.38573894978675416 1783.4600697011568969 +Jupiter 0.03769225108898567778 0.35525381666404283465 +0.00046732617030490929307 +5.203268729924161562 0.04848413524543258163 1.3035624911873560094 +100.51639734596980702 273.421918018626684 325.351028522703416 +0.0 0.0 0.27560000000000001164 +-80.967241888586720104 -2387.9998942634933492 5008.7344122962876782 +Saturn 0.01128589982009127331 0.43764770913411007376 +0.00038925687730393611812 +9.581513697274186114 0.05248801962394190196 2.4862838811768979141 +113.59546767797320399 335.45662431368151601 228.84653123700309152 +0.0 0.0 0.22000000000000000111 +441.9323685947327233 378.52918410105413535 5135.911248678291292 +Uranus 0.001723658947826773068 0.4699394560146697986 +0.00016953449859497231466 +19.24773626798451076 0.04408736292912442123 0.7704474968533898682 +74.09072726634606454 95.12631113857929677 237.66915583105441101 +0.0 0.0 0.23000000000000000999 +-677.3000258209181323 -3008.109907190578637 -836.301326618569835 +Neptune 0.0020336100526728302882 0.7816500366521773358 +0.000164587904124493665 +30.297815841143489024 0.013873050398302080172 1.7688477929856469828 +131.74107055888509876 246.83916166351488641 334.07963351871291025 +0.0 0.0 0.23000000000000000999 +1231.0256802954641403 -2178.2009371051150557 2329.6179923847095223 +Planetesimal 3.646098141953443043e-07 0.0021579178542993813182 +7.585803886728505278e-06 +1.4833614415692299993 0.22741315975763076729 31.813233836229972695 +353.17976431207927135 140.04791609627329763 276.36980676609317698 +0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 +0.0 0.0 0.0 +Planetesimal 3.646098141953443043e-07 0.0023146091557723819966 +7.585803886728505278e-06 +1.591071674547404724 0.20226306525263618163 1.0591008596928608299 +174.06697724512676473 335.3163306230074454 223.56527105994337035 +0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 +0.0 0.0 0.0 +Planetesimal 3.646098141953443043e-07 0.0022981274462569030274 +7.585803886728505278e-06 +1.5797420809126441199 0.24741174618562222776 29.534567106616030685 +344.82468258123401483 161.14487195055056645 152.5251306953267374 +0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 +0.0 0.0 0.0 +Planetesimal 3.646098141953443043e-07 0.0023375315639560956954 +7.585803886728505278e-06 +1.6068286304388843533 0.28919101512899575424 7.37565965800404566 +336.92026211210111342 206.23395515463789707 358.94392598114910697 +0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 +0.0 0.0 0.0 +Planetesimal 3.646098141953443043e-07 0.0021752159010438748034 +7.585803886728505278e-06 +1.4952521887096372755 0.07630357603197107652 15.560677329970133087 +226.73360615217720238 40.68010911926434403 329.55798685742456655 +0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 +0.0 0.0 0.0 diff --git a/examples/symba_hungarias/swiftest/control_pl/hungarias_5pl_500tp_17_sun_MsunAUYR.in b/examples/symba_hungarias/swiftest/control_pl/hungarias_5pl_500tp_17_sun_MsunAUYR.in new file mode 100644 index 000000000..b2cb85c35 --- /dev/null +++ b/examples/symba_hungarias/swiftest/control_pl/hungarias_5pl_500tp_17_sun_MsunAUYR.in @@ -0,0 +1,7 @@ +Sun +39.476926408897626 +0.004650467260962157 +4.7535806948127355e-12 +-2.2473967953572827e-18 +0.0 0.0 0.07 +11.209306302144773 -38.759372036774764 82.25088158389266 diff --git a/examples/symba_hungarias/swiftest/control_pl/hungarias_5pl_500tp_17_tp.in b/examples/symba_hungarias/swiftest/control_pl/hungarias_5pl_500tp_17_tp.in new file mode 100644 index 000000000..573541ac9 --- /dev/null +++ b/examples/symba_hungarias/swiftest/control_pl/hungarias_5pl_500tp_17_tp.in @@ -0,0 +1 @@ +0 diff --git a/examples/symba_hungarias/swiftest/control_planets/hungarias_5pl_500tp_17_param.in b/examples/symba_hungarias/swiftest/control_planets/hungarias_5pl_500tp_17_param.in new file mode 100644 index 000000000..ba1fb3c2b --- /dev/null +++ b/examples/symba_hungarias/swiftest/control_planets/hungarias_5pl_500tp_17_param.in @@ -0,0 +1,38 @@ +! VERSION Swiftest parameter input +T0 0.0 +TSTOP 200000000.0 +DT 0.005 +ISTEP_OUT 200000 +ISTEP_DUMP 200000 +OUT_FORM XVEL +OUT_TYPE NETCDF_DOUBLE +OUT_STAT REPLACE +IN_TYPE ASCII +PL_IN hungarias_5pl_500tp_17_pl.in +TP_IN hungarias_5pl_500tp_17_tp.in +CB_IN hungarias_5pl_500tp_17_sun_MsunAUYR.in +BIN_OUT hungarias_5pl_500tp_17_out.nc +CHK_QMIN -1.0 +CHK_RMIN -1.0 +CHK_RMAX 1000.0 +CHK_EJECT 1000.0 +CHK_QMIN_COORD HELIO +CHK_QMIN_RANGE -1.0 -1.0 +MU2KG 1.988409870698051e+30 +TU2S 31557600.0 +DU2M 149597870700.0 +IN_FORM EL +EXTRA_FORCE NO +PARTICLE_OUT hungarias_5pl_500tp_17_particle.dat +BIG_DISCARD NO +CHK_CLOSE YES +RHILL_PRESENT YES +FRAGMENTATION NO +ROTATION YES +TIDES NO +ENERGY YES +GR YES +INTERACTION_LOOPS ADAPTIVE +ENCOUNTER_CHECK ADAPTIVE +ENERGY_OUT hungarias_5pl_500tp_17_energy.dat +GMTINY 3.646098141953443043e-08 diff --git a/examples/symba_hungarias/swiftest/control_planets/hungarias_5pl_500tp_17_pl.in b/examples/symba_hungarias/swiftest/control_planets/hungarias_5pl_500tp_17_pl.in new file mode 100644 index 000000000..cd9d16020 --- /dev/null +++ b/examples/symba_hungarias/swiftest/control_planets/hungarias_5pl_500tp_17_pl.in @@ -0,0 +1,49 @@ +8 +Mercury 6.553709809565314146e-06 0.0014751274117575772341 +1.6306381826061645943e-05 +0.38709894990924181846 0.20562369687869339052 7.0036069691825035832 +48.302897646473702764 29.190213908309409874 163.69992642152809026 +0.0 0.0 0.34599999999999997424 +3.5735549824428292985 -18.380047749494480457 34.361526740492798437 +Venus 9.6633133995815381836e-05 0.006759122875155079725 +4.0453784346544178454e-05 +0.7233300630551103838 0.006773384545514573099 3.394505355540899938 +76.62090440289564697 55.183156101464518883 271.2285045598760007 +0.0 0.0 0.4000000000000000222 +0.17650282045605921225 -3.6612475825356215592 8.702866268072763821 +Earth 0.000120026935827952456416 0.010044657392872289059 +4.25875607065040958e-05 +0.99999328599172943033 0.01668004783869252855 0.0027793940989077428085 +175.84932558359508903 287.2227751976308241 324.72725799674782365 +0.0 0.0 0.33069999999999999396 +4.827962479462605839 0.034731626640621778608 2301.2114260455621944 +Mars 1.2739802010675941808e-05 0.007246146587933918669 +2.265740805092889601e-05 +1.5236121180553410248 0.093387475645674775104 1.8479297186242829021 +49.490271729763087194 286.7387645553690163 252.78317601821959215 +0.0 0.0 0.3644000000000000017 +997.9376283354346323 -909.38573894978675416 1783.4600697011568969 +Jupiter 0.03769225108898567778 0.35525381666404283465 +0.00046732617030490929307 +5.203268729924161562 0.04848413524543258163 1.3035624911873560094 +100.51639734596980702 273.421918018626684 325.351028522703416 +0.0 0.0 0.27560000000000001164 +-80.967241888586720104 -2387.9998942634933492 5008.7344122962876782 +Saturn 0.01128589982009127331 0.43764770913411007376 +0.00038925687730393611812 +9.581513697274186114 0.05248801962394190196 2.4862838811768979141 +113.59546767797320399 335.45662431368151601 228.84653123700309152 +0.0 0.0 0.22000000000000000111 +441.9323685947327233 378.52918410105413535 5135.911248678291292 +Uranus 0.001723658947826773068 0.4699394560146697986 +0.00016953449859497231466 +19.24773626798451076 0.04408736292912442123 0.7704474968533898682 +74.09072726634606454 95.12631113857929677 237.66915583105441101 +0.0 0.0 0.23000000000000000999 +-677.3000258209181323 -3008.109907190578637 -836.301326618569835 +Neptune 0.0020336100526728302882 0.7816500366521773358 +0.000164587904124493665 +30.297815841143489024 0.013873050398302080172 1.7688477929856469828 +131.74107055888509876 246.83916166351488641 334.07963351871291025 +0.0 0.0 0.23000000000000000999 +1231.0256802954641403 -2178.2009371051150557 2329.6179923847095223 diff --git a/examples/symba_hungarias/swiftest/control_planets/hungarias_5pl_500tp_17_sun_MsunAUYR.in b/examples/symba_hungarias/swiftest/control_planets/hungarias_5pl_500tp_17_sun_MsunAUYR.in new file mode 100644 index 000000000..b2cb85c35 --- /dev/null +++ b/examples/symba_hungarias/swiftest/control_planets/hungarias_5pl_500tp_17_sun_MsunAUYR.in @@ -0,0 +1,7 @@ +Sun +39.476926408897626 +0.004650467260962157 +4.7535806948127355e-12 +-2.2473967953572827e-18 +0.0 0.0 0.07 +11.209306302144773 -38.759372036774764 82.25088158389266 diff --git a/examples/symba_hungarias/swiftest/control_planets/hungarias_5pl_500tp_17_tp.in b/examples/symba_hungarias/swiftest/control_planets/hungarias_5pl_500tp_17_tp.in new file mode 100644 index 000000000..573541ac9 --- /dev/null +++ b/examples/symba_hungarias/swiftest/control_planets/hungarias_5pl_500tp_17_tp.in @@ -0,0 +1 @@ +0 diff --git a/examples/symba_hungarias/swiftest/control_tp/hungarias_5pl_500tp_17_param.in b/examples/symba_hungarias/swiftest/control_tp/hungarias_5pl_500tp_17_param.in new file mode 100644 index 000000000..ba1fb3c2b --- /dev/null +++ b/examples/symba_hungarias/swiftest/control_tp/hungarias_5pl_500tp_17_param.in @@ -0,0 +1,38 @@ +! VERSION Swiftest parameter input +T0 0.0 +TSTOP 200000000.0 +DT 0.005 +ISTEP_OUT 200000 +ISTEP_DUMP 200000 +OUT_FORM XVEL +OUT_TYPE NETCDF_DOUBLE +OUT_STAT REPLACE +IN_TYPE ASCII +PL_IN hungarias_5pl_500tp_17_pl.in +TP_IN hungarias_5pl_500tp_17_tp.in +CB_IN hungarias_5pl_500tp_17_sun_MsunAUYR.in +BIN_OUT hungarias_5pl_500tp_17_out.nc +CHK_QMIN -1.0 +CHK_RMIN -1.0 +CHK_RMAX 1000.0 +CHK_EJECT 1000.0 +CHK_QMIN_COORD HELIO +CHK_QMIN_RANGE -1.0 -1.0 +MU2KG 1.988409870698051e+30 +TU2S 31557600.0 +DU2M 149597870700.0 +IN_FORM EL +EXTRA_FORCE NO +PARTICLE_OUT hungarias_5pl_500tp_17_particle.dat +BIG_DISCARD NO +CHK_CLOSE YES +RHILL_PRESENT YES +FRAGMENTATION NO +ROTATION YES +TIDES NO +ENERGY YES +GR YES +INTERACTION_LOOPS ADAPTIVE +ENCOUNTER_CHECK ADAPTIVE +ENERGY_OUT hungarias_5pl_500tp_17_energy.dat +GMTINY 3.646098141953443043e-08 diff --git a/examples/symba_hungarias/swiftest/control_tp/hungarias_5pl_500tp_17_pl.in b/examples/symba_hungarias/swiftest/control_tp/hungarias_5pl_500tp_17_pl.in new file mode 100644 index 000000000..cd9d16020 --- /dev/null +++ b/examples/symba_hungarias/swiftest/control_tp/hungarias_5pl_500tp_17_pl.in @@ -0,0 +1,49 @@ +8 +Mercury 6.553709809565314146e-06 0.0014751274117575772341 +1.6306381826061645943e-05 +0.38709894990924181846 0.20562369687869339052 7.0036069691825035832 +48.302897646473702764 29.190213908309409874 163.69992642152809026 +0.0 0.0 0.34599999999999997424 +3.5735549824428292985 -18.380047749494480457 34.361526740492798437 +Venus 9.6633133995815381836e-05 0.006759122875155079725 +4.0453784346544178454e-05 +0.7233300630551103838 0.006773384545514573099 3.394505355540899938 +76.62090440289564697 55.183156101464518883 271.2285045598760007 +0.0 0.0 0.4000000000000000222 +0.17650282045605921225 -3.6612475825356215592 8.702866268072763821 +Earth 0.000120026935827952456416 0.010044657392872289059 +4.25875607065040958e-05 +0.99999328599172943033 0.01668004783869252855 0.0027793940989077428085 +175.84932558359508903 287.2227751976308241 324.72725799674782365 +0.0 0.0 0.33069999999999999396 +4.827962479462605839 0.034731626640621778608 2301.2114260455621944 +Mars 1.2739802010675941808e-05 0.007246146587933918669 +2.265740805092889601e-05 +1.5236121180553410248 0.093387475645674775104 1.8479297186242829021 +49.490271729763087194 286.7387645553690163 252.78317601821959215 +0.0 0.0 0.3644000000000000017 +997.9376283354346323 -909.38573894978675416 1783.4600697011568969 +Jupiter 0.03769225108898567778 0.35525381666404283465 +0.00046732617030490929307 +5.203268729924161562 0.04848413524543258163 1.3035624911873560094 +100.51639734596980702 273.421918018626684 325.351028522703416 +0.0 0.0 0.27560000000000001164 +-80.967241888586720104 -2387.9998942634933492 5008.7344122962876782 +Saturn 0.01128589982009127331 0.43764770913411007376 +0.00038925687730393611812 +9.581513697274186114 0.05248801962394190196 2.4862838811768979141 +113.59546767797320399 335.45662431368151601 228.84653123700309152 +0.0 0.0 0.22000000000000000111 +441.9323685947327233 378.52918410105413535 5135.911248678291292 +Uranus 0.001723658947826773068 0.4699394560146697986 +0.00016953449859497231466 +19.24773626798451076 0.04408736292912442123 0.7704474968533898682 +74.09072726634606454 95.12631113857929677 237.66915583105441101 +0.0 0.0 0.23000000000000000999 +-677.3000258209181323 -3008.109907190578637 -836.301326618569835 +Neptune 0.0020336100526728302882 0.7816500366521773358 +0.000164587904124493665 +30.297815841143489024 0.013873050398302080172 1.7688477929856469828 +131.74107055888509876 246.83916166351488641 334.07963351871291025 +0.0 0.0 0.23000000000000000999 +1231.0256802954641403 -2178.2009371051150557 2329.6179923847095223 diff --git a/examples/symba_hungarias/swiftest/control_tp/hungarias_5pl_500tp_17_sun_MsunAUYR.in b/examples/symba_hungarias/swiftest/control_tp/hungarias_5pl_500tp_17_sun_MsunAUYR.in new file mode 100644 index 000000000..b2cb85c35 --- /dev/null +++ b/examples/symba_hungarias/swiftest/control_tp/hungarias_5pl_500tp_17_sun_MsunAUYR.in @@ -0,0 +1,7 @@ +Sun +39.476926408897626 +0.004650467260962157 +4.7535806948127355e-12 +-2.2473967953572827e-18 +0.0 0.0 0.07 +11.209306302144773 -38.759372036774764 82.25088158389266 diff --git a/examples/symba_hungarias/swiftest/control_tp/hungarias_5pl_500tp_17_tp.in b/examples/symba_hungarias/swiftest/control_tp/hungarias_5pl_500tp_17_tp.in new file mode 100644 index 000000000..f4ba244e1 --- /dev/null +++ b/examples/symba_hungarias/swiftest/control_tp/hungarias_5pl_500tp_17_tp.in @@ -0,0 +1,1501 @@ +500 +TestParticle +1.8454769027014339411 0.13951119042459186881 25.837798047275626345 +328.17117785206306735 237.2860880034895672 64.23008023926446697 +TestParticle +1.8948047399930760815 0.39253684339890981825 30.57401904357708844 +171.8160167926455415 74.67067835186652758 346.82539114732162489 +TestParticle +1.4322956873029448754 0.26682998123758877584 36.888797433998760766 +135.67836179139501951 49.89780708941236753 50.12940813296061293 +TestParticle +1.5422738860284694873 0.37685139101297421282 19.245291067203744717 +242.6056203622448777 190.34039186776647057 265.5775848896740854 +TestParticle +1.4000225346968613316 0.29255853399659431657 19.890767084525684538 +119.10518346196536754 348.49038108835299 47.293501598324468205 +TestParticle +1.456396703278512561 0.21606816556140612251 29.008692147879436618 +108.30731953608933793 221.35606614343436149 135.6522448644592771 +TestParticle +1.4991966146428574724 0.2669401594934397437 30.077755049056197123 +191.15663442447419129 222.38194219090249248 69.087779756302211354 +TestParticle +1.2976220185588704936 0.2964166811906516763 17.074990789432430205 +304.33208099940674174 258.6470139846816778 322.57928297363247339 +TestParticle +1.2284058459883253622 0.02114032275754222992 21.48034199376179032 +253.91897753388707315 121.66008318006832667 48.90451689677965419 +TestParticle +1.3491703154567693534 0.12631152383406446527 12.08570156851411781 +94.79536576066179521 143.49729046755351192 208.82266091055907964 +TestParticle +1.354548306636307764 0.30813073753578051894 26.385704559503864175 +9.340695923175923454 140.9062990975310754 128.60525944669927867 +TestParticle +1.4726763914941964906 0.051608113984077212677 23.16805302210511286 +60.87571895315940651 37.85205814142705094 334.24673224972650587 +TestParticle +1.5463324166991267994 0.049680078831149866725 2.1376306166210978787 +220.16008032774595904 11.76294270807032305 189.70726088424217437 +TestParticle +1.8424848789863070841 0.22250945291262835823 31.15994606422547264 +200.26190393952850854 90.472365503047569746 91.504582635979360816 +TestParticle +1.3344201535197020014 0.22773738327276721316 26.57752464191161934 +153.96142537752339763 186.86606427694519539 35.556703962561442722 +TestParticle +1.9184874234026485507 0.023481756935774280443 35.397883111232822273 +271.86866710708176242 55.05965672749781703 149.58202579969920976 +TestParticle +1.5321856218987717213 0.3979302949006976453 2.3033304058957959626 +1.0080751214383187886 229.5039187263292888 149.08850733126683963 +TestParticle +1.8579680598185155382 0.22191671822921349433 4.132202808256058013 +84.407322217061448555 105.02111083305797479 146.60404199861849861 +TestParticle +1.8191335218869923995 0.081164276322499742666 2.5841250683973493452 +159.5912052269758874 90.717444711181698835 52.736155424681527393 +TestParticle +1.3667350901122115037 0.040168371245059432406 21.275121073210776501 +354.85336821525999085 78.43154031841972085 317.9997578721723812 +TestParticle +1.211310325452651826 0.22495050228658303171 6.171244471860548586 +261.19666701924728613 72.22571277624209074 188.79752520382470493 +TestParticle +1.5325985395295633751 0.31279786859050073833 20.80765006283890628 +318.17303457104600284 237.18051290105893258 171.10337432510698363 +TestParticle +1.8680074840187885776 0.2359667145186353232 3.4681761306941005785 +200.43760942249792834 358.90361110235892284 209.24526446322295214 +TestParticle +1.8902919155434694254 0.083578216274719355217 21.112558775866592242 +196.8514015184809125 347.4309841941474133 73.29619835953663198 +TestParticle +1.3627905330289311614 0.099888583939379896326 10.927033380075510394 +304.94152566655765213 199.55238917120914266 66.700355986912740036 +TestParticle +1.6040569601728904559 0.0037929451167165065088 35.906866500389931218 +99.48570161019421221 264.107310263435636 196.91578900528253371 +TestParticle +1.5861188083181421149 0.12827049258664038889 4.433072269138715882 +250.35776905499878353 45.94314631274010452 78.766936071707490896 +TestParticle +1.8085832921727800215 0.38738844761580382148 38.482814871600758977 +59.61087191956130482 302.66582104517908647 337.43444136948141931 +TestParticle +1.4784945066780474932 0.02330664972959981679 24.805661482861435019 +161.3343149737517308 260.74004269183234328 332.58410511792851594 +TestParticle +1.2147867771614853094 0.16512447645289687892 26.704102750300808822 +342.71215159236965064 303.68316149292064665 267.30686157877283904 +TestParticle +1.2201597354758311198 0.29779565538112623413 9.5137682254248456815 +191.53033272117548336 279.0125127827463416 212.78518850631689929 +TestParticle +1.6306412809893466864 0.17831015307074157827 3.1250419675817919796 +35.17124037365346112 108.44038602029890228 289.87991262900078482 +TestParticle +1.2151606182820764435 0.030818630012030868992 15.255139624036321067 +18.872922094318155928 231.7787216922804987 114.00766773514217789 +TestParticle +1.263893046608108861 0.2365742775318666613 11.945519016269416923 +42.860493283933593034 103.96603523733477914 283.38829024952065083 +TestParticle +1.6208609899851271763 0.084237547629803233296 12.70952077968544458 +283.22127471251508268 16.774057774443846824 300.16022765529646676 +TestParticle +1.369439844040318377 0.02479558882423171795 12.8318676295292597445 +301.63112212878189666 317.34595898371384237 30.617048625074787083 +TestParticle +1.5997694540834734855 0.09458558350377295476 19.448014834633401193 +12.1917196597836952066 3.3679767469261356894 154.78568082871979072 +TestParticle +1.7665402755717471983 0.30325026057285930925 27.633560559304825688 +101.32565005973741279 173.42784439679959974 37.232060344515574002 +TestParticle +1.9955375108845494481 0.36780600821797326816 31.984293078717442427 +282.80116122029363623 340.83055441100248117 39.611552110590793063 +TestParticle +1.8068990906750328485 0.21026617244057629885 1.0616116239923245601 +148.12562556977400163 298.30253571723386585 39.94475612648128049 +TestParticle +1.6630081107132843599 0.2735942970781838346 20.393789507385111648 +186.34515293922132173 65.17268953054855274 249.5770342523899501 +TestParticle +1.7985429554004617181 0.32088199656574384333 3.421215620948947489 +16.760921442599428843 74.095210179753522084 131.64141600391005227 +TestParticle +1.4370805125444752193 0.33325879590334600566 29.297209939601689399 +179.87886700027897291 9.64820682838999133 185.83130754139918395 +TestParticle +1.4655739620290153535 0.017666725980597774298 15.194095015809558902 +272.98954032167330297 58.084307572382229523 205.40990717491945361 +TestParticle +1.8476543863511110111 0.38915614646375812358 11.917542586934226634 +134.42337723208845546 335.9708646376130332 1.2971084841705504687 +TestParticle +1.4590877868615714785 0.00229625206779173743 3.1321552894228821273 +234.02046406252858901 255.12979045887780671 16.475368403924544936 +TestParticle +1.3888300055647480047 0.04773585409741545882 20.980957411518524225 +232.75615771007392141 269.83840631297238133 128.91250646333895702 +TestParticle +1.9931456375147125204 0.36812801925517474322 8.575906190939374341 +75.54998759463583724 336.19060016425089543 128.81172294803698719 +TestParticle +1.8774492133690419138 0.3438244675687084917 23.038981078440741612 +9.8914055387747712444 56.58764160659445963 274.986529163730836 +TestParticle +1.3204375538736723428 0.08737144541036796774 29.974540925371840672 +221.62895491427303796 180.74872085610940076 337.40135640751742585 +TestParticle +1.7927656300808507694 0.117314349174642992835 19.184850306121404628 +206.67799209022632567 27.751086824061687253 298.02149638567931333 +TestParticle +1.7770751091671890265 0.19250351376309945972 9.172954305563960631 +43.26806500508915576 40.25028641050728595 238.70170337404292127 +TestParticle +1.974616589119178478 0.34407442172588997842 9.802858566374489158 +297.25364573770326615 87.77531802870282718 75.66951173963438748 +TestParticle +1.3863166307158814039 0.076685155941225657816 27.402627668756696977 +65.08259549484182571 164.8638775674021133 100.45589134667613962 +TestParticle +1.865440866859517488 0.1196471086364425257 11.945324988836505398 +268.187594819792821 223.64720186520361267 29.40940210460087556 +TestParticle +1.924611171111724417 0.20112445232693854091 27.71898676703103348 +318.34445645026778493 191.25112555799532288 349.89422766228875616 +TestParticle +1.5993892099645203864 0.10968442780595713537 9.326690310948993812 +31.533935713187357663 310.02898225335894722 210.51997485541662058 +TestParticle +1.2359382488484538243 0.32658357473851062913 38.707976308555153366 +144.00217869231852319 119.06805794770258444 79.384200277529473055 +TestParticle +1.6109049166063780234 0.038297945827820673026 19.543826335927839466 +187.13697315293387646 257.17832502585736165 137.87766714187893058 +TestParticle +1.4314628393318562516 0.06605107757031168647 34.48524969280026653 +261.32336202719972107 132.91845049023550018 38.845354985336733478 +TestParticle +1.6270574875899108669 0.34703206127568098083 15.7198484814636287865 +347.55110983950402215 301.80674145531685326 112.25474179150697296 +TestParticle +1.2336395323546296421 0.09729394203067305569 5.1016432554912771735 +233.12366663108903708 146.38256752560837981 198.90738568911748985 +TestParticle +1.3456767380773657639 0.0037474665741684012703 39.938234490697439583 +256.57759604724572 75.054619437472723575 358.3650510442133168 +TestParticle +1.5755427111046413913 0.26176654357687628716 8.3705428253832359076 +37.517264866504824283 65.328654571322900324 91.55626866074713632 +TestParticle +1.6755570822166401257 0.13402717291758836637 24.063895956419415256 +13.799270685071709508 72.62055343894668624 87.31894896673983908 +TestParticle +1.5559490988866435668 0.15176826381840774483 38.48111346610262018 +256.2333379875098558 75.97800331031197629 59.41813313856062706 +TestParticle +1.44994652075586683 0.33986546456988747655 24.751134550954795088 +232.18945993885864709 196.68218102285592863 134.45246030705607154 +TestParticle +1.8429185809905443971 0.017095748280579449452 37.139787427802218645 +161.43471520401584485 307.27501647662722917 355.50902004252696997 +TestParticle +1.8754638534803846905 0.012020551314167439438 25.689663713162978809 +190.79044364156195002 199.61943428385487209 354.13757823278496062 +TestParticle +1.6785085343609076336 0.092751885821403062815 9.210612929641403213 +285.5852225501039925 151.86743084166838003 284.55869958326974256 +TestParticle +1.6543220378661067649 0.21134650270613800083 33.840207882222927083 +304.1335703446064258 326.82908020011677763 324.19035648687139428 +TestParticle +1.532142838634183768 0.38007507167758092237 0.41347334753230935434 +67.05133558163640828 34.399290053628249098 34.840294234675972973 +TestParticle +1.5607062121608026306 0.33781855969656376937 8.967843423326943508 +299.3643723824862377 200.63715648972143413 68.959909224159687824 +TestParticle +1.4493452438508076519 0.0685471748773834183 8.6320194163908645635 +72.080624314054560386 115.122237950328312195 0.4079154529894424286 +TestParticle +1.6460340581063395149 0.39668168452346741493 20.981074587513283802 +204.3451792276263177 201.37614636656564926 213.30860176845612841 +TestParticle +1.5920263567710581931 0.25848484530126630832 37.015946260712674132 +127.874562568991194667 65.19741011690945243 94.70447850395582634 +TestParticle +1.7336512363309442009 0.07029270812373322741 2.7619103909209741232 +186.8230602145383159 227.39378660430725176 98.630627655617857386 +TestParticle +1.2180382444813300236 0.3142235003505371993 28.081856084101627147 +111.345098722858793394 55.920002664921518942 282.87486367297071865 +TestParticle +1.6485319714902004762 0.3152277024193525512 9.613333711481617527 +294.21829832085342105 286.30105207001298595 128.67843292368630159 +TestParticle +1.4661249318513216444 0.05768902442216044396 0.40134055259916312508 +131.60830524837382427 243.75402215940340511 207.34266824752899083 +TestParticle +1.9808876352137643195 0.14308188258148502037 1.4378912336896432222 +80.646845170624999355 231.53252144735679963 232.24754717746816368 +TestParticle +1.2317104124445219515 0.2601604050852836525 0.45344055155487783537 +196.60019387641727917 281.28440095008312483 247.80040663000707468 +TestParticle +1.9766606334273690848 0.34561610666945052905 23.435434834980789276 +34.473035596172188377 271.1594424183512615 48.466138898201464258 +TestParticle +1.902283887520531902 0.11209856668107276434 36.03239655947709963 +294.40684092368923075 270.02199923071918874 114.382104661423511516 +TestParticle +1.6492323095244016962 0.15893979864294510707 37.659784271934086064 +104.66474319501168111 339.31942052690538958 216.02473301930888283 +TestParticle +1.3484148267391067311 0.21111072648635398341 10.89667366492733791 +291.56591682201212734 76.70162083026228572 312.33817224861377326 +TestParticle +1.4294351818194139803 0.088023727454350997323 39.975651469559892348 +198.68831704157523177 24.599669214308292453 112.67218982565516683 +TestParticle +1.7462490440076519072 0.37071438804152889723 21.870120107958371136 +306.73669065023256053 227.86908802150850306 221.53115484665687518 +TestParticle +1.2326287663421375829 0.38251042858385364553 15.802748366587309192 +199.40278420565533679 149.69869717845381274 315.67560896416114247 +TestParticle +1.8450862453370659999 0.35823810152470403345 0.24296995062495163609 +231.11355647090658749 268.36408970924156847 247.20131497380242536 +TestParticle +1.3463306194321635889 0.054152156717265725883 19.291673537548810202 +161.87111271376406307 110.46662751206984865 211.17562619004070257 +TestParticle +1.7304729990392044847 0.0060363382745066036794 4.5425988088905189244 +83.83165898233737323 161.12905358043980186 286.6647995328502816 +TestParticle +1.272415258736352639 0.34812105948963872892 35.045494396081245725 +14.574000729875393745 353.3713665259786012 131.5433867402096837 +TestParticle +1.6439273487752854574 0.36545065070539850538 6.353634441759323792 +208.14453818563018217 10.813063425795590433 206.06730287545840952 +TestParticle +1.6763079933342956984 0.094138501830316120844 9.085159707293687603 +80.58871476637817466 314.0368013316636393 100.690960685859835166 +TestParticle +1.4877140448295171904 0.16166761889883485281 34.241465691047999087 +79.8410863542756033 83.93580251433438377 326.42504725591442138 +TestParticle +1.2162284372972316238 0.0041396912261435492297 18.10971019209766908 +119.24015567046335207 329.67281909144981 104.828869567280364095 +TestParticle +1.8047735542382463692 0.33749016396948239294 0.52972364011479644574 +178.94392698813351217 299.23756071934496958 162.62104380151879468 +TestParticle +1.5839648306862472715 0.10066137160625268643 33.26828317225646714 +263.27920251880794922 68.67162164080139064 57.290691877799474696 +TestParticle +1.782207613297600135 0.28298109588186182162 35.127393670730072017 +210.15608294480230711 329.15212439443854464 156.34171670624388639 +TestParticle +1.3155167265331972892 0.3723026355627080397 31.9899066241260428 +91.31036979040656831 223.20537501312867334 55.827047719351739374 +TestParticle +1.5449962589928503132 0.042895131418722920458 19.621615335811604552 +53.274917868286941314 105.38186162729587636 323.020751462690896 +TestParticle +1.5754411317280814231 0.34816180369684263107 4.7678217298113434452 +120.95128002085144203 157.00930158977180895 240.29746717057042815 +TestParticle +1.5907469291141598244 0.1964357827791012312 32.411571541856559975 +170.61499094134663324 242.1650203501031342 17.501615221478704854 +TestParticle +1.830089894183755117 0.1183426089423230132 39.644525581214999477 +294.65378437812546508 109.07115594302160844 324.16241183209581322 +TestParticle +1.4367780052388956502 0.36401192064177911867 30.631206179017613778 +68.80265368578432117 273.93063220366155974 24.29554655983004352 +TestParticle +1.2142291174104986595 0.26599477562223389215 38.323418486729934784 +308.15266716976327643 181.95454939706644382 25.317934141736472498 +TestParticle +1.3097560558867786806 0.27086655670790987793 26.727111485760552512 +202.01817831967753136 111.97198753257944759 220.9572217341067244 +TestParticle +1.7068002319397266309 0.13225077417056724238 27.615823462695185952 +285.91192474987235528 163.31636137404424858 93.38394269951035653 +TestParticle +1.2055264990732839081 0.30786309414395046646 1.0578708063967390274 +10.359167032075170312 91.437369236993205845 199.49137469503560283 +TestParticle +1.507944679481377559 0.24354603379899894544 13.546984987329334871 +57.02677054315793015 348.2783664994595938 271.03255123935065285 +TestParticle +1.2000480949162781741 0.37393642722973008397 23.203234027939288353 +10.544426197782676979 54.256441116884829512 254.63780531903708493 +TestParticle +1.7449420987438828412 0.24948442565304040919 27.500692921539069857 +95.99564887831238025 273.51317842100650068 326.03984845413532412 +TestParticle +1.3765488182504534986 0.030416876982825514358 31.70464034258963082 +275.78595003182448409 133.87458225546748736 226.00553898246667472 +TestParticle +1.2429016633522536051 0.20958324622273286075 37.67591956683881449 +291.1872246516109044 179.51252843010638571 313.71221570905379394 +TestParticle +1.350836711566139936 0.37146863516149991602 10.648022816293165604 +303.44796444885918163 189.14789607745939293 51.43707686446851568 +TestParticle +1.3606071504125110128 0.33726059408562408803 29.623948782469774699 +174.22516541583135563 294.25596249059782394 95.41136217835122579 +TestParticle +1.2613426667283003102 0.28493782233230641188 2.8418286626483357793 +28.660785941482401995 87.50329638280636857 62.24419865756345871 +TestParticle +1.7174163570319429528 0.3032422501079781174 15.67069716211129915 +199.70972264612359481 32.767912430781642286 213.64123907162533555 +TestParticle +1.7458843970753306074 0.11283265730661723447 31.014841487303186796 +100.348702433335944306 70.42890181497725166 181.6379350423849246 +TestParticle +1.5856984450767472872 0.12800000166780992061 31.429108868252029652 +51.353858554652823898 23.612627758947475343 267.08391560632128403 +TestParticle +1.7153544980924069208 0.009492334383937130193 23.973160269033186864 +225.8121095708202688 166.53019043018878165 111.264606624241494615 +TestParticle +1.5026214783945404108 0.0060590469509819834884 26.922409196875427995 +295.19858318066900438 267.2316600455114326 164.01625566186100968 +TestParticle +1.9160661225785111661 0.2687972938601586037 36.621056515844763624 +334.838998311582543 64.064850181025448705 189.01682882741042135 +TestParticle +1.2176400162982947695 0.34785736514134202313 33.268864900617138858 +225.50438622677125977 227.27950095352301219 349.3797741235012495 +TestParticle +1.2273892818311689101 0.2816869543044054902 29.30501713210593806 +5.1819190308878404494 2.980732803128396391 210.95489861072306326 +TestParticle +1.3751089556704734207 0.2405885452138842584 36.06217993351511808 +199.72275209903938276 20.656954375719962513 63.697518910616103938 +TestParticle +1.5607369467841181176 0.07255978851264624496 7.9579329131271947517 +171.37467949380453547 212.58991825508687157 339.50383959100975062 +TestParticle +1.9532502979079398031 0.32689490765476852951 28.253212569212344363 +181.63986801834479934 358.1359989621613522 109.388744074059957256 +TestParticle +1.6386262719092012929 0.3843259001434648492 30.427684580834899464 +231.68744967547161195 57.857403700081057707 50.909305856223930675 +TestParticle +1.9782962700915884824 0.107957633562424437645 12.967168829872832703 +304.82496750248236594 137.36222813798312359 43.932431234771847528 +TestParticle +1.456906303967715921 0.14977091087281488302 11.183659205458482688 +73.40451433078203536 248.31190118288742497 75.220198402857562314 +TestParticle +1.2534896538060293913 0.32164641810767541363 3.6905727779895203255 +113.638768774667383354 40.160334282501267467 312.87037322501493009 +TestParticle +1.3014118589240171175 0.2335136721159586648 25.377666434917763638 +52.35427893272325406 9.000303326532378634 144.16353907228875642 +TestParticle +1.349118336295686893 0.043025081648941171375 4.3612305774961734883 +243.8860202407295219 2.8265136490351139287 103.60819968189791496 +TestParticle +1.3275933491849711832 0.30130671835155509175 9.869222679372882112 +140.91605869565009357 6.9406462242691979725 239.80228459696834875 +TestParticle +1.6818942627306852078 0.31620420657586079116 20.559233470145720446 +58.349404997197098055 117.22724335851061994 205.33268031856118796 +TestParticle +1.9852083696659352796 0.013418902816453127241 34.384158548277603984 +115.09964166928982365 93.38072290721305535 50.024657651717582496 +TestParticle +1.5693995761001753309 0.16001215059117473993 34.5933607052273544 +148.74442398288778122 35.382707682911650693 307.9784638941427488 +TestParticle +1.5266059802597138351 0.017927011927562432753 36.548915878020643788 +210.40292925773331945 201.71103729618005218 224.16233740901310512 +TestParticle +1.728092867591788595 0.17808919848065529745 20.998516569906101381 +308.92264952207932538 127.645229747456198766 161.89916144859373048 +TestParticle +1.6194915162303571421 0.12309065176675240694 11.294533006684988052 +54.678975810373955824 126.54242973288489793 198.90789595722705485 +TestParticle +1.3289490961949892434 0.29324085207912647943 30.6374181063208475 +269.87631534747202977 37.841881250480767562 348.01538484590025746 +TestParticle +1.992893537374311741 0.18673594337410803767 16.540817363482574365 +17.388276030638827763 78.86833627776049127 145.80382488854473877 +TestParticle +1.222299452110788831 0.30906300615816389987 12.345442063899700003 +306.8123712805751211 180.92912639536746155 259.40768755027107773 +TestParticle +1.4975645450575401085 0.33347394063389190766 1.5908406722909917974 +21.190900575813813589 29.47013297848204516 102.16591862721205075 +TestParticle +1.7529928369432026258 0.37348208125904397425 34.962456206016206295 +93.100816365900570304 51.110432866675402863 102.57164314281175166 +TestParticle +1.2425425262626379475 0.33615312037358630048 13.5646379554957707825 +178.52596605015196474 153.15866826328647221 144.53495382113527512 +TestParticle +1.6649955177303406018 0.2774227948724269921 0.19107601744351665474 +63.095836643914225306 354.85824120341573007 264.91047609564412824 +TestParticle +1.6484772171416994802 0.30267580759790019274 20.681865450161470932 +178.44791810461956061 236.1847171609527436 98.36374690667254583 +TestParticle +1.9932276245336744136 0.28313215139520719887 18.707112367987669188 +219.87647284127007197 126.12068590426943615 215.87266615210091913 +TestParticle +1.7032561164628601258 0.16397636271323282053 25.251751880173408438 +216.40546882883455737 157.48365299675131723 4.688955472432070337 +TestParticle +1.6688736346909214259 0.20206175633607201259 6.8253656041650678787 +216.49653061411731869 167.29352654167502124 264.9681676707442648 +TestParticle +1.8685421164356719181 0.017115665378235479788 37.702745220955684147 +341.22511657108503869 114.98911860271485352 180.97443389686239357 +TestParticle +1.2789089584183417347 0.38311485210375972876 34.310997435004189526 +320.3337196375490521 323.3381621809996318 259.21085923985185673 +TestParticle +1.6140662295704462093 0.22523087980360034788 31.289184028405010451 +342.24508460858135095 15.680010847649224814 231.38490121660879595 +TestParticle +1.9392715602121850527 0.15801671085680726869 28.474643946647489656 +130.88611486656463967 107.8187080577375383 123.51635573428578141 +TestParticle +1.2967745250719693306 0.06567169524305174755 33.95229338812422526 +290.63873117229752552 79.02208966627722475 232.82648238779003691 +TestParticle +1.5129927102068225775 0.035355940722157398748 39.88868697475624714 +192.95122284146495417 161.94702337269632153 136.8613631323482025 +TestParticle +1.6829217923833816872 0.25345881856811941502 11.3639096364677563145 +97.75123136727515316 45.772970150424697522 122.47944569483230737 +TestParticle +1.8496796135868087685 0.13179006688881342302 13.3337440463942780156 +265.13170996725159512 228.43295285296423458 86.46213418755671398 +TestParticle +1.3358066112403499393 0.14376027444378572384 39.375717961581145232 +157.40058260425848857 311.2848447975355839 331.54934076273463006 +TestParticle +1.4724981157763801232 0.09732120033570890172 28.321058818578286775 +59.894734856092107123 278.76518901350408441 80.89976806352470362 +TestParticle +1.2021644761475605012 0.31023967350442599455 28.526439154406524779 +141.17072146741031702 348.00301966689602295 345.1342457342993839 +TestParticle +1.5593994326172748721 0.1667781483451987734 33.654370780663562357 +266.88153921797828616 15.430552831803581171 331.4077165346525362 +TestParticle +1.2450357937715832435 0.028817230992748132934 35.27994061369459189 +170.88739535567884786 353.3811233168729018 235.24134924372253863 +TestParticle +1.9317961733915889333 0.3664316651845210826 24.216703033341396178 +53.371442738369651693 125.538665606108594375 100.18756180685251422 +TestParticle +1.6396980067944455506 0.35320738196817447196 38.908475459351436143 +246.96073709218802605 107.071264330560637745 337.8304256083255268 +TestParticle +1.7122870680368271756 0.33138468975426782492 22.34571124430782163 +41.625350595521808827 260.11274001626304653 319.5586433718779631 +TestParticle +1.7758391618474895779 0.055654577054355419685 14.384020683089943304 +218.7045008460380302 129.23569045343450057 314.73455478475153768 +TestParticle +1.8362854949156799389 0.17009562329070515574 9.220110348963054037 +5.6249185474454588274 94.48961934631255133 267.2078794777070243 +TestParticle +1.7334953226477165522 0.049544865778679184065 1.209613515173937337 +190.91534544660109418 64.56511824447872527 53.933623678817561142 +TestParticle +1.2066506827151026737 0.27307016461379868266 16.286012208431877468 +210.72290400454269843 4.9513407455376867716 217.19883427837939394 +TestParticle +1.9341836813541077866 0.31275777164344914505 21.744449246528134267 +16.671280260299788267 359.76195227232665275 224.80650775703034583 +TestParticle +1.2301271999661356205 0.031548406830605689455 39.849035058731047343 +90.34650036320888944 228.990784368342986 250.85529561169511226 +TestParticle +1.3410010761068889007 0.095083624572690483845 16.924908171363043152 +283.45379909314135602 86.752474366828209895 159.59709647132103782 +TestParticle +1.7698211243948773763 0.31273331984328978095 32.406541703763409146 +142.47083941877434654 108.934565017581746815 272.0311071315450704 +TestParticle +1.2184663095396561783 0.03812658809257066239 19.774618927626171683 +209.47233898474567582 217.91859195187419118 328.76297389338390076 +TestParticle +1.7206223471221142596 0.34602085721486458558 1.7719525390753965155 +165.06371680688690162 58.713339280074663407 131.55475352151159996 +TestParticle +1.3109621100006574324 0.1200549161067526599 35.241813901823853428 +280.10060451829298245 304.5154307276658301 258.67615548166588724 +TestParticle +1.890762195590066419 0.37035990280942132635 39.30878687557294171 +331.52556729751103148 337.10887406621617401 291.2002557551665518 +TestParticle +1.9459727148429868393 0.38159291851530796613 17.491010561827589953 +58.69944071533900143 205.64445683266583842 15.007877403052006571 +TestParticle +1.932411276121311472 0.04777930483056436195 25.073992516822389831 +121.57030712562516328 70.74439140769348455 289.9542940845957446 +TestParticle +1.5709963526669437073 0.10007382494413469276 31.19225199749002897 +25.663181434794644531 158.74882487098793149 349.24010777437848674 +TestParticle +1.335652850395929736 0.2682557203404010715 35.328293558121892204 +297.5826541744638689 60.254502441132032686 46.73892963602791184 +TestParticle +1.2957464098764572835 0.3440291712383192757 7.1735736922541004645 +59.24135447472242788 112.00172550339377153 63.553063734303997023 +TestParticle +1.3376569963037119315 0.3060189431378071423 33.029029350979975277 +152.73585490781837848 358.84231030107730476 37.635854669405638617 +TestParticle +1.771988403745682561 0.3418762364008507415 23.489318587551395012 +127.772934823946343386 203.78581662446330824 143.76143168311298837 +TestParticle +1.5956560402916708519 0.10759642083325884898 23.037334274387120558 +89.123439540602518605 335.80537435903943333 224.2944293252393777 +TestParticle +1.2213248137275627414 0.33273129495412528955 31.736197966218284705 +5.8113766822153190006 136.8878783815157476 64.522354495354704795 +TestParticle +1.5939091087487726739 0.18821654046060146137 30.731370977849337578 +266.58533763467028166 61.609425727717933796 18.235581197999763958 +TestParticle +1.7396585716134431721 0.33855494953671660951 29.449893101775622029 +180.02468739427200717 242.14518561194594781 286.10286226317128921 +TestParticle +1.282393302513987976 0.18117160916878405352 22.308223599873976184 +94.69043575838269078 120.90458523599184559 161.88428102391287666 +TestParticle +1.6814135190699217581 0.06566827687818244108 23.327233678731047917 +13.505074850212492876 48.75637107914376145 337.4546628636448986 +TestParticle +1.7657157709814490509 0.1428403447023711692 17.528150255810068359 +344.59038571613109525 139.36370104693307326 48.933862071120714177 +TestParticle +1.6903656227398606848 0.1881104051902828811 4.8333955434429443088 +225.1651227652955356 185.18882646555431393 132.21080070182574673 +TestParticle +1.994803202974419154 0.07010640681945860819 10.335500705227271823 +49.13850067137512667 6.4534592639328725028 80.823883651112907955 +TestParticle +1.3332640591247215678 0.06033190012542344327 21.035357456357957062 +97.733488288704805314 80.36567051536489714 46.55202086502264791 +TestParticle +1.6243595893431250765 0.19184864274731788791 3.8955991274805690239 +177.92659068814418788 143.40326100313114921 22.678654943892524898 +TestParticle +1.6823664970435372457 0.2224783311899178051 28.355960754425314718 +38.26291967170601538 109.90023925961423856 198.84047030132839495 +TestParticle +1.7191941261517613704 0.33174274738319786682 12.850948299491872007 +119.00419547116645447 97.60779700546201809 294.77008528831782996 +TestParticle +1.8572892923802768461 0.35111820477995814294 13.9604529367616514435 +90.00276864094306006 148.95323888923235245 105.97452396122218943 +TestParticle +1.3153721536816338489 0.19649899863576869574 15.0714118102473335625 +114.91054594701827796 42.412124805715073705 238.87013655434262205 +TestParticle +1.2329176043622995795 0.016982564457388795581 30.243701002322488591 +82.65191789811144929 330.6979385476704465 45.054558348890076047 +TestParticle +1.5821710473264454233 0.3143035815568485103 26.914241767154372553 +284.2538985550680195 218.88177874336824402 323.40347760377426312 +TestParticle +1.9040784761593252394 0.24428308876647972236 7.2140984856285061966 +36.905471182196343705 235.01221091601564694 318.38458893259758042 +TestParticle +1.65303582473123023 0.15480622128373774937 30.612597160930445028 +176.14307295689886246 344.8917806440758227 46.391668294041863874 +TestParticle +1.9906869462994456477 0.08417977136701382257 32.071163809129458855 +190.08888099464044785 12.337459747731131188 44.2017470332212028 +TestParticle +1.8765384210009301569 0.18365454827241262103 21.70846970886060845 +357.147106806575664 129.14807435709019501 12.280707552849744246 +TestParticle +1.4155101547192867617 0.04021447505437234643 9.344979114904226947 +15.0079117011066429654 104.10136849327774655 23.129488238006107537 +TestParticle +1.8212138878170127665 0.08047272581333581032 4.0968495722748254906 +174.58882187338159042 279.87646692565357398 23.324854698976157152 +TestParticle +1.7644240552946159895 0.028115303133601266677 37.495056810553286653 +118.13225365926875554 167.45393279647143459 34.012411764895496447 +TestParticle +1.4525677350618968475 0.30250405555180709394 17.82996354610970613 +220.00796720803919015 344.15563445760545846 123.14676507835467589 +TestParticle +1.548841766197246228 0.09540860671062662002 22.684926251185043355 +218.60911597389889494 90.33458573673138403 102.992143880334552364 +TestParticle +1.2079296534119159379 0.32769989355099571338 38.675927266126485904 +200.13361220962531206 158.78840734969233495 279.3835775172844933 +TestParticle +1.377134208847530239 0.24021816899861267447 9.0547885117482262984 +307.8373588937357681 250.70142057430294358 309.94009295835280682 +TestParticle +1.9686740753046718666 0.039229853667286734842 27.8754113045622951 +44.123357114694904624 256.01312835054108064 261.81824327677321662 +TestParticle +1.5814217806739057082 0.17335298748077404563 11.896107065940920933 +11.863952502714919746 24.317879056812333971 281.83737446678952665 +TestParticle +1.3875566874932281358 0.04186652452005912295 8.374003796839994962 +110.23215119957482955 294.56036703267886878 295.56595853737684365 +TestParticle +1.3902402383167473676 0.19593968424019078678 29.315181048510574158 +282.62385234829253022 324.77635841333739108 19.922520312932118003 +TestParticle +1.2840096543928043449 0.29990999639214999117 38.008971094948456937 +277.38971452757238012 208.06148201248271334 255.09629766073103951 +TestParticle +1.5591506829846155657 0.37436941724804151388 28.992037551395654305 +349.16296285001351407 325.2167596752620966 272.84514086043867565 +TestParticle +1.6470838643939573753 0.08288833139777805614 14.577369178129217175 +285.2260666698484215 331.09186078156602662 265.88764593799055547 +TestParticle +1.4078732644616405167 0.12168143435803764618 12.108634490395427719 +108.46688890223232704 161.29947110408681965 275.03585750375651742 +TestParticle +1.3806299194725459856 0.004926651150672434372 4.619034071475587311 +124.92525284958901466 247.86360149925218366 213.62866269117026263 +TestParticle +1.3192455632849615643 0.2895763215200138352 26.694213488950907731 +156.54596065699396945 129.81140517153278324 134.60446380394492394 +TestParticle +1.4439912056109245331 0.3898931766577775071 8.96508289894697441 +244.87528934455733065 193.64710431202621521 293.37512055758975293 +TestParticle +1.8635206283775769265 0.2795056553246003106 32.898054005194971694 +137.04912054787823195 287.93791057659291255 10.142083183616289688 +TestParticle +1.9812056783962854745 0.2247292940884803858 25.532351672534726816 +201.33822039314060248 254.90475216060337971 359.59652623258176618 +TestParticle +1.9116361511506723136 0.34944272223947114853 5.3334830645261233073 +165.89953551606566862 87.00762822041266986 286.54555713608760925 +TestParticle +1.2300510950958833956 0.09272681808089294764 6.1108306263088341126 +60.392041334648261852 166.06618730050502108 214.40030029409305712 +TestParticle +1.6587060971893274886 0.35283027123356813792 31.860313399205129059 +249.71240866151026694 222.43577149272385896 31.641338378167219503 +TestParticle +1.6042337378433173534 0.37025740688655151 17.202399535173533707 +87.81318396148407146 2.5620013176806422095 357.37399955588330158 +TestParticle +1.6471345300326571959 0.13620174045721983314 22.615216955031499424 +80.62529682810802001 69.592694813600971315 105.76774944494903252 +TestParticle +1.9072984229216274343 0.01501546063666405785 8.290907351796761304 +169.80316939963415734 18.043578597928426888 349.8451486157899808 +TestParticle +1.6906614679737514972 0.18058500638001656613 35.641943093270654686 +155.08172745880321486 318.8449035930426021 193.87642754894059749 +TestParticle +1.5896626347240321309 0.08039921506021037445 26.884736251329634626 +93.207751799271306936 291.57502433845007772 164.72382015911426834 +TestParticle +1.6992934898451703685 0.065201137301299824656 14.269610927403233447 +236.09727012824436088 254.53147047225508004 263.77965229044838225 +TestParticle +1.8538533648632840034 0.04766458860664664343 32.873078543951940844 +204.22879507518445052 106.636047257291238566 249.48280450502983285 +TestParticle +1.4212096807741136928 0.07499446462853280593 23.101996292119086007 +275.60817514452082833 213.13272785623379946 230.30352647630064666 +TestParticle +1.7510124795524912855 0.057099861992605485672 26.912262589245482758 +293.1635508220617794 35.9907631662996792 141.04718451469835827 +TestParticle +1.6563019761734052437 0.025865878674105769602 36.786210320613299984 +182.00701529286254754 302.4937526698793704 324.59294681664295013 +TestParticle +1.729605636071602337 0.11527751871838157194 8.269004569267789151 +347.6614584046645291 246.54991472345386683 257.4460526186617244 +TestParticle +1.5759605048363587443 0.11372511990649024349 2.1138568479458896832 +32.388292718466615838 301.59398434276658918 321.32099521949635346 +TestParticle +1.8344051151510727404 0.26899383835918777574 3.9802801398091425256 +84.71344253866337226 168.80695388443507454 259.706671920307258 +TestParticle +1.9193495257732000603 0.3433984358229728029 11.27141574019314163 +62.069125737912351326 344.62614387614092948 49.455425729806016477 +TestParticle +1.7910635325425254827 0.044197943689674758228 33.673496401958495028 +49.096060175323778196 333.20352819343492 344.1647888658290526 +TestParticle +1.3951416310339623816 0.25049231139019290104 13.926920554033479505 +24.468782285640848784 283.9433213127680915 38.716618949049291132 +TestParticle +1.4774439717601555166 0.34321703341922732422 34.23200733980726085 +253.1569295809615312 208.55072402648170282 142.78123543474748658 +TestParticle +1.8035383416573496085 0.31178214061844072846 38.848219271007792486 +163.78980370879801853 27.192135308956363104 240.49835213590739613 +TestParticle +1.8523952866624258107 0.2010708076570819347 22.034325231090594599 +124.711476085711595374 323.0644792551414639 138.10178915634389796 +TestParticle +1.9173340778250498317 0.2780025712872400967 25.973495130250071838 +193.9471251677579744 256.51445549034934857 68.5799795393802043 +TestParticle +1.2039954656193134763 0.32062119894339707882 11.801770668367792538 +261.58407010163364248 130.72550628237604542 295.22935271302458204 +TestParticle +1.3539793779063435952 0.05619140956045583224 0.39149769265351963554 +54.55272735280637164 335.83544373800691574 89.36258771851326799 +TestParticle +1.9516074079116982887 0.1921645005309346732 35.371640156848229708 +152.55319109406485723 247.31165449235123788 278.83909188690222436 +TestParticle +1.9301130006872968536 0.047382794904003239234 3.296738006904260665 +186.93636419954495409 38.829849755176162773 177.44532754290727894 +TestParticle +1.2580985637358546025 0.21204965723905899733 16.1659140062293325 +3.289189867948967283 190.84482276807500511 67.97050011468211039 +TestParticle +1.5295225293999865634 0.17172263806479373671 39.618093381378386653 +332.6463231490124599 278.70254383892529404 12.693771958962534185 +TestParticle +1.3231257344221201144 0.2573419902802399073 38.0841373767418645 +20.119441148442565037 244.32686028253979771 48.572638095274754733 +TestParticle +1.2390492871187110957 0.23798618359691314783 30.645766685864785472 +87.001950267678836326 278.12670273948640443 330.89492423249123476 +TestParticle +1.3993417216526349289 0.031843494342214208326 14.144935673919892594 +72.465298766095699534 334.2534597720372176 30.48791433958904662 +TestParticle +1.5347486253277040635 0.04338458251454313519 12.0921328741059639356 +120.79694902396420275 355.45117743828626544 160.7907173842522468 +TestParticle +1.2904906197620742425 0.28414011519071485923 33.037713210604835012 +289.81253890944515206 83.576357577029270374 220.09709176383933027 +TestParticle +1.6058032451228929638 0.36018141227094635504 17.994372902660266789 +3.7010845253058599624 141.54942979100397338 198.05616798418643043 +TestParticle +1.7714414500542230435 0.0035609242707668187222 22.050030319794334588 +264.59185760489833683 10.605770272399395182 215.25949766508875882 +TestParticle +1.81709217161712 0.27368429441007163794 17.149545687672187455 +35.988324614781888044 81.77856120500719328 10.201466538617181001 +TestParticle +1.9507969820486321666 0.104826252022570107214 21.570178232673107743 +110.11799658110533073 203.10615346805144554 174.54637699366600145 +TestParticle +1.5513016726876260876 0.0649073896097557973 28.406030811013923909 +294.40827400152136306 308.45384003953444108 250.69412013121518612 +TestParticle +1.6081730286462514457 0.0904772003540942199 8.756397654381963491 +95.30241023766843966 310.97856820924152998 78.51553642084900275 +TestParticle +1.9445060562513780678 0.34581412562291430346 38.93528925234138427 +322.18458452998703478 206.50871262487711988 171.6753679893202218 +TestParticle +1.2867830568980889172 0.23805020747269362014 30.605085071406584518 +107.834941188806425316 172.69897682961376972 231.64156285513004718 +TestParticle +1.5570299212666793842 0.34247490116827700168 25.701729758850273555 +57.759342054473357564 275.21368529820330195 0.5189093555138457603 +TestParticle +1.8297728730942826036 0.0059327247000139143526 26.27006410810665571 +351.91597475003959516 332.46172667657117472 193.83113607968971337 +TestParticle +1.4663451402621732189 0.019337346272064428326 0.491698998445047053 +336.79769240394642793 248.96724280968578569 175.15811073921727825 +TestParticle +1.724576194857081024 0.052697296256256631608 5.7447084496883027427 +66.182723011463494345 29.130322702617217345 339.9870439485365523 +TestParticle +1.3696669727225077029 0.33229023795273532338 39.64244722837145929 +133.49050184888841386 162.12402403598608203 293.04583577859932575 +TestParticle +1.3783417053600715008 0.2855227081254033128 11.873396199324094624 +181.03404330551020962 111.58079564001488393 50.497053185226064898 +TestParticle +1.8637392080726669086 0.0156183905360887560765 26.799919264480482894 +101.416124536033450454 141.64824974137857794 87.10767556818554169 +TestParticle +1.3990411255817394309 0.016424027824586850954 34.17231113580791657 +351.25674680067004374 51.410447621435544363 109.4743571087562799 +TestParticle +1.7113078627771947104 0.087396542572623220346 21.48366722009397023 +331.26077825265491583 87.597172428811916234 351.11237329056922363 +TestParticle +1.6537452602438895699 0.19076978286361276349 30.899468439263419128 +338.97921655361312787 354.2717007607652704 88.459659106615376345 +TestParticle +1.8713204845226436568 0.34948347966477527615 26.694021521206035885 +22.640920338079904894 267.1658484538838252 91.263466282262129425 +TestParticle +1.7800499814903345541 0.21591168642547953205 4.15893255030611364 +284.8692985786169629 273.15026927162216452 163.62920354405895296 +TestParticle +1.2770584465418410858 0.11704921307575957834 23.561299361007908004 +208.69763432291699701 114.84562071374233483 106.557589971007203644 +TestParticle +1.7789101924514278963 0.21089404756926086182 26.446391287965887784 +166.38039683220225129 280.94687192438289003 156.1732356226829097 +TestParticle +1.5095803628848272204 0.37888764670309865723 23.739638145042558648 +147.5462561757028368 320.06107890549310468 221.66365612858550094 +TestParticle +1.431320096709388201 0.090307147024224890264 8.768204975989792871 +86.741239636344801056 122.03132838806067184 343.580887072082362 +TestParticle +1.6349437899113876682 0.14387102541744481443 11.841216176535350968 +51.14042919054931957 69.171034829460595006 213.79008663660533784 +TestParticle +1.689003605562497734 0.13061345081474304286 24.749487065465949343 +180.96919715736157741 204.68845725307318162 260.67277137781871943 +TestParticle +1.3035444430147782313 0.19990048901013623972 15.958381821114077326 +24.968896817823825529 197.33820599380237581 119.001287940231961215 +TestParticle +1.6620625944290643439 0.2734543708115155236 30.556744105988030924 +323.42922129424488276 115.879900714354221236 18.69101695694187626 +TestParticle +1.9572874068027543704 0.3982637334300366816 23.395690692151514867 +282.1199835387070607 264.2819579212129497 226.80637570406867098 +TestParticle +1.7711614884940887205 0.16471476857196881705 34.541413045241888824 +209.78439563147685476 330.68687123431953978 302.79975669488345602 +TestParticle +1.2768346788945352799 0.2680189005217827325 2.3664781607185281231 +4.5230625737162633015 309.27315231219478164 35.64300138830596154 +TestParticle +1.7331467818212080712 0.08199012177664927181 2.5002689592511995187 +16.248296777956340975 8.818474849161844986 133.32825103025075464 +TestParticle +1.5824962842528258467 0.1664685697946028109 39.01047834163395578 +294.62170247515587107 5.127126749923851534 323.21555884047671725 +TestParticle +1.3065419938771187791 0.062752012732249048965 8.378519051225520542 +254.48399542766591708 227.28662992761130113 215.88914339840525258 +TestParticle +1.2803200151108913296 0.39024438031771679913 26.21206496548343523 +86.2004800657045962 86.508225331489853716 295.03587464294588472 +TestParticle +1.9599644739977994945 0.18082768987187250453 26.76260832548297941 +347.08076935823510212 187.06487585242066984 78.43547038210139988 +TestParticle +1.5504457817332411018 0.058138854268877486475 8.311304083318722391 +250.45953202370188251 51.58641776614162211 321.91182873943205323 +TestParticle +1.4030770961210228265 0.2255632436620616521 8.257376872662526068 +110.66653646497886143 331.8743125077128866 326.8827542847423615 +TestParticle +1.3330653778054313285 0.23576894818100968543 16.555280374134500931 +201.04570271621727784 304.9737571038722308 129.38177632189641031 +TestParticle +1.4676189305416613706 0.15334509742223720319 29.730324421851861416 +93.28877448580836074 98.24809064509591394 318.26221325804715434 +TestParticle +1.4959613849179316247 0.26490707510895572518 8.435591899110246317 +121.44478123997235741 352.46125426578402084 269.21443204906552182 +TestParticle +1.2410245922213516412 0.16484650483123386433 29.036807003172221187 +234.59702065989810649 212.29149699166657683 309.02229933747048563 +TestParticle +1.2104445735427551423 0.27493160452164350227 31.472614096909531156 +172.8652728002631136 303.96742459461654562 8.009940254088059319 +TestParticle +1.8791733750261010449 0.2587599416761243165 30.401845910812088647 +330.1151954343364423 190.20401433347646503 104.67843668270934643 +TestParticle +1.3013630074517779089 0.22413535954031660324 32.01650674239483152 +63.549710245898353378 35.89931403059021875 158.56811223007159128 +TestParticle +1.9547724398089645348 0.0786294356900830993 10.0598953139010802715 +69.4839845505388638 123.32244013516246639 31.421777442531322322 +TestParticle +1.6120256585797529958 0.19985700875898035345 13.999189942348966298 +78.857222386685961624 349.6556927780835622 58.475688092723309808 +TestParticle +1.7578912848822172421 0.27207852440462437782 21.16570903311817986 +204.48739950618715966 68.64871257741852162 227.95088374477833781 +TestParticle +1.8170356771723037426 0.24230078833019122464 19.368483713748780417 +184.73419610737784069 272.32723488431577152 126.891658495766833425 +TestParticle +1.8561231261283124283 0.19157748016708203709 1.1886704509024781373 +254.2676067727032887 317.6217024209003057 224.34445674903426493 +TestParticle +1.9710622679246994071 0.14623926742902368381 6.640292860769481109 +190.41063402021279671 187.773358994985756 328.47417804669458974 +TestParticle +1.8390376809348407683 0.39004880820775639227 20.066519467297950996 +211.93199248227401199 289.47815944254944043 137.15839269809171697 +TestParticle +1.6111502808558577637 0.22394676788626455277 20.061937046580968769 +92.54520491825057604 92.01310424807805077 13.375630065565452753 +TestParticle +1.7289359898596003973 0.029780688540387692531 26.014739049810341243 +312.66680607544742543 228.17665637399315415 125.22825394003517374 +TestParticle +1.2705682146072982963 0.029404610289824398284 5.561963728286389852 +84.16555574179947996 331.08838136349748993 315.88331119433712502 +TestParticle +1.8573347647002547145 0.36089888274309028793 33.45261607330014897 +108.58851164869084016 217.00073148209528995 139.41678117547121474 +TestParticle +1.5119662840275136517 0.035019622195022657996 10.463315222301648788 +152.85193304965602579 42.895445465204801394 38.742869188454783114 +TestParticle +1.7622884149632529471 0.03162410217369809179 3.1822974384423297067 +37.26277315140376345 107.89474442992022318 186.6015285726906825 +TestParticle +1.3516643515537363207 0.00042846679844568138443 14.013484979190140578 +216.76556913128737847 329.5425274371341402 157.99664633404185565 +TestParticle +1.3725976866577220825 0.30646538230027742244 11.329739671767651288 +198.97848141965863533 44.651190190469009167 28.049566579775078168 +TestParticle +1.4591070353626824918 0.08119659950059535114 34.28551752565069677 +306.99758279574081143 104.56005980026995417 24.491183217056139654 +TestParticle +1.6809883631745992094 0.12405907090243922797 23.088918298866115464 +81.89324756024211638 45.486408290411304733 5.9086829848113620045 +TestParticle +1.3535618238311779571 0.11072994226846155641 6.1365791065780417313 +96.5917090856876257 125.77992141224173395 180.26956152431557712 +TestParticle +1.5024996182012646528 0.2601294541852439135 20.11839589454453403 +270.4000045350792334 353.011762488246859 34.641037025004784766 +TestParticle +1.5996488376502526751 0.37889391086596613256 18.528995245881297649 +215.86591794372824893 196.33677334782890966 20.482598606365485239 +TestParticle +1.7931356901400370418 0.025945290910749509855 26.661454696830183764 +188.02499061598265939 217.74613305793528184 352.64512058062791766 +TestParticle +1.6808120166727305023 0.26627765088552390882 4.4798421923713638293 +12.471177251742290082 9.432555892002669751 336.72507040011447543 +TestParticle +1.6313081817828176678 0.0086570580622717507174 3.9083339029362873518 +54.248103250365730332 318.7038881970888724 331.85368591582181352 +TestParticle +1.2884450142579531029 0.1681046156164187344 35.34871223758726444 +240.5583121923978922 135.24748641897326706 301.64571007267852565 +TestParticle +1.9196539088974737819 0.055293464951134657648 39.174420254686374676 +13.003093109260595028 224.19261478871260351 272.9340647583842383 +TestParticle +1.3704960962475472019 0.11179773250371188853 23.81208520955706831 +261.70166394043076252 10.650163480395606896 96.095112534597603826 +TestParticle +1.9516781167723931123 0.20402034023295062548 32.535249468476067136 +340.51354688545097815 329.0040653030519593 109.98356406041511946 +TestParticle +1.8140222569343318337 0.12613518245266175377 1.4950171510413001741 +234.61793333937521311 320.05130111528796988 172.88154495883503614 +TestParticle +1.8102010682471065817 0.14811926068150899072 0.47152065059882453113 +231.56413706767099825 205.2503541540525589 214.7508917825621495 +TestParticle +1.3323729215149744398 0.19959213905409678436 1.3073421511548932727 +151.66443112411295147 341.31892085633529632 144.25232896171203834 +TestParticle +1.2204541150545651362 0.068668187712776870835 4.014281498324958619 +174.08147891950491726 47.939506002741296697 254.99017431971773817 +TestParticle +1.2181192459350491664 0.025059093817326606735 7.204862413525972009 +48.60770716273837877 329.11947000106135874 217.6643233891191187 +TestParticle +1.6039675062130638317 0.35797604454305875787 16.056969103103426733 +87.92417372221831329 49.76521958624503128 164.99398402032807098 +TestParticle +1.8725342069546249135 0.106279250804296898636 0.45718402173144045975 +119.596726134790174 107.86697924451233632 232.81352842822093407 +TestParticle +1.7853111973976689697 0.12193477571081268174 3.680789884957089697 +205.60326749430927862 40.207082764860338386 289.2290546833312419 +TestParticle +1.417950447978111761 0.24357413812980258094 1.910476157584461987 +252.61262373556786542 355.48333419302929315 151.32407206005677835 +TestParticle +1.2280461512973894767 0.15278421763439650749 26.714312283832946093 +142.72673485719965925 232.69712275301176874 346.3375478502677538 +TestParticle +1.61151127031616892 0.3744225370958842447 36.56793088861800811 +328.09520081336302155 25.920977978027824662 288.72452391776596414 +TestParticle +1.2239475600090146123 0.24714055634484358159 30.304522847333871027 +52.68180217169934565 356.99734588216864495 56.617981510557434888 +TestParticle +1.2496667763539286433 0.29747468986797759305 21.37154433932160913 +209.20331717962355356 22.663460638340339415 243.0475686976612053 +TestParticle +1.3767605238800932899 0.16005520292207792155 6.1854407103408437507 +301.0924331535983356 324.9040368073589775 194.17256664039328484 +TestParticle +1.2487797979186712194 0.16488755850697139893 27.605925256805747381 +173.22312758245544728 239.01695963206066153 175.97057379774636843 +TestParticle +1.2254722592225348876 0.36803675574552041638 17.169692704564543106 +198.47031096951334916 278.36167082537872375 125.492714298233096315 +TestParticle +1.6464965033862297705 0.1517233377674910566 13.532163365202411143 +147.08019388518567894 177.40254091222027455 340.04568453953692142 +TestParticle +1.2241673144222895431 0.1378443050280294957 35.034429639418924296 +279.5154571951889011 236.88366494050367805 224.20218590463449004 +TestParticle +1.7054405098540872388 0.3610118405579151868 11.466405393735001894 +354.5918155292421261 347.1596768668937898 219.93975816420154956 +TestParticle +1.7400094098497860262 0.11768201787113397039 3.0207223829180174235 +344.79550555000747636 295.17286383856117027 107.65817940211057646 +TestParticle +1.4518563888365596526 0.034369934761878086216 5.703231914559241389 +123.995036213356954136 112.321809800044363215 96.308678475290903975 +TestParticle +1.2222379634093671896 0.14278765376770935491 35.361595327244465636 +315.14729198154049072 321.37175810105372875 262.59992588280709924 +TestParticle +1.2388409450815878188 0.29191544705043231955 14.574148472908646568 +354.52890314367516567 301.2116870378684439 101.6607227628783221 +TestParticle +1.2004854536116522645 0.31759418786438237126 35.64893550976294989 +150.1713542262849046 263.81583006909363576 352.70617164487305217 +TestParticle +1.9942890442362894987 0.19536136516905414084 35.02451517807598691 +125.959361711604387324 266.3424034858336995 225.8398826035477498 +TestParticle +1.5915447637460526931 0.0895260552791858899 24.02901618574255238 +322.40268348510250007 115.71588659763698104 232.13880147735969217 +TestParticle +1.8790673483459361393 0.17433764017862168894 13.878215826572342095 +302.39495868122469346 259.03939837677381774 176.29569985086394013 +TestParticle +1.9699962554990502195 0.38438649317544010264 36.886012906803621547 +71.57770428256088735 76.46325818263683516 152.99488881347215852 +TestParticle +1.9815372834826587845 0.17262153411198999375 2.83353778898145503 +239.37167896200179484 354.1664112035709877 298.12866718881934958 +TestParticle +1.8155595191765212526 0.00946228278143057544 38.64106328673518931 +83.00268912398927057 67.39652732514183242 195.80213873516331091 +TestParticle +1.8868581896910789908 0.10440835820682173307 15.007174114646065988 +3.363490125056509683 163.21113577536885941 277.4874262071848534 +TestParticle +1.5619200947925855338 0.0059432103700412857936 28.417160713316764742 +199.61588156187738718 146.61610611302111806 239.63331133984317489 +TestParticle +1.5212478213877396183 0.39927753429172280208 20.482036387314252579 +328.51885419136107203 7.1256709736876455707 220.89114467811927511 +TestParticle +1.8571870020289564795 0.091291230530104086616 5.8118062401183578913 +90.75198382995706936 192.24228564818409382 97.133874093047666065 +TestParticle +1.9171289936627273764 0.15261088480197210204 38.10675746822411014 +307.07749448841616413 355.13520879558041088 42.711583491490678455 +TestParticle +1.7364144307839262105 0.212129283201967056 18.744823342299753222 +23.928680492317099038 37.437700592246308418 64.10777424122947821 +TestParticle +1.615801582218067356 0.15507189040762445198 5.289237911360147315 +2.9760090649453463385 170.77756092233224194 126.74171547116436898 +TestParticle +1.3071905708698117188 0.34127930871062794882 17.996264880013068677 +181.87012353589301483 211.32152679731703415 284.19737442691894103 +TestParticle +1.2265401930807908748 0.25798059801133454982 34.025699672304931198 +87.484085061199664324 233.26336671618474838 310.39211945198593412 +TestParticle +1.2051260378681512009 0.3069049294618042545 37.351493484362229935 +114.521127203859620636 225.6531083956228656 323.1220799515929798 +TestParticle +1.8334732437656884318 0.37979115889431414033 14.226342594064389502 +331.7883640504541063 109.06927231695421199 144.65450510058425948 +TestParticle +1.757300956926634683 0.03414936250768385584 23.912004140762192606 +322.3724083824729405 134.91275424426311247 171.32647169967813738 +TestParticle +1.8972253261023601656 0.35656552318718498507 28.47629514891832514 +321.29937216619140372 70.71608626545858556 213.57910706058532924 +TestParticle +1.9917616839747163127 0.32376104104249381344 8.91181936527569718 +200.88415597368361887 23.513470382909822831 100.72835347725671795 +TestParticle +1.6165777777920147251 0.32043762073249004718 16.726392824188689445 +319.72153811597894446 76.78830327849077264 138.42254101919101572 +TestParticle +1.8908331674281746437 0.045197492899151252288 1.3383682043347544521 +312.10875470237436957 307.494732749847401 43.074246036675127414 +TestParticle +1.2145287335503922588 0.18257617394552527745 31.629727041908243024 +3.7714421582542145828 327.9557064611080932 329.9790680610109348 +TestParticle +1.8625485962061800738 0.24850308301344462003 2.0061095060140976543 +276.90239618431269264 350.88215248164351578 348.2932770314767481 +TestParticle +1.7953658240966166026 0.23860504712104810277 30.564301023692120651 +268.6736542028508552 254.54176920249031468 269.62615941325310587 +TestParticle +1.8519636256102920413 0.13630536382454808142 25.429742406638986552 +78.06201903944463538 183.89412111638756642 25.670444097748280399 +TestParticle +1.9912586036233026476 0.0062934836627138949355 3.9866901191125192483 +353.92558378078365422 121.86076402069599567 272.13181013382109086 +TestParticle +1.2352461280314077641 0.13108872108404742707 2.4473753819670784893 +223.0667681463768588 134.42147854096177184 161.85468044136672461 +TestParticle +1.3431819133091436047 0.28681705477285673878 22.82513974594832007 +232.7183120134940566 120.199688171678360504 89.77367022064561297 +TestParticle +1.8403545873570172908 0.24879279733973019839 4.0287923881425502515 +15.018525270146003692 85.179302481017629134 62.783331763645470858 +TestParticle +1.381867054141263651 0.041622600218831219687 20.582798332241445394 +16.94221565894110526 117.67293863884100347 301.82514806956680786 +TestParticle +1.8641683600359446604 0.24640721081737218534 5.9107924107914655565 +193.20103651885807494 44.2323469313580091 26.743437036080784708 +TestParticle +1.966054790276180464 0.2690464178872462031 14.878455955491389773 +190.60763663869553852 31.588470897177995056 100.366806653161106055 +TestParticle +1.6058040413293108717 0.29951736276665757996 32.261171438174280013 +128.57574732488706104 32.785220122308132318 5.815690987139072732 +TestParticle +1.6218958057245982385 0.20051601410731448305 35.228407716619500434 +275.05072744657877593 300.36353903970075407 137.58872709072204543 +TestParticle +1.9766063717976680714 0.39029116187457174592 35.936563690886423217 +276.4677919812604614 334.4193480382128314 74.17428380404710708 +TestParticle +1.4924898153539933876 0.12959279079593266637 39.497773315041648345 +306.13052013355064673 297.98869981653200512 134.11781736074624405 +TestParticle +1.8353633188339963933 0.019510947086492525654 35.474352018859882207 +260.37806171878622763 151.50200809864463736 309.73656114784841975 +TestParticle +1.6024488136145134121 0.027272421536337843745 28.531535673798313013 +11.154644928392061232 313.60248630627489774 220.0912732804740699 +TestParticle +1.4120513432815475774 0.29969768596351453738 17.02938110092897972 +269.20328072337844105 42.08893931076963213 126.58679602124011865 +TestParticle +1.7381168022087705172 0.29181610891675680008 0.578376627518526476 +102.38820556898792802 176.55332025897169501 164.93491360823296077 +TestParticle +1.651697945678905155 0.10215579780054198644 29.466376982324295142 +118.66030632495935038 355.77634853151920424 138.86820482744579408 +TestParticle +1.8964095997568284346 0.14855799694311630499 39.315092089557069244 +66.7203702634703717 109.12901978076088483 150.07738642659984407 +TestParticle +1.5884778821144036609 0.34804404474317385265 8.230716828452404599 +238.65003666711348274 19.561503330036060788 172.3300970659766449 +TestParticle +1.4852533118509871901 0.14921150930008680868 19.72836045372870828 +214.04378603222667721 162.09311096493223658 74.70412564882457218 +TestParticle +1.3995786109265431207 0.2170751900351963748 5.6353499706781517986 +136.77890520256397622 41.74190372493747958 352.76491235469808316 +TestParticle +1.9228837399064100389 0.20666458127164555325 31.918474396874408683 +25.57157805855647581 146.61033704579944015 124.85803020390667939 +TestParticle +1.5491200767868975596 0.37703244317878858993 5.088593545490081027 +38.820500192778638393 121.37946795513649079 24.303500272632902579 +TestParticle +1.6942853977776144436 0.090260172320617615416 25.30769952267446854 +161.30886094388631591 116.98046667590497805 38.286029141363265182 +TestParticle +1.6090251866675413517 0.330322662148613444 9.770748848728519675 +263.0814719840412863 130.26024091675910199 286.9327501208536546 +TestParticle +1.9761336997553433648 0.2926123710566602143 11.274914096097191418 +332.1701813530870595 307.94382558508260672 353.807211256272808 +TestParticle +1.9968906969927759931 0.3233230682542853618 26.00314542561351061 +79.80693890771757992 308.2283099476609891 243.34005704939397674 +TestParticle +1.8031947344086236562 0.14995127116151910074 1.730342239053141995 +348.6351290160268377 154.3487630625562872 28.463371915640660603 +TestParticle +1.8395166633814701296 0.3354540599588180516 22.093131712634573205 +86.610640388957989444 239.4548535151652402 312.24619268529380633 +TestParticle +1.3629305527230259898 0.2099232743767838194 30.216497531918712127 +102.43196923936434928 291.32106047341460453 2.1370626980559981334 +TestParticle +1.7455726368986721475 0.026854653926422458743 3.5759919284920771432 +354.23018906949636175 218.20031690429203763 328.7114242710409826 +TestParticle +1.8154807930100198554 0.38785895954054117052 30.190244155261783732 +84.158791911543673336 145.33493614486761203 216.44848876198116727 +TestParticle +1.6499702946012431148 0.38233820338992924315 13.614607279413908358 +33.87451574095803153 90.770300669062208954 180.38849672518907141 +TestParticle +1.607515534627930176 0.059816004314718410062 35.188867073591850954 +58.61309722228839547 253.79649442362003242 91.30583916434224534 +TestParticle +1.9899983350379286673 0.30667218968608733753 39.83983478820580615 +209.92012615445401025 242.81573248914770602 7.221381167673248669 +TestParticle +1.5778501251334575706 0.11118331397677137795 37.590979480700937643 +345.16243909883007746 9.645072368649788785 50.426633047687808187 +TestParticle +1.8837383001263663385 0.20673789324487820696 21.972954461156501083 +78.99100998693006659 24.805859834858065227 136.69965104577451598 +TestParticle +1.8299552552499931402 0.18024309648678646378 33.71418287836082328 +287.1584786318022111 76.47733005592756683 216.63675723929046057 +TestParticle +1.8307526657330810416 0.27679256938591745296 14.42019596286409211 +147.28115682985833246 236.20842913390856666 70.36203841533576053 +TestParticle +1.7619978997528076281 0.014257923627121950327 18.454020582426768016 +275.7628626446463045 152.24331061485040095 103.04339508992384822 +TestParticle +1.2611641121223651218 0.2092199031608525106 17.779518579686019564 +102.7504319389703511 6.548313747168017507 140.31125376249352144 +TestParticle +1.7663975820756958601 0.25859601590736014387 19.29766354922654159 +228.43411110252168328 129.52408847472079856 44.31277736443019677 +TestParticle +1.3455298896696588073 0.051640741433284009787 36.190409530870716992 +63.492703118667094486 178.32472671129730202 219.22272979662204762 +TestParticle +1.8502619397752217978 0.016055258128672856427 24.72292322260771158 +280.24156788062276746 1.0103622910431475646 89.91460784296667441 +TestParticle +1.7394822607661057923 0.13625236700994178274 8.773342269773106494 +131.40116141700701746 79.224373058834927974 282.8109557650995498 +TestParticle +1.6325195629104731765 0.16262358056449152666 8.946438635142083484 +196.95655091099223455 13.582007343579313385 258.10561033792743046 +TestParticle +1.7657479077259037314 0.21823895457628741945 26.194016006374575056 +307.4759621278849977 98.40357006941655982 64.08127327032266862 +TestParticle +1.3184659717472237972 0.20902078438144011674 11.194180638539418027 +209.8144125213535176 233.63319375255508703 171.85375675646986338 +TestParticle +1.6265974791221389228 0.3412246124964996019 31.920108006714791316 +47.471005836654683208 293.97130420183299293 294.00277926085681202 +TestParticle +1.544562457381803755 0.26456236803106419897 16.966290843319804083 +53.617851002077699718 23.906897211735604003 172.46215455198040445 +TestParticle +1.8302658298265410686 0.016558573352333152279 23.88277176507106958 +160.31985284355113208 24.957240748542652398 126.6630513998358083 +TestParticle +1.6333356556090419254 0.25338625439533907224 11.051395862722980468 +182.26698944663951352 1.9926145156870767039 206.81766326774084064 +TestParticle +1.2674061997735568408 0.09083958911004344494 16.414033820600888447 +209.7777498397578313 350.73333597951523188 247.44407246182404947 +TestParticle +1.400118114272113079 0.16683948053104513676 27.357400210939808005 +107.57418681944162131 96.46599300991492498 351.137614793950263 +TestParticle +1.542911801971112773 0.22704910395233757203 35.542775761322914718 +183.89056710921508397 326.93869125935344755 108.004775809479497184 +TestParticle +1.8076126800363871983 0.3514591336111956288 31.06364189291468847 +32.09942049648420692 328.34181095498098557 23.785841162187210784 +TestParticle +1.7657364621109161718 0.22171357606490707526 37.37986273837123008 +76.229451450918475075 186.15095789038804241 272.82850857627113328 +TestParticle +1.5339591135633763308 0.14194102156165430695 16.888317976342129612 +130.44976850069960506 252.36020783978619875 120.456187175611859175 +TestParticle +1.9547780848567972711 0.20899592311387996113 28.868044731219395516 +228.48529363010104021 342.5481929867736426 287.9707078087696459 +TestParticle +1.2418423098941544502 0.2626072565929837288 2.1074243271891202056 +38.080338719023941962 119.27817821310316049 12.056891938029119515 +TestParticle +1.2210546528534078625 0.3775561742151631872 22.111051712315155982 +338.55211294801040367 12.980519500186410653 332.2853401701941607 +TestParticle +1.5963937431999124517 0.23239324239635986147 13.194381854516867847 +58.007673822576016676 88.15306827351753327 155.81366075873469867 +TestParticle +1.5786275082915319778 0.025562551186680871479 4.998454237047265103 +250.39244849302215812 165.61747690949906087 149.37807874408460407 +TestParticle +1.6098684422151645634 0.21941479472017652586 38.283886043658093 +237.71100658433758213 47.01387761056833625 340.9146849041053997 +TestParticle +1.294274143429140933 0.3692138815235402327 37.966030890732696434 +203.45477640609851733 296.29180039237496658 44.323085276308532343 +TestParticle +1.5889819356899443914 0.084869830381732264124 1.0823445911213003257 +301.3291216497269147 146.81272157061789585 2.2993592847625343722 +TestParticle +1.495972566018333838 0.2617122471497527747 13.094048981160977263 +112.72021003020111607 127.77611875010921949 296.87288781423353612 +TestParticle +1.9818950278621338956 0.30723187525460954328 2.2340086246482782073 +253.14761844363803789 165.37409022827591798 191.3408807414710111 +TestParticle +1.7869956116636900312 0.045787597413756889186 8.90426427671208387 +227.8168631112827427 149.58799389390406986 24.858909708161100127 +TestParticle +1.9448897771198014883 0.05694944930378804948 36.311102677736613487 +84.3756745725393813 14.735521995724774058 314.16923571788140634 +TestParticle +1.5778886440600849994 0.054612245238724765883 16.72994958727242576 +293.0541083071825028 260.48271034952341552 308.15802194547808313 +TestParticle +1.3022587146281570103 0.26839233124203137892 18.02838057643581493 +293.20763835009915965 312.4703557364094877 106.58503108046902241 +TestParticle +1.8428500612922003032 0.23594727253001890332 11.315478566151577766 +9.262284156503813648 11.174441070760416039 331.91331034768620611 +TestParticle +1.2400313949450130213 0.37422492957960290516 16.60903446615966672 +240.33042266148279964 153.97322107823731585 191.41559045744850209 +TestParticle +1.9829274684920319416 0.3634611481375451536 25.819601695264427832 +140.99742244780588862 341.49734482956387183 8.731842495851447339 +TestParticle +1.9975413987753882772 0.06592938413948253029 39.49276861893206103 +67.714562888696974596 98.14914061512281762 45.19626721853934015 +TestParticle +1.2436383625451867818 0.3204615517738288455 26.461603913930925813 +266.5125426106603186 127.50909218237357834 0.3132830361456928614 +TestParticle +1.4113215699552892346 0.009827894395237192146 37.858626352737367426 +253.23691224458718807 108.52674294880429784 352.47828245113328194 +TestParticle +1.8148473149676069838 0.017705697189401049807 27.03434752366788274 +244.97100671505916125 96.848173936006702434 232.97923224763914618 +TestParticle +1.8212512693609279602 0.27211932176121911287 4.7578666520375545446 +347.57353058021692505 254.19838041200335965 6.6604121361125034895 +TestParticle +1.6430443076417013959 0.042365150738876616865 28.313700526240026534 +178.6338948507659552 287.94750707892865194 146.775946581025039 +TestParticle +1.2047662238103988841 0.23251833898522478172 17.70944339203029827 +282.07165060128687628 43.193800331112015556 189.58232124886598058 +TestParticle +1.2467705317577537638 0.29356902400030004952 2.8706191725519047964 +242.4004033144470327 28.806681869090574821 296.21360336099968436 +TestParticle +1.3162696178512978129 0.30749173225083181737 9.346008763094072691 +322.38053647407821245 112.34526406313270286 132.09084683753127365 +TestParticle +1.2971409174950825349 0.3376994788613812415 24.652899562822732094 +299.7803539105363484 271.40817959188655095 266.8572235615602608 +TestParticle +1.7684747977650516759 0.02661749740193952718 10.096507324045376208 +3.7221406213358587678 125.36494422546940086 238.11022628505401144 +TestParticle +1.8562458518793771844 0.077017667000931988586 8.7143363020037831745 +136.69548804548151111 320.94977656886021578 128.10172157330882214 +TestParticle +1.5044816034257817439 0.21762930629061374987 27.505997823490588416 +123.58136898241176027 187.9229325893226985 113.043904522795230605 +TestParticle +1.7868133877825629341 0.008087932404090647162 23.413784625415864582 +218.89711766597091014 88.56442540385896223 208.43834176513581724 +TestParticle +1.9402143213090712326 0.14949494785208861103 26.511808095563488052 +107.604663311176523166 130.69889435502176411 346.87469017336604793 +TestParticle +1.5966683044291980487 0.087101617604941061757 35.919427778579809285 +212.8714684966646189 289.47277777746671745 150.30140968266374557 +TestParticle +1.5311077130660335488 0.006686025386596972271 2.6738949911861054076 +164.51009812173990099 316.04513748492058767 258.44750388729431734 +TestParticle +1.327174430660648996 0.16386649979480424899 29.516591637239059764 +42.47034129892313814 297.69030488053482486 179.48650722792217493 +TestParticle +1.3309285665414212207 0.31056216374123679635 33.20416058697580297 +182.12327311281021025 179.4712707903883313 47.404071121072391293 +TestParticle +1.2695626979113197041 0.028739588397623319627 34.7510196296938787 +156.66911337647667324 15.489917584647256987 137.9360720619328049 +TestParticle +1.961564416777008768 0.38198101311209609054 20.407128195470789933 +116.450533784431996764 317.3401517067230202 183.14633665136960872 +TestParticle +1.5940513845582582331 0.25613384894831064953 29.533539385317940429 +118.85654306899444066 250.92868906503659332 22.448371873007765487 +TestParticle +1.8442908242187292522 0.19455300058304564326 38.64468812151265098 +327.51192512776293597 261.15575066638751878 220.98151223015130995 +TestParticle +1.9551136736888132805 0.05881060116092867024 0.025983316883650964257 +229.51441899139550173 217.59860795663826138 108.775137355673251705 +TestParticle +1.3586578999851930405 0.34983150673028151623 31.522812174550345787 +105.68138198042714748 123.58623362447058014 40.330126317320825535 +TestParticle +1.902888826244875764 0.13683561730200419215 16.275257623666469442 +105.98161437435868493 148.2954616585051042 301.45848496238744474 +TestParticle +1.4388714351119729074 0.12902603848379340379 21.287394563627660915 +197.02123109899764586 352.44807359808243064 351.33034912544712824 +TestParticle +1.6931112006676685144 0.013916379702603532201 0.7871365555378062595 +188.64764325380838272 181.38199447667832942 29.813972851285797105 +TestParticle +1.6449616174898105125 0.0310490777007133463 9.657476944838542465 +333.95122687579464582 342.1511167418379955 160.69927097810261785 +TestParticle +1.432310913839848876 0.006987746683723328363 32.61241995358341228 +207.28809337462874396 169.31652720575732474 255.68956575096319739 +TestParticle +1.7327468488118134005 0.03857017036911090241 17.468015575192744393 +143.82903277012908916 99.60548209763706495 166.68173997089294858 +TestParticle +1.5512315858530165702 0.17035757433763087931 28.229428870918749084 +211.42236583345217582 136.37631347760083145 126.78807511085641124 +TestParticle +1.5128716646861577466 0.25892751799964647264 10.396770119409808331 +251.02700694813202631 225.21225462676682127 190.02303419914397864 +TestParticle +1.3509296764855895923 0.19460583033279599263 25.473407765343523579 +153.07999025709941066 160.34541100643662048 39.661129674485906094 +TestParticle +1.6995982689149604639 0.3683946534553529384 13.407331577384432819 +340.26004127001408506 272.0620153240722061 254.6289696923701058 +TestParticle +1.4262589721598459835 0.39380044551624404647 22.273999686412832233 +126.6676609334621304 343.6417878124360641 356.69746962842407356 +TestParticle +1.3261721625529891977 0.39678878113200655164 4.2056417606931040254 +238.10434769519417841 155.06469638647084253 44.875703119243368633 +TestParticle +1.9576977154420573957 0.26084185228864192885 4.55948470669549355 +190.48438127706978662 33.209683105017965943 111.270270586090106235 +TestParticle +1.8552016088932457016 0.13548857795579999364 39.778098090381654117 +36.82048012699509343 277.63542496441021967 284.2017295471840157 +TestParticle +1.6904488396185337606 0.10545628795963413182 32.08178306599211993 +75.246216623590498784 230.69409080017558722 202.52540071832260082 +TestParticle +1.8262524413841534354 0.33415074562628183097 12.176323543258451565 +135.12569593248673527 273.69848190668875532 306.5447498396289916 diff --git a/examples/symba_swifter_comparison/1pl_1pl_collision/param.swiftest.in b/examples/symba_swifter_comparison/1pl_1pl_collision/param.swiftest.in new file mode 100644 index 000000000..879746295 --- /dev/null +++ b/examples/symba_swifter_comparison/1pl_1pl_collision/param.swiftest.in @@ -0,0 +1,38 @@ +! VERSION Swiftest parameter input +T0 0.0 +TSTOP 1.0 +DT 0.005 +ISTEP_OUT 200000 +ISTEP_DUMP 200000 +OUT_FORM XVEL +OUT_TYPE NETCDF_DOUBLE +OUT_STAT REPLACE +IN_TYPE ASCII +PL_IN pl.swiftest.in +TP_IN tp.swiftest.in +CB_IN sun_MsunAUYR.in +BIN_OUT 1pl_1pl_enc.nc +CHK_QMIN -1.0 +CHK_RMIN -1.0 +CHK_RMAX 1000.0 +CHK_EJECT 1000.0 +CHK_QMIN_COORD HELIO +CHK_QMIN_RANGE -1.0 -1.0 +MU2KG 1.988409870698051e+30 +TU2S 31557600.0 +DU2M 149597870700.0 +IN_FORM EL +EXTRA_FORCE NO +PARTICLE_OUT 1pl_1pl_particle.dat +BIG_DISCARD NO +CHK_CLOSE YES +RHILL_PRESENT YES +FRAGMENTATION NO +ROTATION YES +TIDES NO +ENERGY YES +GR YES +INTERACTION_LOOPS TRIANGULAR +ENCOUNTER_CHECK TRIANGULAR +ENERGY_OUT 1pl_1pl_energy.dat +GMTINY 1e-26 diff --git a/examples/symba_swifter_comparison/1pl_1pl_collision/pl.swiftest.in b/examples/symba_swifter_comparison/1pl_1pl_collision/pl.swiftest.in new file mode 100644 index 000000000..07f149a7b --- /dev/null +++ b/examples/symba_swifter_comparison/1pl_1pl_collision/pl.swiftest.in @@ -0,0 +1,13 @@ +2 +Mercury 6.553709809565314146e-06 0.0014751274547839194341 +1.6306381826061645943e-05 +0.38710350131956905 0.20558985105084426 7.0037441475892 +48.302109425370055 29.181335754822598 286.2251596331737 +0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 +0.0 0.0 0.0 +Planet 6.553709809565314146e-26 3.1781030349897803e-10 +1.6306381826061643e-65 +0.38710350131956905 0.20558985105084426 7.0037441475892 +48.302119425370055 29.181335754822598 286.2251596331737 +0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 +0.0 0.0 0.0 diff --git a/examples/symba_swifter_comparison/1pl_1pl_collision/sun_MsunAUYR.in b/examples/symba_swifter_comparison/1pl_1pl_collision/sun_MsunAUYR.in new file mode 100644 index 000000000..b2cb85c35 --- /dev/null +++ b/examples/symba_swifter_comparison/1pl_1pl_collision/sun_MsunAUYR.in @@ -0,0 +1,7 @@ +Sun +39.476926408897626 +0.004650467260962157 +4.7535806948127355e-12 +-2.2473967953572827e-18 +0.0 0.0 0.07 +11.209306302144773 -38.759372036774764 82.25088158389266 diff --git a/examples/symba_swifter_comparison/1pl_1pl_collision/tp.swiftest.in b/examples/symba_swifter_comparison/1pl_1pl_collision/tp.swiftest.in new file mode 100644 index 000000000..573541ac9 --- /dev/null +++ b/examples/symba_swifter_comparison/1pl_1pl_collision/tp.swiftest.in @@ -0,0 +1 @@ +0 diff --git a/examples/symba_swifter_comparison/1pl_1tp_collision/param.swiftest.in b/examples/symba_swifter_comparison/1pl_1tp_collision/param.swiftest.in new file mode 100644 index 000000000..a1e9e3d0a --- /dev/null +++ b/examples/symba_swifter_comparison/1pl_1tp_collision/param.swiftest.in @@ -0,0 +1,38 @@ +! VERSION Swiftest parameter input +T0 0.0 +TSTOP 1.0 +DT 0.005 +ISTEP_OUT 1 +ISTEP_DUMP 1 +OUT_FORM XVEL +OUT_TYPE NETCDF_DOUBLE +OUT_STAT REPLACE +IN_TYPE ASCII +PL_IN pl.swiftest.in +TP_IN tp.swiftest.in +CB_IN sun_MsunAUYR.in +BIN_OUT 1pl_1tp_enc.nc +CHK_QMIN -1.0 +CHK_RMIN -1.0 +CHK_RMAX 1000.0 +CHK_EJECT 1000.0 +CHK_QMIN_COORD HELIO +CHK_QMIN_RANGE -1.0 -1.0 +MU2KG 1.988409870698051e+30 +TU2S 31557600.0 +DU2M 149597870700.0 +IN_FORM EL +EXTRA_FORCE NO +PARTICLE_OUT 1pl_1tp_particle.dat +BIG_DISCARD NO +CHK_CLOSE YES +RHILL_PRESENT YES +FRAGMENTATION NO +ROTATION YES +TIDES NO +ENERGY YES +GR YES +INTERACTION_LOOPS TRIANGULAR +ENCOUNTER_CHECK TRIANGULAR +ENERGY_OUT 1pl_1tp_energy.dat +GMTINY 3.6460981419534435e-08 diff --git a/examples/symba_swifter_comparison/1pl_1tp_collision/pl.swiftest.in b/examples/symba_swifter_comparison/1pl_1tp_collision/pl.swiftest.in new file mode 100644 index 000000000..08e5b2d23 --- /dev/null +++ b/examples/symba_swifter_comparison/1pl_1tp_collision/pl.swiftest.in @@ -0,0 +1,7 @@ +1 +Mercury 6.553709809565314146e-06 0.0014751274547839194341 +1.6306381826061645943e-05 +0.38710350131956905 0.20558985105084426 7.0037441475892 +48.302109425370055 29.181335754822598 286.2251596331737 +0.4000000000000000222 0.4000000000000000222 0.4000000000000000222 +0.0 0.0 0.0 diff --git a/examples/symba_swifter_comparison/1pl_1tp_collision/sun_MsunAUYR.in b/examples/symba_swifter_comparison/1pl_1tp_collision/sun_MsunAUYR.in new file mode 100644 index 000000000..b2cb85c35 --- /dev/null +++ b/examples/symba_swifter_comparison/1pl_1tp_collision/sun_MsunAUYR.in @@ -0,0 +1,7 @@ +Sun +39.476926408897626 +0.004650467260962157 +4.7535806948127355e-12 +-2.2473967953572827e-18 +0.0 0.0 0.07 +11.209306302144773 -38.759372036774764 82.25088158389266 diff --git a/examples/symba_swifter_comparison/1pl_1tp_collision/tp.swiftest.in b/examples/symba_swifter_comparison/1pl_1tp_collision/tp.swiftest.in new file mode 100644 index 000000000..2d110f0b6 --- /dev/null +++ b/examples/symba_swifter_comparison/1pl_1tp_collision/tp.swiftest.in @@ -0,0 +1,4 @@ +1 +Test_Particle +0.38710350131956905 0.20558985105084426 7.0037441475892 +48.402109425370054 29.181335754822598 286.2251596331737 diff --git a/examples/symba_swifter_comparison/8pl/cb.in b/examples/symba_swifter_comparison/8pl/cb.in new file mode 100644 index 000000000..e3318aec0 --- /dev/null +++ b/examples/symba_swifter_comparison/8pl/cb.in @@ -0,0 +1,5 @@ +Sun +0.00029591220819207774 +0.004650467260962157 +0.0 +0.0 diff --git a/examples/symba_swifter_comparison/8pl/cb.swiftest.in b/examples/symba_swifter_comparison/8pl/cb.swiftest.in new file mode 100644 index 000000000..e3318aec0 --- /dev/null +++ b/examples/symba_swifter_comparison/8pl/cb.swiftest.in @@ -0,0 +1,5 @@ +Sun +0.00029591220819207774 +0.004650467260962157 +0.0 +0.0 diff --git a/examples/symba_swifter_comparison/8pl/init_cond.py b/examples/symba_swifter_comparison/8pl/init_cond.py new file mode 100755 index 000000000..23b65080f --- /dev/null +++ b/examples/symba_swifter_comparison/8pl/init_cond.py @@ -0,0 +1,145 @@ +#!/usr/bin/env python3 +import numpy as np +import swiftest +import swiftest.io as swio +import astropy.constants as const +import sys +import xarray as xr + +# Both codes use the same tp input file +tpin = "tp.in" + +swifter_input = "param.swifter.in" +swifter_pl = "pl.swifter.in" +swifter_tp = "tp.swifter.in" +swifter_bin = "bin.swifter.dat" +swifter_enc = "enc.swifter.dat" + +swiftest_input = "param.swiftest.in" +swiftest_pl = "pl.swiftest.in" +swiftest_tp = "tp.swiftest.in" +swiftest_cb = "cb.swiftest.in" +swiftest_bin = "bin.swiftest.nc" +swiftest_enc = "enc.swiftest.dat" +swiftest_dis = "discard.swiftest.dat" + +sim = swiftest.Simulation() + +sim.param['T0'] = 0.0 +sim.param['DT'] = 1.0 +sim.param['TSTOP'] = 365.25e1 +sim.param['ISTEP_OUT'] = 10 +sim.param['ISTEP_DUMP'] = 10 +sim.param['CHK_QMIN_COORD'] = "HELIO" +sim.param['CHK_QMIN'] = swiftest.RSun / swiftest.AU2M +sim.param['CHK_QMIN_RANGE'] = f"{swiftest.RSun / swiftest.AU2M} 1000.0" +sim.param['CHK_RMIN'] = swiftest.RSun / swiftest.AU2M +sim.param['CHK_RMAX'] = 1000.0 +sim.param['CHK_EJECT'] = 1000.0 +sim.param['OUT_STAT'] = "UNKNOWN" +sim.param['GR'] = 'NO' +sim.param['CHK_CLOSE'] = 'YES' +sim.param['RHILL_PRESENT'] = 'YES' +sim.param['GMTINY'] = 1.0e-12 +sim.param['IN_FORM'] = 'XV' + +sim.param['MU2KG'] = swiftest.MSun +sim.param['TU2S'] = swiftest.JD2S +sim.param['DU2M'] = swiftest.AU2M + +bodyid = { + "Sun": 0, + "Mercury": 1, + "Venus": 2, + "Earth": 3, + "Mars": 4, + "Jupiter": 5, + "Saturn": 6, + "Uranus": 7, + "Neptune": 8, +} + +for name, id in bodyid.items(): + sim.add(name, idval=id) + +ds = sim.ds +cb = ds.sel(id=0) +pl = ds.where(ds.id > 0, drop=True) +npl = pl.id.size + +ntp = 16 +dims = ['time', 'id', 'vec'] +tp = [] +t = np.array([0.0]) +sim.param['OUT_FORM'] = "XV" +clab, plab, tlab = swio.make_swiftest_labels(sim.param) + +# For each planet, we will initialize a pair of test particles. One on its way in, and one on its way out. We will also initialize two additional particles that don't encounter anything +tpidlist = np.arange(9,9+ntp) +tpnames = [] +for i in tpidlist: + tpnames.append(f"SmallBody{i+1:0.4g}") +tpxv1 = np.empty((6)) +tpxv2 = np.empty((6)) + +p1 = [] +p2 = [] +p3 = [] +p4 = [] +p5 = [] +p6 = [] + +for i in pl.id: + pli = pl.sel(id=i) + rstart = 2 * np.double(pli['radius']) # Start the test particles at a multiple of the planet radius away + vstart = 1.5 * np.sqrt(2 * np.double(pli['Gmass']) / rstart) # Start the test particle velocities at a multiple of the escape speed + xvstart = np.array([rstart / np.sqrt(2.0), rstart / np.sqrt(2.0), 0.0, vstart, 0.0, 0.0]) + # The positions and velocities of each pair of test particles will be in reference to a planet + plvec = np.array([np.double(pli['xhx']), + np.double(pli['xhy']), + np.double(pli['xhz']), + np.double(pli['vhx']), + np.double(pli['vhy']), + np.double(pli['vhz'])]) + tpxv1 = plvec + xvstart + tpxv2 = plvec - xvstart + p1.append(tpxv1[0]) + p1.append(tpxv2[0]) + p2.append(tpxv1[1]) + p2.append(tpxv2[1]) + p3.append(tpxv1[2]) + p3.append(tpxv2[2]) + p4.append(tpxv1[3]) + p4.append(tpxv2[3]) + p5.append(tpxv1[4]) + p5.append(tpxv2[4]) + p6.append(tpxv1[5]) + p6.append(tpxv2[5]) + + +tvec = np.vstack([p1, p2, p3, p4, p5, p6]) +tpframe = np.expand_dims(tvec.T, axis=0) +tpxr = xr.DataArray(tpframe, dims = dims, coords = {'time' : t, 'id' : tpidlist, 'vec' : tlab}) +tpxr = tpxr.assign_coords(name=('id', tpnames)) + +tp = [tpxr] +tpda = xr.concat(tp,dim='time') +tpds = tpda.to_dataset(dim = 'vec') + +sim.ds = xr.combine_by_coords([sim.ds, tpds]) +swio.swiftest_xr2infile(sim.ds, sim.param) + +sim.param['PL_IN'] = swiftest_pl +sim.param['TP_IN'] = swiftest_tp +sim.param['CB_IN'] = swiftest_cb +sim.param['BIN_OUT'] = swiftest_bin +sim.param['ENC_OUT'] = swiftest_enc +sim.param['DISCARD_OUT'] = swiftest_dis +sim.save(swiftest_input) + +sim.param['PL_IN'] = swifter_pl +sim.param['TP_IN'] = swifter_tp +sim.param['BIN_OUT'] = swifter_bin +sim.param['ENC_OUT'] = swifter_enc +sim.param['OUT_TYPE'] = "REAL8" +sim.save(swifter_input, codename="Swifter") diff --git a/examples/symba_swifter_comparison/8pl/param.swifter.in b/examples/symba_swifter_comparison/8pl/param.swifter.in new file mode 100644 index 000000000..177630caf --- /dev/null +++ b/examples/symba_swifter_comparison/8pl/param.swifter.in @@ -0,0 +1,26 @@ +! VERSION Swifter parameter file converted from Swiftest +T0 0.0 +TSTOP 365 +DT 1.0 +ISTEP_OUT 1 +ISTEP_DUMP 1 +OUT_FORM XV +OUT_TYPE REAL8 +OUT_STAT UNKNOWN +IN_TYPE ASCII +PL_IN pl.swifter.in +TP_IN tp.swifter.in +BIN_OUT bin.swifter.dat +CHK_QMIN 0.004650467260962157 +CHK_RMIN 0.004650467260962157 +CHK_RMAX 1000.0 +CHK_EJECT 1000.0 +CHK_QMIN_COORD HELIO +CHK_QMIN_RANGE 0.004650467260962157 1000.0 +ENC_OUT enc.swifter.dat +EXTRA_FORCE NO +BIG_DISCARD NO +CHK_CLOSE YES +RHILL_PRESENT YES +J2 4.7535806948127355e-12 +J4 -2.2473967953572827e-18 diff --git a/examples/symba_swifter_comparison/8pl/param.swiftest.in b/examples/symba_swifter_comparison/8pl/param.swiftest.in new file mode 100644 index 000000000..7f4d21c9b --- /dev/null +++ b/examples/symba_swifter_comparison/8pl/param.swiftest.in @@ -0,0 +1,38 @@ +! VERSION Swiftest parameter input +T0 0.0 +TSTOP 365 +DT 1.0 +ISTEP_OUT 1 +ISTEP_DUMP 100 +OUT_FORM XV +OUT_TYPE NETCDF_DOUBLE +OUT_STAT UNKNOWN +IN_TYPE ASCII +PL_IN pl.swiftest.in +TP_IN tp.swiftest.in +CB_IN cb.swiftest.in +BIN_OUT bin.swiftest.nc +CHK_QMIN 0.004650467260962157 +CHK_RMIN 0.004650467260962157 +CHK_RMAX 1000.0 +CHK_EJECT 1000.0 +CHK_QMIN_COORD HELIO +CHK_QMIN_RANGE 0.004650467260962157 1000.0 +MU2KG 1.988409870698051e+30 +TU2S 86400 +DU2M 149597870700.0 +IN_FORM XV +ENC_OUT enc.swiftest.dat +EXTRA_FORCE NO +DISCARD_OUT discard.swiftest.dat +BIG_DISCARD NO +CHK_CLOSE YES +RHILL_PRESENT YES +FRAGMENTATION NO +ROTATION NO +TIDES NO +ENERGY NO +GR YES +GMTINY 1e-12 +ENCOUNTER_CHECK TRIANGULAR +INTERACTION_LOOPS TRIANGULAR diff --git a/examples/symba_swifter_comparison/8pl/pl.in b/examples/symba_swifter_comparison/8pl/pl.in new file mode 100644 index 000000000..574290966 --- /dev/null +++ b/examples/symba_swifter_comparison/8pl/pl.in @@ -0,0 +1,33 @@ +8 +Mercury 4.9125474498983623693e-11 0.0014751322421091943544 +1.6306381826061645943e-05 +0.2386666776623860009 -0.35641151623302969043 -0.05101731016108843747 +0.017764175111075249797 0.017029962919661641163 -0.00023782836795535061019 +Venus 7.243452483873646905e-10 0.0067590994376241490576 +4.0453784346544178454e-05 +0.2990753407779592199 -0.6632100042621156266 -0.026360212624545961008 +0.018302016936885410342 0.008245710698089018728 -0.00094295400489744841174 +Earth 8.9970113821660187435e-10 0.010044890881522152024 +4.25875607065040958e-05 +1.0036256535410339463 -0.01896165200005213089 -2.8417417483764697977e-06 +4.5405883021213687997e-05 0.017136881726258899883 -8.2401921935443904624e-07 +Mars 9.549535102761465607e-11 0.0072464600218361159065 +2.265740805092889601e-05 +-1.6269997788049339604 -0.21390234390978191126 0.03542716286161200212 +0.0023442654831218119778 -0.012678934386626589462 -0.00032322307543280830687 +Jupiter 2.825345908631354893e-07 0.35527050568877215555 +0.00046732617030490929307 +4.337786461883050393 -2.5177577989629078559 -0.08659310309181492138 +0.003701702275184468819 0.00688886526378316294 -0.000111430767468823893455 +Saturn 8.459715183006415395e-08 0.43766614553930262567 +0.00038925687730393611812 +6.5790524733447179884 -7.4503769195907869616 -0.13229534767175391008 +0.0038755970018745189258 0.0036872503470294919377 -0.00021829651897950920047 +Uranus 1.2920249163736673626e-08 0.4697430994852798912 +0.00016953449859497231466 +14.66889989083050061 13.203872414598899709 -0.14103421509241859111 +-0.0026568764662203521107 0.0027468710922308441774 4.4479242436019731115e-05 +Neptune 1.5243589003230834323e-08 0.7815248400937813483 +0.000164587904124493665 +29.589962576161859431 -4.4071843471850522533 -0.591227914742734173 +0.00044593775398081260874 0.0031315328653865699346 -7.4667609066900140504e-05 diff --git a/examples/symba_swifter_comparison/8pl/pl.swifter.in b/examples/symba_swifter_comparison/8pl/pl.swifter.in new file mode 100644 index 000000000..b4b8dfe4d --- /dev/null +++ b/examples/symba_swifter_comparison/8pl/pl.swifter.in @@ -0,0 +1,36 @@ +9 +0 0.00029591220819207774 +0.0 0.0 0.0 +0.0 0.0 0.0 +1 4.9125474498983623693e-11 0.0014751322421091943544 +1.6306381826061645943e-05 +0.2386666776623860009 -0.35641151623302969043 -0.05101731016108843747 +0.017764175111075249797 0.017029962919661641163 -0.00023782836795535061019 +2 7.243452483873646905e-10 0.0067590994376241490576 +4.0453784346544178454e-05 +0.2990753407779592199 -0.6632100042621156266 -0.026360212624545961008 +0.018302016936885410342 0.008245710698089018728 -0.00094295400489744841174 +3 8.9970113821660187435e-10 0.010044890881522152024 +4.25875607065040958e-05 +1.0036256535410339463 -0.01896165200005213089 -2.8417417483764697977e-06 +4.5405883021213687997e-05 0.017136881726258899883 -8.2401921935443904624e-07 +4 9.549535102761465607e-11 0.0072464600218361159065 +2.265740805092889601e-05 +-1.6269997788049339604 -0.21390234390978191126 0.03542716286161200212 +0.0023442654831218119778 -0.012678934386626589462 -0.00032322307543280830687 +5 2.825345908631354893e-07 0.35527050568877215555 +0.00046732617030490929307 +4.337786461883050393 -2.5177577989629078559 -0.08659310309181492138 +0.003701702275184468819 0.00688886526378316294 -0.000111430767468823893455 +6 8.459715183006415395e-08 0.43766614553930262567 +0.00038925687730393611812 +6.5790524733447179884 -7.4503769195907869616 -0.13229534767175391008 +0.0038755970018745189258 0.0036872503470294919377 -0.00021829651897950920047 +7 1.2920249163736673626e-08 0.4697430994852798912 +0.00016953449859497231466 +14.66889989083050061 13.203872414598899709 -0.14103421509241859111 +-0.0026568764662203521107 0.0027468710922308441774 4.4479242436019731115e-05 +8 1.5243589003230834323e-08 0.7815248400937813483 +0.000164587904124493665 +29.589962576161859431 -4.4071843471850522533 -0.591227914742734173 +0.00044593775398081260874 0.0031315328653865699346 -7.4667609066900140504e-05 diff --git a/examples/symba_swifter_comparison/8pl/pl.swiftest.in b/examples/symba_swifter_comparison/8pl/pl.swiftest.in new file mode 100644 index 000000000..574290966 --- /dev/null +++ b/examples/symba_swifter_comparison/8pl/pl.swiftest.in @@ -0,0 +1,33 @@ +8 +Mercury 4.9125474498983623693e-11 0.0014751322421091943544 +1.6306381826061645943e-05 +0.2386666776623860009 -0.35641151623302969043 -0.05101731016108843747 +0.017764175111075249797 0.017029962919661641163 -0.00023782836795535061019 +Venus 7.243452483873646905e-10 0.0067590994376241490576 +4.0453784346544178454e-05 +0.2990753407779592199 -0.6632100042621156266 -0.026360212624545961008 +0.018302016936885410342 0.008245710698089018728 -0.00094295400489744841174 +Earth 8.9970113821660187435e-10 0.010044890881522152024 +4.25875607065040958e-05 +1.0036256535410339463 -0.01896165200005213089 -2.8417417483764697977e-06 +4.5405883021213687997e-05 0.017136881726258899883 -8.2401921935443904624e-07 +Mars 9.549535102761465607e-11 0.0072464600218361159065 +2.265740805092889601e-05 +-1.6269997788049339604 -0.21390234390978191126 0.03542716286161200212 +0.0023442654831218119778 -0.012678934386626589462 -0.00032322307543280830687 +Jupiter 2.825345908631354893e-07 0.35527050568877215555 +0.00046732617030490929307 +4.337786461883050393 -2.5177577989629078559 -0.08659310309181492138 +0.003701702275184468819 0.00688886526378316294 -0.000111430767468823893455 +Saturn 8.459715183006415395e-08 0.43766614553930262567 +0.00038925687730393611812 +6.5790524733447179884 -7.4503769195907869616 -0.13229534767175391008 +0.0038755970018745189258 0.0036872503470294919377 -0.00021829651897950920047 +Uranus 1.2920249163736673626e-08 0.4697430994852798912 +0.00016953449859497231466 +14.66889989083050061 13.203872414598899709 -0.14103421509241859111 +-0.0026568764662203521107 0.0027468710922308441774 4.4479242436019731115e-05 +Neptune 1.5243589003230834323e-08 0.7815248400937813483 +0.000164587904124493665 +29.589962576161859431 -4.4071843471850522533 -0.591227914742734173 +0.00044593775398081260874 0.0031315328653865699346 -7.4667609066900140504e-05 diff --git a/examples/symba_swifter_comparison/8pl/swiftest_symba_vs_swifter_symba.ipynb b/examples/symba_swifter_comparison/8pl/swiftest_symba_vs_swifter_symba.ipynb new file mode 100644 index 000000000..92d5f3a5f --- /dev/null +++ b/examples/symba_swifter_comparison/8pl/swiftest_symba_vs_swifter_symba.ipynb @@ -0,0 +1,617 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "import swiftest\n", + "import numpy as np\n", + "import matplotlib.pyplot as plt" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Reading Swifter file param.swifter.in\n", + "Reading in time 3.650e+02\n", + "Creating Dataset\n", + "Successfully converted 366 output frames.\n", + "Swifter simulation data stored as xarray DataSet .ds\n" + ] + } + ], + "source": [ + "inparfile = 'param.swifter.in'\n", + "swiftersim = swiftest.Simulation(param_file=inparfile, codename=\"Swifter\")\n", + "swiftersim.bin2xr()\n", + "swifterdat = swiftersim.ds" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Reading Swiftest file param.swiftest.in\n", + "\n", + "Creating Dataset from NetCDF file\n", + "Successfully converted 366 output frames.\n", + "Swiftest simulation data stored as xarray DataSet .ds\n" + ] + } + ], + "source": [ + "inparfile = 'param.swiftest.in'\n", + "swiftestsim = swiftest.Simulation(param_file=inparfile)\n", + "swiftestsim.bin2xr()\n", + "swiftestdat = swiftestsim.ds" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [], + "source": [ + "swiftdiff = swiftestdat - swifterdat" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [], + "source": [ + "swiftdiff['rmag'] = np.sqrt(swiftdiff['xhx']**2 + swiftdiff['xhy']**2 + swiftdiff['xhz']**2)\n", + "swiftdiff['vmag'] = np.sqrt(swiftdiff['vhx']**2 + swiftdiff['vhy']**2 + swiftdiff['vhz']**2)" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [], + "source": [ + "plidx = swiftdiff.id.values[swiftdiff.id.values <= 8]\n", + "tpidx = swiftdiff.id.values[swiftdiff.id.values > 8]" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "
<xarray.DataArray 'xhx' (id: 16)>\n",
+       "array([0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.])\n",
+       "Coordinates:\n",
+       "  * id       (id) int64 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24\n",
+       "    time     float64 1.0
" + ], + "text/plain": [ + "\n", + "array([0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.])\n", + "Coordinates:\n", + " * id (id) int64 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24\n", + " time float64 1.0" + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "swiftdiff.sel(id=tpidx)['xhx'].isel(time=1)" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "fig, ax = plt.subplots()\n", + "swiftdiff['rmag'].sel(id=plidx).plot.line(ax=ax, x=\"time\")\n", + "ax.set_ylabel(\"$|\\mathbf{r}_{swiftest} - \\mathbf{r}_{swifter}|$\")\n", + "ax.set_title(\"Heliocentric position differences \\n Planets only\")\n", + "fig.savefig(\"symba_swifter_comparison-8pl-16tp-planets-rmag.png\", facecolor='white', transparent=False, dpi=300)" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "fig, ax = plt.subplots()\n", + "swiftdiff['vmag'].sel(id=plidx).plot.line(ax=ax, x=\"time\")\n", + "ax.set_ylabel(\"$|\\mathbf{v}_{swiftest} - \\mathbf{v}_{swifter}|$\")\n", + "ax.set_title(\"Heliocentric velocity differences \\n Planets only\")\n", + "fig.savefig(\"symba_swifter_comparison-8pl-16tp-planets-vmag.png\", facecolor='white', transparent=False, dpi=300)" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "No handles with labels found to put in legend.\n" + ] + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXwAAAElCAYAAADnZln1AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8QVMy6AAAACXBIWXMAAAsTAAALEwEAmpwYAABjv0lEQVR4nO3dd3xUVdrA8d+Zmt57h4TeEbsi6toruiiKde3Yu66uuvq66lrWXhAVC4JdEXtvKCpI7+m910mm3vP+cQcIIQlJmGRSzvfzCUzmtmdukmfunHvOc4SUEkVRFGXwM/g7AEVRFKVvqISvKIoyRKiEryiKMkSohK8oijJEqISvKIoyRKiEryiKMkSohD/ECCHuEUK84X2cJoRoEkIY/R1XZ4QQhwohNvs7DthzLH15ToUQ3wshLvY+niOE+LLVsoOFEFu9sZwqhIgXQvwohGgUQjza27Ep/ZNK+AOMECJPCPG3Ns9dIIT4ubv7klIWSClDpJQe30XYPUIIKYTI6mwdKeVPUspRfRVTZ9rG0vbn4a9zKqVcKKU8utVT9wJPe2P5ELgUqALCpJQ39mVsSv+hEr7SrwkhTP6OYYBKB9a3+X6D7MFIS/UzGDxUwh+EhBBJQoj3hBCVQohcIcQ1HayX4b3CNrXabokQokYIsU0IcUmrdY1CiH8KIbK9zQIrhBCp3mWjhRBfebfbLIQ4o9V2C4QQzwghPvFut1wIkeld9qN3tdXepoczhRAzhBBFQohbhRBlwCvbn2u1z1QhxPve11cthHi6g9d3jxDiXSHEW95jrxRCTGq1fIy3WaROCLFeCHFyq2XHCyE2eLcrFkLc5H1+RyxCiNeBNOBjb/y3dPOc3iOEeFsI8Zr3OOuFENM6+bkeJYTYJISo975m0WrZjk95QohsYHiruBYB5wO3eL//mxDCIIS4zfvzrPbGEdXm9+IiIUQB8K33+X8IITYKIWqFEF8IIdJbHV8KIS73NiPVen/mreO7xLtto/e8Tm11ftr9XRVC7CeE+FMI0SCEKBdCPNbRuVG6SEqpvgbQF5AH/K3NcxcAP3sfG4AVwF2ABf0PPwc4xrv8HuAN7+MMQAIm7/c/AM8CAcBkoBI40rvsZmAtMAo90UwCooFgoBC4EDABU9GbDsZ5t1sA1AD7eZcvBBa3il0CWa2+nwG4gYcAKxDofa7Iu9wIrAb+5z12AHBIB+fqHsAF/B0wAzcBud7HZmAb8E/veToCaARGebctBQ71Po4EpraKr6ijn0c3z+k9gB043vu6HgB+6+C1xAANrV7L9d7zdHHb34EO4loA/F+r768DfgNSvOf5BWBRm9fwmvccBwKnes/XGO/P8U5gWZuf41IgAv1NsBI41rtsFlAM7Iv+u5OF/oljT7+rvwLneh+HAAf4++9voH/5PQD11c0fmP6H3ATUtfpqZmfC3x8oaLPN7cAr3sf30E7CB1IBDxDaarsHgAXex5uBU9qJ50zgpzbPvQDc7X28AJjfatnxwKZW37eX8J1AQJvntif8A73JxNSFc3UPrRKoN8GUAod6v8oAQ6vli4B7vI8LgMvQ27xpL5ZWP492E34Xzuk9wNetlo0FWjp4Lee1eS0CKKLnCX8j3jce7/eJ6G+OplavYXir5Z8BF7U5l81Aequf4yGtlr8N3OZ9/AVwbTuvaU+/qz8C/wZi/P13N1i+VJPOwHSqlDJi+xcwt9WydCDJ20xRJ4SoQ7+Kjd/DPpOAGillY6vn8oFk7+NUILud7dKB/dscbw6Q0GqdslaPm9Gv1jpTKaW0d7AsFciXUrr3sI/tCrc/kFJq6EkyyftV6H1uu9av93T0N6d8IcQPQogDu3i81vZ0TmH3cxMg2m8zT2rzWmTr73sgHfig1c9sI/qbU+vfk8I26z/Rav0a9Dedzl7L9p9zZ787nf2uXgSMBDYJIf4QQpzY7Vep7ELdjBl8CoFcKeWIbm5XAkQJIUJbJag09I/i2/ebCaxr53g/SCmP6mnA7ejsxmIhkCaEMHUx6adufyCEMKA3YZRsXyaEMLRK+mnAFgAp5R/AKUIIM3AV+hXrjn11MdY9ndPuKG3zWkQH8XRVIfAPKeUvbRcIITK8D2Wb9e+XUi7s4bEyO3i+w99VKeVW4Czvz+004F0hRLSU0taDGBTUTdvB6HegwXvTM1DoN1vHCyH27WwjKWUhsAx4QAgRIISYiH6Ftf0PfD5wnxBihNBNFEJEo7fbjhRCnCuEMHu/9hVCjOlivOXobbfdeX2lwINCiGBvrAd3sv4+QojTvFfN1wEO9Lbr5YAN/UamWQgxAzgJWCyEsAi9X3u4lNKF3nbeUTfLDuPvwjntjk+Aca1eyzXs+imqu54H7t9+41UIESuEOGUP698uhBjnXT9cCDGri8eaD9wkhNjH+7uT5T1up7+rQohzhBCx3jfkOu++/NaFeDBQCX+QkXr/75PQbxDmot9AnQ+Ed2Hzs9Dbb0uAD9Db4b/yLnsM/Sr3S/QE+BIQ6L1yPRqY7d2ujJ03XLviHuBV70f6M/a0cqvXl4Xezl6Efh+hIx95l9cC5wKnSSldUkoncDJwHPo5ehY4T0q5ybvduUCeEKIBuBw4p4P9PwDc6Y3/pnaWd3ZOu0xKWYV+8/NBoBoYAex2dd4NTwBLgC+FEI3ob4L7d3L8D9B/rou952Qd+rnrSuzvAPcDb6LfGP8QiOrC7+qxwHohRJM33tmdNPUpXSC8N0cUZdARQtyDfkO4o2StKEOKusJXFEUZIlTCVxRFGSJUk46iKMoQoa7wFUVRhgiV8BWlB0SbcsSdrLejHHV/IPTaRv/n7zgU/1AJX+l1YmeN+O1fUghha/X9oT3Y525lotssnyGE0Lz7bxR6UbcLexj/LgXRoN1yxIrS76mRtkqvk1IW0KqcghBCApOklNt6+dAlUsoU76jUU9BHai6XUm7o6g46KHOgKAOSusJX/EoIYRVCPCKEKBB6CdznhRCB3mUxQoil3kFNNUKIn4Re1ne3ssSdHUPqPkQffDVWCHGCEOIvoZfdLfT2198eT3ulgbeXca7zHu9A0WbSGSHEOLGzRHS5EOKfHbzeA4QQy7yvabV3hO/2ZRcIIXK8n0hyhRBzOjlnjwshSrxfjwshrN5l28tL3yiEqBBClHb0yUYIsU4IcVKr781CiCohxOTOzqcycKmEr/jbQ+gFsiajj55NRi+XC3Aj+kjaWPSCWv9Ez9/noo+yPUnqMzr9t7MDeN8kZqKX7l2LXlLhPO/3JwBXCCFObbPZYeilgI8Bpnufi/Ae79c2+w8FvgY+Ry9ylgV8004cyeglEv4PiEIv1/yet6xBMPAkcJyUMhQ4CFjVwUu6AzgA/ZxNQi89fWer5Qnoo1WT0Us5PCOEiGxnP6+x6wji44FSKWVHx1UGuH6f8IUQL3uvVNoW7erp/j73Xl0t7WD5U96h3Eov8za1XAJcL6XcXlXyP+hlGkAv15uIXoLXJfXpBbvTjzhJ6BUYq4C70Wurb5ZSfi+lXCul1KSUa9DLIh/WZtt7pJQ2KWVLF45zIlAmpXxUSmmXUjZKKZe3s945wKdSyk+9x/4K+BM90QJowHghRKCUslRKub6dfYBejfReKWWFlLISvYTwua2Wu7zLXVLKT9HLabc3ReQbwPFCiDDv9+cCr3fh9SoDVL9P+Oh1vI/14f4eZtc/jh2EPttQhA+PpXQuFggCVoid5XE/9z4P+s9qG3q9lxwhxG3d3H+Jt4R0lJRyspRyMYAQYn8hxHdCn2WpHr1WTkybbbtTerij8r9tpQOzxK7lgA8BEr0VIM/0xlIq9BnCRnewnyT0Msvb5Xuf2666TSXRdktSSylL0OvxnC6EiECvjdOTwm7KANHvE76U8kf02ts7CCEyvVfqK7ztuh39YbS3v2/QCzjtQghhRE8wnbYHKz5VBbSgz461vb5/uJQyBMB7pXyjlHI4epGtG4QQR3q33ZsRg2+iFw5LlVKGo1eCFG3WkR08bk9H5X/bW+/11nMZSCmDpZQPAkgpv/CWmU4ENgEvdrCfEvQ3j+3S2FnyubteRf/kMQv4VUrZk9LNygDR7xN+B+YBV0sp90FvB33WB/u8ClgipSz1wb6ULvCWvX0R+J8QIg70dm4hxDHexycKvZSuYGeJ4u3lcbtbVrm1UPSJSexCiP2As/ewfiV6c0tHx1sKJAghrvPeUA0VQrRXefIN4CQhxDFCLwUc4L3JmiKEiBdCnOxty3egN8N0VAp4EXqFzlghRAz6PY+e9vX/EH1aymvR2/SVQWzAJXwhRAj6Da13hBCr0KfTS/QuO83b86Dt1xd72GcS+hXOU70cvrK7W9GbbX4Tetndr9nZ3jzC+30T+vymz0opv/cu21NZ4s7MBe4Velngu9DLPndIStmMXt73F+/xDmizvBE4Cv1TSBmwFTi8nf0UoncP/Sf6m0gh+lzBBu/XjehX6jXo9xTmtt2H1/+ht/2vQb8JvdL7XLd571G8BwwD3u/JPpSBY0DU0hH6DDxLpZTjvTeYNkspE/difzOAm6SUJ3q/PwG9vvv2WttpQI6UMmtv4laUgUAIcRcwUpWRHvwG3BW+lLIByBXe2XaEbtJe7vMTKWWClDJDSpkBNKtkrwwFQogo9K6b8/wdi9L7+n3CF0IsQv84P8o7oOQi9G5pFwkhVgPr0T8md3V/PwHvAEd693dMb8StKP2dEOIS9Galz7ydI5RBbkA06SiKoih7r99f4SuKoii+0a8LQ8XExMiMjAx/h6EoijJgrFixokpKGdvesn6d8DMyMvjzzz/9HYaiKMqAIYTI72iZatJRFEUZIlTCVxRFGSJUwlcURRkiVMJXFEUZIlTCVxRFGSJUwlcURRkiVMJXFEUZIlTCVxRF6UdW1Nt4tqCiV/atEr6iKEo/8WVVPX9ftY3XS6qwuTua/6bnVMJXFEXpB94sqebCdbmMDA5gydQRBJuMPj9Gvy6toCiKMhS8W1bDDZsLOTwqlPnjMnol2YNK+IqiKH6V2+zgps2FHBQRwqsThmEx9F7Di2rSURRF8ROHpnHtpgLMQvDs2PReTfagrvAVRVH85p9bivi93sbzY9NJsJp7/XjqCl9RFMUP3iurYWFpDdekxXFqfGSfHFMlfEVRlD72eWU9128q5IDwYG4elthnx1UJX1EUpQ/NL6rkwnW5jA0J5JUJwzAbRJ8dWyV8RVGUPrK0oo47txZzTEwY70/JItLct7dR1U1bRVGUPvBeWQ3XbSpkalgQL4zLwNrLPXLao67wFUVRepGUkqfzy7lyYwH7hgezeFKmX5I9qCt8RVGUXiOl5F/biplfVMUpcRE8OSbNb8ke1BW+oihKr3kwt4z5RVVclhLLc2PT/ZrsQV3hK4qi9Io3Sqp5Ir+ccxKjuScrCSH6rjdOR9QVvqIoio99X9PArVv0YmgPjkzpF8keVMJXFEXxqfwWB5evz2dkUAAvjsvA1If97PdEJXxFURQfafFoXLwuDw3JKxOGEdJLZY57qs8TvhDCKIT4SwixtK+PrSiK0luklNy+pYi1TS08PSadjECrv0PajT+u8K8FNvrhuIqiKL3CIyW3bilicVkN16fHc3RMuL9DalefJnwhRApwAjC/L4+rKIrSW+wejUvW5fFaSTVXpcVxy7AEf4fUob7ulvk4cAsQ2tEKQohLgUsB0tLS+iYqRVGUHmhyezhvbS7L6pq4LyuZS1Jj/R1Sp/rsCl8IcSJQIaVc0dl6Usp5UsppUsppsbH9++QpijJ01bjc/H1VNsvrm3h2bHq/T/bQt1f4BwMnCyGOBwKAMCHEG1LKc/owBkVRlL1W7XRz2qpt5LU4eGX8sH7bZt9Wn13hSylvl1KmSCkzgNnAtyrZK4oy0Ng8Hs5Zk0N+i4OFE4cPmGQPqrSCoihKl7k0ySXr8ljd2MzL44dxSGSHtyP7Jb8kfCnl98D3/ji2oihKT0gpuWFzAd/WNPLIqFSOjR04V/bbqZG2iqIoe+DWJDduLuSdslpuzkjgnKRof4fUIyrhK4qidEJKyW1binizVB9UdUNGvL9D6jHVhq8oitIBh6Zxw6ZC3iuv5br0eG4dnujvkPaKSviKoijtqHW5uXBtLr/V27h9WCLXpMf5O6S9phK+oihKG5VOF7NWZZPT7OC5senMjI/0d0g+oRK+oihKK5VOF39flU2Bt5/9oVEDq+tlZ1TCVxRF8ap0ujj9r2wK7Q5enzh8wPWz3xOV8BVFUdDLJejJ3snCiZkcFBni75B8TnXLVBRlyGtye5izJocCu96MMxiTPagrfEVRhjiHpnHhulzWNjXzyvhhgzbZg0r4iqIMYS5Nctn6PH6qbeKpMWkDqhBaT6gmHUVRhiS3JrlyYz6fVzVw/4hkZiVE+TukXqcSvqIoQ44mJddtKmBJRR13ZSZxUUr/n7zEF1TCVxRlyLlzazHvltdy67AE5qYN/BG0XaUSvqIoQ8rSijpeLq7i0pRYrs/ovxOO9waV8BVFGTJ+rm3kyo35TA4N4s7MgV0IrSdUwlcUZUjIaXZw8bo8MgKtLJo0HIth6KW/ofeKFUUZcmpcbs5fm4NBwGsThhFpHpo90ofmq1YUZciodbk5Y1U2BXYniyZmkh5o9XdIfqOu8BVFGbRsbg9nrc5ha7OdBYN8FG1XqCt8RVEGJbcmuXR9Pmsam1kwYRiHR4f5OyS/UwlfUZRBR0rJrVsK+aamgf+OTBn0JRO6SjXpKIoy6Pwvv5yFpTVclx7Peckx/g6n31AJX1GUQeWV4ir+m1vGrIRIbh02tAZW7YlK+IqiDBpvldZw+5Yijo4O47FRaQgh/B1Sv6ISvqIog8InlXVcv6mA6ZEhzBuXgdmgkn1bKuErijLgbWhq4aoNBUwJC+KVCcMIMKrU1h51VhRFGdC22uycsSqbCLORl8cPI9ho9HdI/ZZK+IqiDFh5LQ5mrcpGCHhncibxVrO/Q+rXVD98RVEGpEK7k9P/2oZTarw3OYusoAB/h9TvqYSvKMqAU+pwMmvVNpo8Gu9MzmRMSKC/QxoQVMJXFGVAqXLqxdCqnG7enpTJxNAgf4c0YKiEryjKgNHo9nD2mmwK7U4WTcpkaniwv0MaUFTCVxRlQHBoGheuzWVDUwsLJgznwIihXfmyJ/aY8IUQaV3cV52UsmEv41EURdmNJiXXbCzg57omnhqTxt9U5cse6coV/quABDobtiaBBcBrHa0ghAgAfgSs3uO+K6W8u8uRKooyJEkp+dfWYj6qqOPO4YnMSojyd0gD1h4TvpTy8LbPCSESpJRl3TyWAzhCStkkhDADPwshPpNS/tbN/SiKMoQ8VVDBS8VVXJYSy5Vpcf4OZ0Dr6cCr87q7gdQ1eb81e79kD4+vKMoQ8GZJNf/JKeW0+EjuzkpSxdD2Uk8T/ilCiKuEEKO6s5EQwiiEWAVUAF9JKZe3s86lQog/hRB/VlZW9jA8RVEGui+q6rlpcyEzIkN5fHQqBpXs91pPE/5pwDZgphBiflc3klJ6pJSTgRRgPyHE+HbWmSelnCalnBYbG9vD8BRFGciW1TZx6fo8JoYG8dL4DCwGVQXGF3rULVNKWQ587v3qyfZ1QojvgWOBdT3Zh6Iog9PqxmbOX5tDWoCFhROHE2xSxdB8pUdvm0KIZ4QQC7yPj+7iNrFCiAjv40Dgb8CmnhxfUZTBabPNzlmrswk3G1k8KZNoixoq5Es9/ZzkBHK8j4/o4jaJwHdCiDXAH+ht+Et7eHxFUQaZ/BYHZ67KxiQE70zKIjnA4u+QBp2evn02A+He7pVdGpglpVwDTOnh8RRFGcT0YmjZODSN96dkMSzI6u+QfMZTX4/W1IQpyf+9jHqa8GuAFuAZ4BffhaMoylBT7S2GVu1y8+7krEFT+VI6nZQ/8gi1C98Ej4fAyZNJ/M9/sA4f5reYutWkI4SIEEK8Apzufeo1YJrPo1IUZUhocns4y1sM7fUJw5kSNjgqX0q3m6Krr6H2tdeJOP104m65BWdeHnl//zsNX3zpt7i6dYXv7V3zIJABVAETgfd7IS5FUQY5p6Zx0bo81je1sGD8MA6KHDzF0CqfepqmH34g/q5/EXX22QCEHX8cxdddT/GNN2IIeZ6Qgw/u87h6ctP2ImC4lHKFlPIVKeXHvg5KUZTBTZOSGzYV8kNtI4+OSuWomHB/h+Qzjq1bqX7pJcJnztyR7AHMCQmkzn8R67BhlNx8C+6qqj6PrScJvxa4XAjxuBDiQiGEuhGrKEq33J9Tyrvltdw2LIHZidH+DsdnpJSU3XsfhuBg4m6+abflxpAQkh97FK2xkYqHH+nz+Lqd8KWUDwCXAPcAucB0H8ekKMog9kJhBc8UVHBBcgzXpsf7Oxyfavr+e5r/+IO466/HFNV+VU/riBFEXXAB9R99RMvq1X0aX7cTvhDiXuAU4CigWEr5hM+jUhRlUFpUWs3d20o4MTac+0ck+72boq/VvrEQU3w8EX8/vdP1oi+7DFNsLGX3/wepaX0UXc+u8O8CngQagdOFEC/6PCpFUQadTyrruHGTXgztmbHpGAdZsnfk5mL75RciZ5+JMHXeH8YYEkzsjTdgX7OG+o+W9FGEPR9pexnwl5TyQSnlJb4MSFGUwefHmkauWJ/P1LAgXpqQgXUQFkOrW7wYzGYiZs3q0vrhJ59M4KRJVD72GJrd3svR6Xp61l8GrhBCPCyEmOzDeBRFGWRW1tu4YF0umUFW3pg4nGDj4CuGpjU3U/f+B4QdfTSmmJgubSMMBuJuuhF3ZSW1ixf3coS6nib8a9D78JvQm3cURVF2s8nWwtlrcog1m1g8KZMI8+Ashlb/8VK0xkYi55y955VbCdp3X4IOPIDqF+ejNTf3UnQ79TThZwMBwEdSStVLR1GU3RS0OJi9KgerQfD25EzirWZ/h9QrpJTUvvkm1tGjCZzS/V7qsVdfjae6mtpFi3ohul31NOGvB74FLhJC/OHDeBRFGQQqnS7OXJ1Ni6axeFIm6YGDpxhaWy0rV+LYvJnIOWf3qNdR0NSpBB9yCNXzX0Kz2Xohwp16mvBHAkZgHnCh78JRFGWga3B7OGt1DmUONwsnDh80xdA6UrvwTQxhYYSfeGKP9xF79VV4amupWfimDyPbXU8T/mjgL+Am4FLfhaMoykDW7NE4b00Om212XhqfwbTwYH+H1KtcFRU0fPklETNnYgjs+Rtb4KRJhBx2GDUvvYSnqcmHEe6qpwk/ArgVuAXom/5EiqL0ay5Ncun6PJbX23hqTBpHRIf5O6ReV//hR+B2E3nW7L3eV8xVV+Gpr9fLKfeSnib8e9Fv2G4G+m6YmKIo/ZImJddtKuDr6gYeHJnCqfGR/g6pTzR89hmBkydjycjY630FThhP8PRDqVmwoNd67HQp4QshjEKIUiHExQBSyiIp5dfex7f1SmSKogwIUkru2lbMe95iaOcnd60f+kDnyM3FsXEjYccd67N9xlxxBZ7aWmoXv+WzfbbWpYQvpfQA64DMXolCUZQB66mCCuYXVXFZSuygK4bWmcbPPwcg9FjfJfygKVP0fvkvv4zmcPhsv9t1ZxREEHCLEOIooMT7nJRSnuLzqBRFGRAWl1bzn5xSTouP5O4s/8/Z2pcaPv2MwH32wRzv2ze5uBtuxFNXi7D4fhL37iT8A73/T/V+AUjfhqMoykDxTXUDN24uZHpkCI+PTsUwhJK9ffMWHFu3En/nnT7fd+CE8T7f53bdSfj+m3lXUZR+ZWWDjYvX5TE2OJCXxg/DMgiLoXWm/v33wGwm7ITj/R1Kt3Q54Usp83szEEVRBoacZgfnrMkh1mJi4cThhJoGXzG0zmhOJ/UfLSH0yCMxRQ6s3khD621ZUZS9UuFwMXt1NgCLJg0nbpDWx+lM07ff4amrI+L0zic56Y8GZ+k6RVF8rsnt4Zw1OVQ63bw3JZPMoAB/h+QXde+9hykxkeCDDtzzyv1MT6Y4PKk3AlEUpf9yaZKL1+Wx3tbCvHHpTA0b3CUTOuIqLcX2889EzDwVMQDr+vekSed+n0ehKEq/JaXkhs0FfF/byMMjUzkqJtzfIflN/YcfgpSEz5zp71B6pCcJf+j0vVIUhYdyy3inrJabMxI4Oyna3+H4jZSS+iUfE7TvvlhSU3vtOG7NTXVLda/suycJX/W9V5Qh4rXiKh7PL+ecxGhuyBg6o2jbY1+/AWduLmEn9bwM8p54NA93/HwH5352LjaX72vjq146iqK068uqem7bUsSRUWE8ODJlSI2ibU/D0qV63/tjjumV/WtS465ld/Fp7qfMzJpJsNn390lUwlcUZTd/NTRz2fp8xocGMm9cOibD0E720uOh4ZNPCJk+HWO47+9haFLj37/+myXZS5g7aS6XTLzE58eAniX8cp9HoShKv5Hf4uDcNTnEWEy8MWE4wUNsYFV7mn//HXdlJeG90JwjpeT+3+7n/a3vc8mES7h80uU+P8Z23U74UsqjeiMQRVH8r8bl5uzVObil5M2JQ3NgVXvqP/wQQ2goITNm+HS/Ukoe+P0B3t7yNheOv5Crp1zdq01nqklHURQAWjwaF6zNpcjh5NUJwxgRPDQHVrWl2Ww0fPkVYcceiyHAd+dESsnDfz7Mok2LOG/seVw/9fpev0+iRtoqioImJVdtzOePehsvjMtg/4gQf4fUbzR8+RWypYXwmaf6dL9P/fUUr294nTlj5nDTtJv65KZ4jxK+EOIGKeVj3sejvFMd7mmbVOA1IAF9WsR5UsonenJ8RVF8655tJXxSWc89mUmcHBfh73D6lfoPP8SclkbglCl7tZ9yWzm/lPxCqCWUzTWbeXHti5w+4nRu3ffWPusB1a2EL4SIAP4HjBZC2IE1wEXAhV3Y3A3cKKVcKYQIBVYIIb6SUm7oZsyKovjQvMIK5hVVcklKDJelxvo7nH7FVVxM8/LlxFx91V4l5YrmCs797FxKbaU7njs241j+dcC/+rS7a7cSvpSyDrhQCHECUAYcDbzfxW1LgVLv40YhxEYgGVAJX1H8ZGlFHXdvK+GE2HDuyUoe8n3t26r/+GMAwk/p2cR+za5m5q+dzwfbPsDmsvHyMS8TYg7BrbkZGz0Wo6Fve0D1tA3/MOBJ4AAgEfi4OxsLITKAKcDydpZdClwKkJaW1sPwFEXZk+V1TVy5MZ9pYcE8PSYdo0r2u5CaRt0HHxA0bRqWlJRub9/obGTu13NZXbmayIBIHj3sUfZN2LcXIu26nvbSiQBuBW4B7N3ZUAgRArwHXCelbGi7XEo5T0o5TUo5LTZWfbxUlN6wsamFc9fmkGK1sGDCMAKNqsNeW82//44rv4CIM2Z1e9smZxOXf3U566rW8eiMR/nhzB84NOXQXoiye3p6hX8vMFpKuVkIoXV1IyGEGT3ZL5RSdqkpSFEU3ypocTB7dTbBRiOLJ2cSbVGd9dpT9/bbGMLDCe1GKYUN1Ruobqlm/tr5bKjewKMzHuWItCN6Mcru6dFPWkpZBBR5H9/WlW2E3jj4ErBxew8fRVH6VqXTxezVOdg1yYdTMkkNsPg7pH7JXV1Nw1dfE3X2WRis1i5tM2/NPJ766ykADMLAQ4c+1K+SPfS8W+YzQLCU8gIhxNFSyi+7sNnBwLnAWiHEKu9z/5RSftqTGBRF6Z5mj8Z5a3IpdTh5a1ImY0IC/R1Sv1X3/vvgchExq2vNOa+tf42n/nqKE4efyOzRs4kJjCE5JLmXo+y+nn6Wc7Kzps4RwB4TvpTyZ1QtfUXxC01KrtqQz6rGZl4ZP4z91MCqDkmXi9qFbxJ04AFYs7L2uP5H2z7i4T8f5qj0o/i/g/+vz3vedEdP79Q0A+HeNnnVlUZR+rl7s0v4tKqee7OSOTZ26M5Y1RWNX32Fu6yMqPPO2+O63xR8w93L7ubAxAN58NAH+3Wyh55f4dcALcAzwC++C0dRFF97pqCC5wsruSg5hkvUwKo9qnn1NczpaYQcdlin6/1e+js3/3Az46LH8fjhj2Mx9v/7IT0daTsKeAO9VMJFvg9LURRfeKW4ivuySzg1LoJ7R/S/NuX+pmXVKlpWryb+zjsRhl0bQFyai/VV6/nfiv+xsmIlAJnhmTxz5DMEmYP8EW63dXukrRDiQSADqAIm0sWRtoqi9K2PK+r455YijokJ4yk1sKpLal57HUNoKBFtCqXZXDau/vZq/ij7A6vRyoXjLiTUEsrMETOJCIjwS6w90ZMmnYuAXCnlF8AKH8ejKIoP/FbXxFXeUbTPj83APMRnrOoKV1kZDV98QdR552EI1qcXlFLyzpZ3+GjbR6yvXs9t+93GjNQZ/bIHTlf0JOHXApcLIUYBq4FVUsq/fBuWoig9tdlm5/y1uaQGWHh1ohpF21W1CxeClETOmbPjuedXP8+zq58l0hrJfQffx0mZJ/kxwr3X7YQvpXxACPENsAWYDEwHVMJXlH6g1OHk7NXZWA2CNycOJ8qsRtF2hdbcTO1bb8P0/ckPbibN4+DDrR/y7OpnOSXzFO47+L5BUViu278NQoh7ASOwCv3q/nsfx6QoSg80uD3MWZ1DndvDh1OySAvs2ghRBTa/OQ8aGvhXyu9sXnIaJmHCIz0clnIY9xx0z6BI9tCzK/y7hBB3offhP10IkSml7J0p1hVF6RKnpnHRuly2NNt5Y+JwJoQOjF4j/cGmyg2Uv/wijiQz/zjrAYTBwJbaLbg1N3Mnz8VkGDyfknr6Sl4GLgaCgWd9F46iKN2lScn1mwr5qbaJJ0anMSMqzN8hDRg/Fv3Ioheu45oaDev9tzE88wQAjht2nJ8j6x09TfjXoJdXMAFPoLfjK4riBw/llvFeeS23D0vkzMQof4fT72XXZfNd4XeU28p5e8vb/Pd3E4bkRIadcpa/Q+t1PU342cAI4CMp5fU+jEdRlG54p6yGJ/LLmZMYxTXpcf4Op9/bXLOZC7+4kEZnIwAnNGWSlr+Z2DtvQJgGT9NNR3r6CtcDhcBFQoiHpZT+ncZFUYag3+uauHFTIQdFhPDAyJRBc2OxN9Q76nn0z0f5vvB7gkxBLDphEVJKDLf/F3t4GRGnzfR3iH2ipx10M9HfLObRtQnMFUXxoYIWBxeuyyM5wMxL4zOwGFRf+47YXDbmfj2XpTlLGRk5knlHzyM9LJ3Eag3bt98ROedsDEH95yb3ivwaXvwxp1f23dMr/EIp5bdCiESgwpcBKYrSuUa3h/PW5uKWktcnDidS9bXfjUfz8OzqZ3l789s4PA6cHiePzXhslwlJal55BWG17jLQyp+anW4e/mIzC5blkRIZyJwD0gjy8WxkPd3bsUKILejVMvPRb+IqitLLpJRcu7GArc12Fk3MJCsowN8h9SsezcNrG17j87zP2VC9gcNTDycpJIlDkw/l4OSDd6znLCqi/sOPCD/9NEzR0X6MWLcsu4pb31tDYU0L5x2Yzi3HjvZ5soeeJ/wIdk5ifrHPolEUpVOvl1TzaVU9d2cmMT0q1N/h9Cua1Lhr2V0syV4CwOWTLufKyVe2u27lY4+ByUTMFVf0ZYi7sbs8PPjZJhYsyyMjOoi3Lj2A/Yf33huQLyYx9/gyIEVR2rfZZufubcXMiAzlMlXXfheLNy3mudXPUWOvYe7kuVwy4ZIOB0y1rFpFw6efETN3Lub4+D6OdKfVhXXc8PYqsittXHBQBrceO5pAS+9OoNKlhC+EMKJPWv4vKeX8nkxirihKzzk0jbkb8gg0GnhiTBoG1SMHgKqWKj7J+YRH/nyEfeL34Zop13DaiNM67LEkpaT8vw9jjIkh+qJ/9HG0OpdH4+lvt/H0d9uIC7XyxkX7c8iImD45dpcSvpTSI4RYh947R1GUPnZ/dinrm+y8NmEY8Vazv8Pxq0ZnI7+U/EKtvZbH/nwMu8fOjJQZPDbjMczGzs9N49df07JyJQn//veOEsh9aVtFI9e/tZq1xfWcNiWZu08eR3hg3/08u9OkEwTcIoQ4CijxPiellKf4PixFUbZ7Iq+ceUWV/CM5hqNjhu58tDaXjedWPce3hd9S2FgIQFZEFjdNu4n9EvbbY7KXTicVjzyCJSuTiNNP64uQd7Ho9wLuWbKeIIuR5+ZM5bgJiX0eQ3cS/oHe/6d6vwCkb8NRFKW1d8tqeCC3lL/HR3Jv1sCcdMMXbC4bl391OWur1pIZoU8rmBqaSkpIyh4T/Xa1b7+DK7+AlOef69NRtR5N8sCnG5n/cy7TR8byyKyJxIX6p3dVd171sF6LQlGU3eS3OLhlSxEHRgTzv9FpmIbgrFU19hpsTht3/HIH66rW8fBhD3NU+lHd3o+nqYmqZ54haP/99zg5uS853B5ueGs1n6wt5YKDMrjzhDGY/DghzR4TvhAizfuw3av5VsvrpJQNvgpMUYYyj7e/vRF4ekz6kJuiMLsum4+zP+aldS8BYBTGHid7gOqXXsJTW0vcTTf1WQmKumYnV7yxkl9zqrnj+DFcMn14nxy3M125wn8VPdl3dpYksAB4zQcxKcqQYd+8mfoPPsRVWop0uwmcOJGIM2bx35oWfqu38cToNJIDLP4Os89sqd3CJzmfsGD9AjSpcUzGMRycdDAjI0cyLmZcj/bpqqigZsGrhB1/HIETxvs44vatK67nyjdXUlpn539nTmLmlJQ+Oe6e7DHhSykP74tAFGUo0ex2Kp94kpoFCxBmM+bkZDAaaPrmG15ZtYEnz7iAOXHhnJEQ6e9Q+0RhQyEvrn2RL/K+oNndzIGJB3LjtBsZGTlyr6/Iq55+BulyEXvddb4Jdg8WLs/nzg/XER1sZdGlB7BPev/5GaoiHIrSxzxNTRRcdBH21WuImH0mcddfjzFc733zxdqNPF7Rwn7rV3HRPa9g+7/7CTn0ED9H3HuqWqq4Z9k9rCxfiVu6mRg7kfsOuo+E4ASfNL04cnKoe+89ImfPxpKWtucN9tL3myu4Z8l6po+I5cnZUwgP6l9daFXCV5Q+JDWN4htvxL5+A8lPPkHY0UfvWFZid3JNnZvRYUHM328cTV+EU3j55SQ/9hhhxxzdyV4HngZnA/f9eh+f532O1WjlqPSjuGj8RWRFZvnsGFJKyh96CIPVSszc3i+h8NGqYm58ezUj40P7ZbIHlfAVpU9VPfccth9+JOHuu3ZJ9g5N44oN+Tg1yfxxw4gLshKzeBEFF19C8Y03IsxPEnrE4Ghdnb92Pk+ufBKJ5MxRZzJzxEzGRfesfb4zjV98ge2HH4m77dZeL5D2yi+5/PvjDRwwPIp5500jLKD/JXtQCV9R+kzTTz9R9fQzhJ9yChGzZ+94XpOS6zYWsLzexvNj0xkWZAXAEBxM6rwXKPjHRRRfey0pzz5DyKGH+it8n3hxzYs8+deTHJV+FKdmncr0lN6ZHdXT0EDZ/fcTMHYsUeec0yvHAP1TxKNfbuHp77ZxzLh4npg9hQBz79bD2Rsq4StKH3AWFVNy081YR44k4Z67d7RPOzSN6zYW8EFFHXcMT+TU+F1v8BlDQ0mb/yL5F1xI0VVXk/rC8wQfcIA/XsJeWV+1nre3vM37W9/nxOEn8n8H/x9GQ+8lxvIHH8JTXUPqc8/32iArjya588O1LPq9kLP2S+X/Tp2AsZ93n1XT5ChKL5MuF8XXX4/UNFKeehJDYCCgX9nP3ZDPBxV1/HN4IleltT8nrTE8nLSXX8KSlkrhFXNpXrGiL8PfK8VNxdz5852c//n5LMlewimZp3Dfwff1arJv+uEH6t9/n+hLLiFwvO+bikAva3zlwpUs+r2Qqw7P4j8z+3+yB3WFryi9ruq557GvXUvyk0/s0lNkXmEln1TWc09mEpd3kOy3M0VGkvbKK+Sfex6Fl15G2ssvEThpUm+H3iMfbfuIT3I+weFxkNeQh91t5+Ckg7n7oLuJCojq1WN76usp/dddWEeMIObKub1yjEa7i0te+5Pfcmq468Sx/OOQgVOEQCV8RelFLWvWUPXCC4SfcsouN2nXNTbzn5xSjo0J63Jte1NMDGkL9KRfcPElpC14hcBxvXMF21VVLVU0OBr4z+//obixGImkuKmYjLAMYoNimRg7kbmT5jImekyfxFP+wIO4q6tJefZZDBbfD1irbHRwwSu/s7mskcfPnMypUwZWfSMhZf+tfzZt2jT5559/+jsMRekRzekk97TT0JpsDF/yEcawMACqnG5OWLEFu6bx7b6jie7mVHaukhLyzzkXzeEg463FWFL6dhSnlJK/Kv5i8ebFfJb7GQBBpiAOTzscgSAxOJErJl3R5aJmvtL47XcUzZ1LzNwriL3G97OuFtY0c85Ly6locPDcOVOZMarzT2X+IoRYIaWc1t4ydYWvKL2k+oV5OLdlk/rC8zuSfYtH44K1OZQ7Xbw/JavbyR7AnJRE6vwXyTvrbAovuZSMRW9ijIjwcfTtW1ayjI+2fcSnuZ8CcO7YcxkWPoxp8dMYFu6/pg1PXR2ld9+FddQoYi6/3Of7L6xpZva832hyuHnj4v371ejZ7uizhC+EeBk4EaiQUvZNQQtF8RP75i1UzZtH2Ekn7ajOqEnJtZsKWNHQzIvjMpga1vMJOKzDh5P6zNMUXPgPCq+8irSXX8Jgtfoq/N2sKF/B6xte55uCbzAKI+eMOYezx5xNamhqrx2zO8r+8x88tXWkzZuH8HFTTnFdC2fP/41Gu4s3LzmA8ckDd06CvuylswA4tg+Ppyh+IT0eSu+8E2NICPH/vH3H8w/mlLKkoo5/ZSZxYlzEXh8naNo0kh56kJYVKyi59Tak07nX+2zNrbnZWL2ROZ/O4eIvL+avir84bcRpLJ+znFv3u7XfJPv6jz6iYcnHxFx+OQFjfHuvoLS+hbPm/UZds4s3Lt5/QCd76MMrfCnlj0KIjL46nqL4S81rr2Nfu5akRx/BFKl/9P+8sp4nCyo4NymaK3w4AXnY8cfjKq+g4qGHKGxsJPW5Z3t0hatJjXpHPT8X/8wTK5+gzlGHw+MAIDYwltmjZnPZxMuICIjwWey+YPv9d0ru/BdB++9PzGWX+nTfK/JruOrNv2iyu3n94v2ZmBLh0/37Q79rwxdCXApcCpDWB8WOFMWX3FVVVD71FCEzZhB2/PEArG1s5uqN+UwMDeT/RiT7vB579IUXYAgJpuxfd1HyzztI+u9DCEPXP7yXNJVw5TdXsq1uGwDjo8dz/LDjCTIHEWIO4aj0o4gPjvdpzL7gqauj+JprsaSmkvLkEwiz724SL11Twg1vryYxPIBFlw7sZpzW+l3Cl1LOA+aB3kvHz+EoSrdUPP440ukk/rZbEUJQ5XRz/tpcwkxGXhk/DGs3EnF3RM6ahae2jsrHHsMQGkLCv/6lJ/3KLVC+FuqLwVYJRjOYAiBuLPV4+LBhM6/lf06L286N+9xIfHA8h6ceToDJP1PwdUflM8/iaWgg7dVXd1Qb3VtSSub/lMv9n25k34xI5p07jcjgwTMfQb9L+IoyUDV+9x31775H9MUXYcnIwCMlczfkUe1y8/HUEb0+kUn0JRejNdRTPf8lZN4KEqdVISrX71zBaAXpAc1NmdHIFQmxbLNYSHF7eM6YwkhPAKQfDb04CtZXHNnZ1L75JhFnzCJg1Eif7FNKyYOfb+KFH3I4YUIij54xqV/XxekJlfAVxQfcVVWU3nEn1tGjifH2AX8kt4wfa5t4bFQqE0ODejcAKRHZ3xAb+TVifANVv25Fqw4k6ZYHMIyYAeHJEKBfBdtaarjgo5nUuZt5MeM0Dmish+xv4IPL4OfH4ZRnIGWf3o13L2gtLZTcdjuGwECf9bfX6+KsY9HvBZxzQBr3njwegx9KJbgcHmrKmqipqmPMPuk+339fdstcBMwAYoQQRcDdUsqX+ur4itJbpJSU3nEnms1G8sP/xWCx8FVVPf/LL+esxCjOTurF0rxS6sn6+weh6A9EeCqx196IYS1UPPkiBc8vI/XpszF6k/3mms08+uejFDtqWHDsAvaJ9yZ2TYONH8GX/4JXjoXj/gvTLuy9uHtIejwU33wz9nXrSHn6KUxRe1+qobrJwS3vruGbTRXMnZHJzceM6pN5bzVNUpHXQO6aKspz6ympyqO5uRlHQBWa2c4t46/H6uOutn3ZS+esvjqWovSlurfeoumHH4i/4w6sI0aQ3+Lgqo0FjA8J5D8jenEUbFMFfHwdbP4EwlPhxMdh8hwwWYg+FOrjY7Dd/V9+P28mX99yGFXOWn4p+QWHx8G5Y8/dmewBDAYYNxOGHQbvXwJLrwNHIxzs+xGre6P8oYdo+vob4v/5T0KPPHKv97eyoJbLXl9BfbOLf588jvMPytj7IDtgq3dgq3NQW2ojf30NhRtqaLE5cFsbcEQV0GKug3AwGoxMP+hIzD68Cb2datJRlL1gW/475Q88SPAhhxA552zsHo2L1+UB8NL4DAKNvTTUZf0HsPQGcNrgqHth/yvAtPMewbKSZdzoeI7Jx0mu+biM0FeWsPLkdI5IPYJb9ruFmMCY9vcbFAVnvaUn/a/+BSYr7H9Z77yGbqp57TVqX3udqPPPI+q8c/dqX1JKFv9RyD1L1pMQHsBr/9iPMYlhPolTSklTrYOiTbVs+b0Mj1ujobIFW/3OcRKBoWYiR0hqG9bQ1NxAgDWAmcfNZPjw4VgsFp9f2W+nEr6i9JAjJ5eiK6/EnJqyoyvkHZsKWNvUwmsThpEe2At/tM018OlNsO49SJoCpz4PcaP1Ra5mauw1/FT8Ew/9/hDDI4Zz850LCQh6lWPeepuzRh9E3A03IIx7uBFpNMFpL4LHCZ/fBnFjYFjvTFTSVQ1ffUX5Aw8SetTfiLvllr3aV1WTgzs/WMfn68s4JCuGx2dPJiak85+VvclF3toqNE1SU2KjsdqOwSQwGg0IAW6XhtvpweX00FBpp7HGDkB4XCBBoRaSR0USlx5GaHQAgWFG1m77k2XLlhEREcGsE2YxbNgwgoJ6+T4PqniaovSIp6mJvDPOxFNXx7D33sWcmMii0mqu31TItenx3D480fcHLVoB75wPjWV4pt/M2tFH8vDK/1FuK6fB2UCLu2XHqgcnHcwjhz1CiCUE6fFQfv/91L65iOBDDyX5kYe71o3R0QgvHqG/yVz+E4Ql+f41dUHL6tXkn3c+1tGjSF+wYMd8At0lpeSjVSXcu3QDzS1urt0/gxmxEbgcbjSPxGQxYjLrCbyq2EZLoxODQVBX3kx5XgOaR8+VBpMgIi4IzSPxuDWklJgtRn17i4GgUAtJIyOJSw8lflgYUkpsNhtNTU3U19fz7bffUlFRwdSpUznmmGN8fjXfWfE0lfAVpZukplF01dU0/fgjaS+/RPB++7GusZkTV25l3/BgFk/KxOjDm35ujwv78hewf3svOeHx1Bx0Bc8UfEZeQx4JwQkckHgAoZZQogOiiQ6MJi4ojv0S9sNk2PUDfO3bb1N23/9hTkok9dlnsWZm7vnglVtg3mGQcSic/Rb0wc3M1pwFBeTNPgtDcDAZixd1e25aKSWN1XbWb6ri/W/zaK5sIdVoJswF0tNx7jOa9cTtdnkIDLWQMSGazKlxBIZasAaasATuuXGkqKiIpUuXUl5eTus8GxwczCmnnMLIkb7pTtqWSviK4kMVjz5K9Yvzib/jDqLOPYc6l5tj/tyCU0q+nDaSWItvbrZ5NA+P/P4Q725+CzvaLsuiAqK4YtIVHJNxDJEBXa/c2LxyJUVX6zdi019/Devw4Xve6Ndn4It/wukvwYS/d+s17A1nUTGFF1+Mp7aW9EWLsA7vvBqnx61RU2qjqrCJysJGqgobqSxswu3w7FhHBJtIzQgjJiWEqKQQYtNCCQq1IAzbm2U0PG6N8NhAjKbu33+RUlJdXc2qVav45ZdfCA0NZfLkyYSEhBASEkJoaChxcXG91kYPqjyyovhMzetvUP3ifCJmn0nkOXOQUnLNxgKKHU4+nDKix8m+qqWKz3I/4+Psj6l11AJgczbR6GripEYbo9IPwzj8CIZHZhIdEE1qaCpB5u63+QZNnUr666+Rf8655M0+i9QXnidoypTON9r/cv2ewWe3QNaRENj7pYGbV/5FwUUXgRCkzXuh3WTvtLsp3FBD3rpqKvMbqS2z7Wh2kUZBvRXycFEZpDFmdDRXnTqG5LiQDo/ZnRTs8Xhobm6mpaWF+vp66uvrqauro7i4mNzcXACmTJnCMcccQ0BA/xm1rK7wFaWLGr74kuLrriPkyCNIeeIJhNHIu2U1XLWxgHuzkrg0tfsTYrg0F4/9+RhvbHwDgMmxk8kIzwBbFZbcnziosY4jj30Cxp/u09fiLCqm4KJ/4KmrJ+ON17GOGNH5BqVr4IXpcMBcOPY/Po2lrfqPl1J2770YoyJJX7AAY3wC9RXN1JTYcLs0KgsbKdxQQ31FCx63hjXIRFxGGM5QEz9X1vNDZT0NRsmE1AhmjIpl1rRUkiN61u7fmtPpJDs7m6qqKn777TdsNtsuy4UQhIeHs88++5CVlUViYi/cx+kC1aSjKHup+Y8/KLjoYgLGjSPtlZcxBARQ43JzyPKNZARaWTp1BIYO2rellBQ1FVHZXElOfQ5Oj3PHVIA/Fv1IfkM+p484naPTj+bAxAMQy5/Xu0SGJcGsBZDcO6NenUVF5J11FsJgJGPRm5iT9nBT9qOrYPViuHI5RHeh/b+78djdFC35kaIn5+HJmojlyONxYCVvbTUtDTu7NAoDRGeG4woyUhlm4NOyGorq7LS4PEQGmbn8sExm75tGeFDPm9aklJSXl5OTk0NjYyONjY3k5+fT2NgIQEpKChMnTiQwMJCwsDAiIiIIDQ3FsL1Wkr0emirBGgqhfVt4TiV8RdkLjd9+S/F112NOSSF94Rs7Sh7fsKmAt8pq+GraKMaG7H4F2eRsYtGmRSzevJiK5ordlluNVibFTuLs0WdzZPqR+qjZL++EX5+G0SfqJQ4CI3r1tdk3byb/nHMxBAURfvLJhB59NIETOpifqLEcnpqqN+uc8Vq3juNscdPc4MTj0SgtbMTe6KK21k5tSRM1OQ0gBB67G9j5pikBaRI0RZqoCTXSYIWcuhbymu24vKsJAftlRDE2KYwpaZEcNSaeQEvX699IKSksLCQ7O5uamhoA3G43BQUFO67gzWYzwcHBxMTEcMABB5CcnExgRz2Fmir1QWublu58bvjhcMz9EN838w+rhK8oPWT77TcKL7sc68iRpM57YUeyX17XxCl/bWNuahx3ZSUhpWRZyTJ+Kv6J/IZ8/qr4C5tLTxiHJh/KjNQZJIUkkR6WTohZb0cOMYfsnPe1uQY+uUEfULXfZXDsg/ro1z7Qsm49Zffdi339BnC7CTvhBEIOm07Y8ccjTG1u831zH/z0KFy5HBkzkmanh/oWF3XNLqptDjaVNFBd3ERjjR1bi5ukBomp3oXV2X6eaRAapQYHI2sKGF6zFYe7gWfGHUNpQBAywEiI1USI1USgxYjFZCAtKogxiWHEhlgZER9CVlwIQT2YJhKgpaWFJUuWsHHjRoQQREREIIRACEFiYiKZmZkMHz6c8K5W4qwvggUnQGMZHHglxIyC+gJY9jQ4GmD6zTD9Fn2cQy9SCV9ReqDxhx8omnslMjWRVXedxiq3fjNOSvhMO5pmAjnFsJQJ0SNYVrKM5aXLCTQFkhCcwL7x+xIbFMuBSQcyKXZS5wdqqYNXT4SKTXD4P+GQ6/u8+yPoYwuqX3iBmoVvIpubsY4ZQ+ht/yQ7dhjrSxpYV1xPbVUpz1WezzfiQG5wXEaoC+I8BmI9gjiPgQSPgUC5M/YWg6Q62ECjVRAUaSUqxEJEXCAyyERsuIWEnz4jcvHLCKcDcdZ5hP7jIkLDQwi2GDH1wihlTdOoqqpixYoVrFmzBofDweGHH860adM6vmrvCkcTzP8bNBTDuR9ASqt821yj93JavQjSDoKzFvXqJzeV8BXF44bS1XpN+JBYCIrRywaExIMQuDwufi39lWZ3MyvLVhD2zrdM/6KUwhjJv88y0hIgSA5JxmQwUWseQ3bwHNKbPyCi5TdKbCVEWiO5bNJlnDHyjJ1X7V3RUgsLz4CSv+DsxZD1t947B11Qa3OyqqCW9Ys/ZOrHC4hsruPLtH35I340eSP2YXxICIfXLCewQVKoTQG3d0ODIDDGSkJGGFnjYwiPDQIBkQlBWAJ2v6KVHg9F115L09ffEHzQgcTf+a89drvcG3a7nR9++IHc3FzKysoAGD9+PAceeCDJycl7f4CProS/FurJPvPw9tdZ8zZ8OFcfGX3OB/rvYS9QCV8Zmlx2vbDY2vcg7yf9Y3UbnuA4Pk3M4llqKfLYsDoll38mOXiDxrZJMdiuO4ek1DHEBMYwNnosHik54o/NuDXJD/uNxigguy6bhOAEQiwdd/lrV0OJ3gRQVwizXoExJ/nohXdPcV0Lry3L46sN5eRU6c1QoQEmjkoK5pDVv2POq6IubDiNYelIobePRxkLSEzRSDj8OGJTQ4lICMLYhStyT0MDdW+/jW3ZMmzLfiXulluIuvCCXqtOWVVVxcqVK9mwYQP19fXExMSw7777kpaWRkJCgm8OkvcLLDgeDr4Ojvp35+tu+xoWnwPhKXD+kl4ZvawSvjJ01ObpbaYFv0JNDriaISwZRhylV4IMTwVbJdJWxfe1G3iy9Du2ac2Mcjq5ZmsTsT+GQL2B2Mv/QfQ1N+2WiN4pq+HqjQW8MC6dU+L2oj96cw28cpw+E9U570LaAXv3untgQ0kDD36+iR+3VBIk4cikKMYEBxLlAq1Sr+qIBINREB2uEbz1V8JKVhNen0NQmCR+YjkBN32ObV02zrw8hNmMMFsQJpM+3aAQetllqWFb/jvuqipcJSV4qqowRkURc+VcoubM2evXoWnaji+Px7PjcU5ODkuXLsXj8ZCWlsb06dMZ3pWBZt3hcendVR2NcOXvYOnC2Ij8X2HhLH2Oggs/0wvW+ZBK+MrgV5sPPz0Cq97U++0NOwwiM2DMiZAxfZcboB7NwyN/PsIbG98gPSydq0ddwqT311D75iKMQUaS960gOFnA9JvgoKv1ph/AqWkcsnwTYSYjX04b2WE3zD2yN8BrJ0P5BjjnPRh2qA9OQNeVlDbywnsbyd1WS5JmJMVgQth3juQ1W40kDA8jMSuCpKwI4oaFYbYY0ex2HNnZuIqKqXzkIZyFJTt3KoR+c6MDhuBgTAkJGMPCiL/zDgLH7V2PFSklLpeL5cuX89NPP+F0OttdLzU1lVmzZhEW5ptKmLtZPg8+uxnOXKj/rnVV7o/wxumQOElvBrKG+iwklfCVwaulFr69H7niFTQEq2JP5XXjaayqD0QCMSFWRsSFEBdlwxScTXSIgfe2vcvW2q3MGTOHy+qnUnX/A7jLyog480zibrgeo1and4/cuASiR8AJj8DwGSworuK2LUUsnDicI6N7mEDcDlj4d70ZYPZCGHWcL89G+4d0eijNrqe2rJkVy4qxFTYhEEgBUUnBJKSHEZUUTGRiMFGJwYREWBF7mO1Js9tpemg2ntxVmOc8S/DfjgNNQ7rdSJcL6XIB+mAkDAYMAQEIS8+meCwqKuKLL76grKxsx9V767w1atQokpOTMRqNGAwGDAYDRqORgIAAxowZg3FP1UF7ymmDJyZB7Gg4/+Pu32jfsATeuQBS94M574K1m02CHVAJXxl8pMT+5xvw1b8wO+tZ5D6cp92nUm0OIiPGSnR0GU3kUOL6DReNSOFECP133aLFMqvpCE5ZVQi//Ih1xAgS/v1vgqa2KTGw9Wu9FHFtLs0z7uJA8zFkBFr5cEpWz9qcNQ+8eyFs+AhmvgCTZvvgRLQ9hEZZTj25a6qpKmzE49Z2qSdTbdCoijRy1qmj2G9yAkbzXvSEKd8Azx0IM26HGbf56BXs1NTUxNdff82qVasICQlh/PjxGI3GXRJ7amoqw4b13s3eTv30GHzzb/jHl5C2f8/2se59eO9inyZ9VUtHGVQ2FJTjeP8qptR9yQptBPPD7kaOqmGE+Alb9W+UAWXeellTEqYwPmY8eAKIFvuRs7mSfRa+wpiihdiNZr7YfyZh557H37My2K31dcTfYO5v8PG1vLJtC+WZR/LC6OSeJXsp4dOb9WR/9P0+SfaNNXbW/VCMx6XRYnNSvLmO5noH0tvuHpMaitliIGx0OO+VVrPN7uDsw4fx8FEjsZp8cNUbPxZGnQC/Paf3O/dRs4TH4+H333/n+++/x+VycfDBBzN9+vReLTjWbS118MsTMOLonid7gPGn6f+/dzEsmg1z3gHz3peB6Ii6wlcGjHXF9bzy+W+cm387Ew3ZfB57IRunTOT78g/Ia8gjJSSFI9KOID0sndjAWKanTMdo0BObdLupe/99qp56Gk9DA4FXXsNPWQewZEs9v+fVYDQI/j41hRuOHkl82K7Frhpcbvb/eSWTa/5iUcMSvSmmu/2ov38Qvn8ADr5Wn6Gqh2z1Dgo31FC0uZbslRVobonJYsBoMZI8MoLw2EBiUkJJGxuFywD/+XQjC5cXMDw2mEdnTWJKmo8LnxWtgPlHwFH37XE6RCkla9eupaqqCoD8/Hzy8/M7XD8rK4tjjz2WmJgOZufyp2/vhx//C5f9qLfDd5PbbaO4ZBEet7ceT/l62PQxRGfB2JkYLaGkp13So9BUk44yoBXVNnPPkg3IzZ8yK/wVPg8180toCHZNbyceFz2O44cdz7ljz93l6ltKiX39Bpw52VQ99zzO3FwCJ08m/s47CRy/86ZhbpWNV5flsXB5PlLChJRwLjgog+MnJGI2Gngwp5TH88v5IjyfSUsvgpgR+sfv8C7035YSvr5bvxqcPEcvl9CNTwh1Fc2s+Dyfxmo7Lrubiny9lktAiJmUUZEceFomYdG7XxHmVtm4+NU/yKmycfEhw7jx6FEEmHupLfu1U6BiI1y7BswdV4b87bff+Pzzz3d8HxwczOTJkzG1Gc0rpSQ1NZWsrB42nfU2W5Xedp/1Nzjj1U5XldJDUfGbOB27ltaoq/+TurrfO9zOYo7m0EM7Xt4ZlfCVAaOyuZInVj7B0pyleKSn3XWiLeEckXE0CcEJRAZEMjNr5i6TfUgpsS1bRtUzz9KyciUAlsxM4m64npAjjugwiRRUN/PWnwV8vq6M7EobI+JCuHnmOC4pKOaE2AieHZsOOd/r/agDwvSkHz+24xejeWDp9bDyVZh2ERz/SLvlEjSPRvHmOrb8WU5zvROTxUDhxhqEELgcHowmQWxqKJomyZgYQ0xKCOnjozt8Hd9truC6xaswCHhmzlQOyuzlK+TcH+HVk/TXt59+Vbphw4Zdrt5dLhcrV65k9OjRnHHGGTuLjA1EX9wBvz0Lc5dDbPuTmDQ2rqe8/BNszdlUVX2NELu+2QphYeTIf5GcdOauG659Fz64DNIPgrPf6fQNtCMq4Sv93rcF3/Jj0Y98mvspbs3N8cNOZk2exrayWk4J+ItUdwEkTSZ+4hxOHnHabqNZpZTYfv6Z+o+W4MzPx752LaaEBKIvuZiAMWMJnDhh97owHdA0yZcbyrn34/UUZAYjYgL4ef/RpAd7//jK1sIbf6exJZDG6f8j4ZDDMLQddFSbr//hFvyKbdrtrHacTn2VHYNBEJceRurYSGrLmln5RT4NlS047R7MAUbCYgJxOTwkZoZjDTRhDjAyYUYKweF7br92ezQe+2oLz36fzeiEUF48bxqpUb0/TypSwoIToXITFWd/xW8r17Fy5UrMZvMuPWSSk5M588wzsfSwt46/aJqLwsJXcDqrwNkEK1/XP+V1MCpaIiktfRePx4YQFtJSLyQz80bcLhcuhx3N7UZKiZQaUpOw/bFE/3/jp4iCZUSe8wJ0Z9S2l0r4Sr8ipeTHoh95fvXz1DpqkVJSYishyBTEQUkH8beEf/CfjypxNFSwJPoZkhrX6G3EB129W3OIlJKm776j6ulnsG/YgDEyElN8PJGzZxN+2kwMe5Fc5uWWc1deKaYt9Uy0G7jjhDFMS45g1VcFOGpr2bK8DIcWSEZMMcddMpJ682iKV27Fk7uc3G2SFi0MQhKob7KgeSSRCUG4nR4aquw7jhGVFExiVgSpoyNJHx+NqRuVHlsrb7BzzaK/WJ5bw1n7pXL3SeN6rwmnjdWrV5O/cSVsWsoW83js0szw4cOZNWsWZrNvZv/yl8rKrygqeoOa2p8xGoPBbdfLdFiC9PEeHbBaE5k8aT4BASloHg9/Lv2AXxa/jpQ7xzsYMBIbkLLj6t8kzMQEJGHACBYDhz/R+T2RjqiEr/hdk7OJF9e+yNKcpbg8LmodtWSEZTAxdiIAKaEpXDTuIl7+pZD/fr6JA8LreNnyXwJspXDaCzBu5i7701paqP9oCbUL38CxdRvm1FRiLr+M8JNO6nF/b6lJhEEgNcm9327heUML41sEZ29xs76wDoNTI0GYsLol1kAT4dFWUkM2sWJj6m77CgtsIjYzHsxBBIVZmPS3VL2+DNBUa6dwYy0mi4HMqXEY9tDnvTMOt4d5P+Tw/A/ZaBLunzme06am9Hh/3VFaWsovv/zCunXrCAwMxORqItBdx+mzzyN+9L59EsN2Nls2RcVvIDtoBuwJTXNSWvouRmMwGelXkBF2DDw9DceEc1myPoSqgjykpiFbjQ3Qv/cgpUTTtB2D0YKMoUwZdSwRcQkIgxEBmGtMmOt3fVOWBglGkAGCtDt6NiBPJXzFrwobC7ng8wuoaK7giNQjiA6MZlTkKE4beRpmgxlNSjbWN/PQF5v5fnMF56XXckHtU/pI1hP+hyNhAuubWnBqEq2lBdvy5diW/UqFxcpv+x0MMTEYw8Jal1LfhVEIxgQHEmsxEW02kRRgJtlqIclqJtpiQgDrfyrhxw+3URNj5o80CytTzIypdDNngwurx9tkJDXybA5+MzoZMTGGG48exeiEULb8lE39ti1YHCUMzwLThBMJjIvf4+ClvVXRYOeyN1bwV0Edx4yL5/bjxpARE+yTfW/evJl1a9YC+huh1uLWC9RvJyCvrAC3x0NWxnBOPvIEjI5axBunQ1QmzHoJdvSQ0vDUOdAcbjwNTvBI/ZOa8H5gMwicVFPqWoiGfefPUaDf85ASbfu8tBKky4OwGDFsH0PgdlDrWY5bNGHULCD1RCtwA3ppB/14Bu//Rj02gwkM5p2fGttOai4gLHwC6Un/5ounn6axcCOay4HLFI7L6WTs9CMxms0IITAYDIhWXwaDQS+1bDBgsVuJ2xqHwbnr74OwGAk/cRjmBP1nJoTAnBiM6MFcurvsVyV8pTf9UfYHT/31FE7P7sPbJZLChkKEEDz7t2d3KxXc4tGYvXIby5uae3TsfcOCiDKbcDv1j8rOFjcN1S16cvL+fTkNUBwgsBnB04W/JaOEM4xBPHxoFqY2NxdtDjcLluXx/A/ZNDncnDQxiRuPHkl6tG8SbUekJsGzszngj7xabnhrFQEODw+OSWFEdDAt66txV+08j8JiwhQT0O0RoMXOSpbWL8MiTVhkx/c9rJg5zDWWCNn9124PKaAu7Wuk0F+TPTwbZ1AFJmcX+vK3U8bB4A4mce2lBDSm77qqwQ0GicnagiWoBE+zCel2gqtFXw6YogzY7RNwN+3+Wms8ZRQ3b8XmrGZUSDKGoDhEQDghkVEER+5eA8cQbKZ5RTnSteuk88ZwKzH/GIcpbtd7Kr3RC0klfKVbvqqqZ7PN3uk6sqmCX4t/Iq+lkhrNQYDRSkxgtH7F1EaQOYgpcVOIDdy9HOwHRdWsdzgIybdxU9xWYvKWIqNGou13OZXlGnX5NbiKi4hfv41AuxNzagoBo0ZiDA/HJAURmiB3TRWN1TvjDYsJICQyQB9+L/HeINNvxrYYodYCNWaotQhsJkBCZGIQ6WOiGRUSwNSwoD1ORl7f7GLeT9m8/HMeHk1y2WHDuWJGZo8n49hxXt2afjXt5citx5FTT/PqSmSr53cjwBQbROC46B1PaTYX7jpHl49t9zj5tW4t2c1FBJsDmb3vSQSYA/Qrz6RgROv7Cx6Jp8kJmjd/SO8HAE3qPVjKN+i1iCLSwWjAFGlFWIwYwyw4PKX8uWYWmqcFkykCkBgMAWSl3kZU2KF6Mtf0fWlODwiByVyD2PIZZH+LKFqGZrejWZL0onNJ+yDjJ6GZkxAh4RiCzUiXhjO/AZe3AJyr3IYjv4EW2YRbukDqTTEGTRJkiMKpNbGx/lvqHA4Ss0ZgNFsI8oQQZ0vCrOk3zIXBjjEmko4+SkqPhqfajnVEBJa0naU3hEkQPDUeYxduvPuCSvjKLvJaHDyWV4ZD2/1n3+zR+Kp69zLCvUV4JIduaOCYrU143ODGipQ7r6qNHgdCanolRoul3W6NoVEBTJiRjNFswGgyMGxSDKZevmHprrUj3Ro1TQ6e/yGHrzdVEBVs4fwD0zlufEK3Ju/w1DloWVuFdGvYN9eg2XZN7MJiwDosHJkawrsriiiqbWFsYhjTR4azvGAlziC5oxmgs7/nPf2t19TUUFtbS3p6OieffDKRkXsepFVZ+TVl5UvavCAnbPsWpFsvXBewa92hxoa1uNy1TNvnXYKDszo/QHU2LHsK/noDNJfeXJRxCIw+AYbP2FHYrj3Fmzfyx5J38bhcSCmpLszH5XAQnZqOwehtdjEYMRiNGJrKEPWFjDBtYWx4BYQmgcmKrMlHIxx77IUEnHE5xrjO56d119oxhu+5FlFvUgl/EHNoGrktXb+KA7htcxGrG5tJDmj/5ubBESFclmjiuVXP0OBqwCM1NI+L/Mp11LubGe4BguM4MPUwLt33JkRLDVRthaotyOwfqN2yhWZXMNWmCTRFHkq1Kxmn00BDdcuOmi7bGSSYNQ/DzL9hcAcjnQa0ojwMHjeBhhZGHTeB6PPOxRQd3W6sfUVzeHCV6aMiW9ZW0fRzsU/3L6xGDIEmTHFBBI6J2nERaQy1YB0dxfdbK7l7yXpK6uw8fuZkjhsXxxtvvIDZspSQ4D38DXex2UAA0dHRhHa5sqSkqupbzOYITKY223ic+pR/CIhI29GeD2AwBDAi63aiog5qf7f2Br0ExerFkP+z/qlx6nlwwFzqtVB+efsNnC0tgPR+itNf/y6PgdItmzCazYTHxoNBYLZYOPjM80gaObrjl5T9HRT9qZfWdjTonyCyjtInLRkgVMIfpByaxgkrtrKuqaXb2z4wIpnToiNoaHFR3+KiocVFg11/3Oi0sajwNupcJWSEDcPsasRYV4jV7eDyxMPY77gnwKK327pdHkq31lOwsYbCDTU0VLXgapXUTcJOrDkXa0Q4oREWPCE1/JFdwmTHeqZ41mOvMOJuDsGe3QRGI9YRWQQfeCDW4cMJPeYYjCG+qSDYFdKlYc+uA/eu7a9SQsPnubhbNRtZJ0bREtq8y41MiSS3upnfsquobXaRGhXEIVkxRAV13mtIGoAkE5h2T8wVbjPf5izC6F5LmBniLU6MBoHH7cZgrCQoqJngYB/XeO+GwMA0xo19BJOpnbb3ohX6xCBhyXrN/6jd41zxyUcUrF+tf6N5oC4fqnP0q3lzsD6aOTxlx5V8ZX4u9sZGIuITvDdgBYLtN4AFIPT3NyEICAnlyH9coa87hKiE389UOd3MWZNNob39Gt5d5ZaSBrfGXZlJpLS6WtekpKSuhbJ6OxUNDqqaHNQ1O2l2emh2urE3u7GX75qsAEyh6zBHLEeY6zGYKwnNvYxzHNmcbvyJYkMivyXMwRw3nnCHRNS7cNU5aSpvwe3SMJgEiZkRRCcFE50cQlhsIDHJIViastF+exrXbx9iy5bYyq3Ya81orp1NHobwcEJOn0nMuedhiIqkobISj9uF5vGgeTzebm/exx4PHo8Hj8uJx+XC7Xbhcbn1x97nPG7Xjv/NdgvxVUmYhX5+3C4nmnvnG5JE4sGNWzgJ0kIJku3fNPTgZqtxNS5px4OHgor1tDR2v+krINJBwrRKDCZtzysDwiQJTWqm2RaKpun3B7a/LRgl2AtG4KhM9j7f6g2j1VX9rhf4rZ8X7T3d7f3suk6bNy17PZSuQSAhMk2fgMY7mMjjdFK4YS2RsdGYcerTT3rcEBCqTz1pDtr1OIDRYmb62ReQMmY8SvtUwvcDu72E6pqfAHBJ+L4phCaP/rH2V1sw3zeFcGp4PQaxd+d/bICd40PqKK5tIaeiidLSJsrq7TjdO/cbYjUSYjVhMWs0iQ1owq53JfNeFRkEGITA0yCJsSdhEiZCtEC05o6HdbuQNAgnQtRiNdsICTZhtRjB40Grq8LjsGPwaGgOF80lRig3IAV4zFbMQQGI4GAkYHe7cDmduJ0ODEYjmmfv+1EbjEYCzMHEBaUzOfRwQFJj1+cxNZhMmC0W8F4VApixYJRmNOGhyJhNi6HJu3j7FSQ4DQ7cBveOhGYNCmbcjCOxBLY/ktXtqaG45kXKG6uptTlxezSsZiPJEZWYDBoWU+Ju23g0SV2TDbfbjeb9uzQB9fVxlOVNwYggwagR0E4LzS5/x7v8TcsOnm71/K4fU9rfZ7f30+qxyw71hXqFSYMRaQrU78V4XCRaa5kRsxmDAIZNhxn/hPQDd3+BSpephN9LNtvsNLh3T1BSSjZvvpMm2xYAfuFQvha7TnRxnFzCOXReeGmwcNtMlHw8jaD4ZMzBQXrSFAIhDARHRGAOCCQ4PAK7rQmzxUp4fAJma4Den9lo9PZrNmIw6jfZjEYjRosFo8mMyWzGaDZjMJowms0YTSac2Q3Uvr0FzebCGGkl9uIJEGpEIjGZzAgf1HGpqvqWgsKXdxk52Zq9pRCHsxp7Syya1PBoEpdHw+U2sTH3IBzOOEKsJgwCXG6NFpcHp8tFuLDTYAwnOiyI+FArFpOB9PR0pk+f3j8LiXVH8Qr48xW92cbVol/Fh6dA4mTIOFhv61f2mkr4bXxcUcf8osod37vdNuz2wrYtHJ1ySDPZWtfbBk8NNHJ+gJ5oBBDa7Cb7r0o83vZil8dJQWMhLo8LidRHDGou0NwEtQgszmakpx60JqR0IrWqbkTrGxaXmyCnG4xGEIJgDZI9EGGxIhNTsSMgPJKG9CyCs7KQ0TEkhJawZePlBAeNxOAM3NmND3Z25dv5QKd5u1N6/8fbrRIpsblbsGvO1tebu/y3gxAIkwBf95bw/r1YA8rweEJwuTroNy4N5BeMxWEfTnx8/I4QKxsd1Nic2BxuGux6bxyjQRBiNRERZGHcyExmHnv4wC4upviVmgCljVeKq9hiszMuRC8r63JVgqcec3s3njpgEQ4utPxIprEcu82N3eZC87iRuEFKXA4rNbn7gAaiqZbk4nKWb09KUqJ5KtGEHU3onxCkd6SQGcDTApobgcTgrbPhBJzCiicohsCAcKJTDiQhJhKzUWANsWANbFUt0u1Bs9lw11TjqazCXVmJu7KSwOYWQoSR+roapITAyBFYQ5NxmwXCIjFaDYioFERYNNKjAVIfBm61IkwG/nIUY8O9o822GahwefQ+063InAbYtnLH9zHDpmILLQdsXT6/rZtcWj/l0tyYDSYMreuYCP0f0XrTjkYr9jj/77qh0zGWhoYTkDK4wyvvxAQLM2bMILqDHkZ1zU48miQq2DLwr96VAaFPE74Q4ljgCcAIzJdSPtiXxwfwSMnqxmbOTIjiPyP1miM//3g9TfXQsOGuTrfVPA4ctnx9qDYAkUAkTWXZGLVyhHPnVbcJSGYbABKB06Qn9e1lfJ1hgbiMbjwuDwa7G6NHA08gRhlIuGU4gcZADo45iJCO3oTqvV+d8k79FuH98uqoWO4WQykbjIVIW5tRr81gF05acJKoRe6a+swGRJs+5yLQskvCtdUcha0GDCFmhNngzc/evewYRt/+DcS2YmNjOeqoo3pvntI+FLGH3juK4mt9lvCFXhLuGeAooAj4QwixREq5obeO6aqro6imApcmqc7Ppya/khVba7EdfQjlb77B/7I3ItAYd95GavOSKNvw5M54W+0n0hxLoCkY4XEQIHcf7ZhoAJclFHeIFbPVhFWEEmaIwuMGp8ON2a0RWVuF8Gg43ZIIRxOBHiew6x+8CIrGOupEhHeKM83RgGPLB7sNI29LWIwYggMwBloRJg9/hkLh9vuSBumtLeK91yCMYLKAwYQwWzAEBYAwIJFUVlYSGxtLRHh4e0dhypQpjB41atdnuzHASFEU/+qzNnwhxIHAPVLKY7zf3w4gpXygo2162ob/1Jx/4Nljb4/dGn27fRxFUZTeYDKauGrhSz3atrM2/L68PEsGClt9X+R9bhdCiEuFEH8KIf6srKxsu7hr+u99aEVRFL/pyzb89i6hd0vNUsp5wDzQr/B7cqCr33y5J5spiqIMan15hV8EtJ4pIgUo6cPjK4qiDGl9mfD/AEYIIYYJISzAbGDJHrZRFEVRfKTPmnSklG4hxFXAF+jdMl+WUq7vq+MriqIMdX3aD19K+SnwaV8eU1EURdGpTtSKoihDhEr4iqIoQ4RK+IqiKEOESviKoihDRL8ujyyEqATye7h5DND3NYS7ZyDECCpOXxsIcQ6EGEHF2Z50KWVsewv6dcLfG0KIPzuqJ9FfDIQYQcXpawMhzoEQI6g4u0s16SiKogwRKuEriqIMEYM54c/zdwBdMBBiBBWnrw2EOAdCjKDi7JZB24avKIqi7GowX+EriqIoraiEryiKMkQMuoQvhDhWCLFZCLFNCHGbv+NpTQiRJ4RYK4RYJYT40/tclBDiKyHEVu//kX6I62UhRIUQYl2r5zqMSwhxu/f8bhZCHOPHGO8RQhR7z+cqIcTx/ozRe9xUIcR3QoiNQoj1Qohrvc/3m/PZSYz96nwKIQKEEL8LIVZ74/y39/l+cy73EGe/Op8ASCkHzRd62eVsYDj6DOGrgbH+jqtVfHlATJvn/gvc5n18G/CQH+KaDkwF1u0pLmCs97xagWHe8230U4z3ADe1s65fYvQeOxGY6n0cCmzxxtNvzmcnMfar84k+S16I97EZWA4c0J/O5R7i7FfnU0o56K7w9wO2SSlzpJROYDFwip9j2pNTgFe9j18FTu3rAKSUPwI1bZ7uKK5TgMVSSoeUMhfYhn7e/RFjR/wSI4CUslRKudL7uBHYiD53c785n53E2BF//cyllLLJ+63Z+yXpR+dyD3F2xG+/n4Mt4XdponQ/ksCXQogVQohLvc/FSylLQf9DBOL8Ft2uOoqrv53jq4QQa7xNPts/2veLGIUQGcAU9Cu+fnk+28QI/ex8CiGMQohVQAXwlZSyX57LDuKEfnY+B1vC79JE6X50sJRyKnAccKUQYrq/A+qB/nSOnwMygclAKfCo93m/xyiECAHeA66TUjZ0tmo7z/VJrO3E2O/Op5TSI6WcjD4H9n5CiPGdrN7f4ux353OwJfx+PVG6lLLE+38F8AH6x7hyIUQigPf/Cv9FuIuO4uo351hKWe79Q9OAF9n5sdivMQohzOiJdKGU8n3v0/3qfLYXY389n97Y6oDvgWPpZ+eytdZx9sfzOdgSfr+dKF0IESyECN3+GDgaWIce3/ne1c4HPvJPhLvpKK4lwGwhhFUIMQwYAfzuh/i2/7FvNxP9fIIfYxRCCOAlYKOU8rFWi/rN+ewoxv52PoUQsUKICO/jQOBvwCb60bnsLM7+dj6BwdVLR+p3wI9H73WQDdzh73haxTUc/c78amD99tiAaOAbYKv3/yg/xLYI/SOnC/3q46LO4gLu8J7fzcBxfozxdWAtsAb9jyjRnzF6j3sI+sfzNcAq79fx/el8dhJjvzqfwETgL28864C7vM/3m3O5hzj71fmUUqrSCoqiKEPFYGvSURRFUTqgEr6iKMoQoRK+oijKEKESvqIoyhChEr6iKMoQoRK+ongJISKEEHO9j5OEEO/6OyZF8SXVLVNRvLx1ZZZKKTsbvq8oA5bJ3wEoSj/yIJDpLYK1FRgjpRwvhLgAvSKjERiPXhPFApwLOIDjpZQ1QohM4BkgFmgGLpFSburrF6EoHVFNOoqy021AttSLYN3cZtl44Gz0eij3A81SyinAr8B53nXmAVdLKfcBbgKe7YugFaWr1BW+onTNd1KvHd8ohKgHPvY+vxaY6K08eRDwjl6qBtAnuFCUfkMlfEXpGkerx1qr7zX0vyMDUOf9dKAo/ZJq0lGUnRrRp/zrNqnXk88VQswCvSKlEGKSL4NTlL2lEr6ieEkpq4FfhD5R+sM92MUc4CIhxPaKqP19ek1liFHdMhVFUYYIdYWvKIoyRKiEryiKMkSohK8oijJEqISvKIoyRKiEryiKMkSohK8oijJEqISvKIoyRPw/7oIA3otplkcAAAAASUVORK5CYII=\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "fig, ax = plt.subplots()\n", + "swiftdiff['rmag'].sel(id=tpidx).plot.line(ax=ax, x=\"time\")\n", + "ax.set_ylabel(\"$|\\mathbf{r}_{swiftest} - \\mathbf{r}_{swifter}|$\")\n", + "ax.set_title(\"Heliocentric position differences \\n Test Particles only\")\n", + "legend = ax.legend()\n", + "legend.remove()\n", + "fig.savefig(\"symba_swifter_comparison-8pl-16tp-testparticles-rmag.png\", facecolor='white', transparent=False, dpi=300)" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "No handles with labels found to put in legend.\n" + ] + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "fig, ax = plt.subplots()\n", + "swiftdiff['vmag'].sel(id=tpidx).plot.line(ax=ax, x=\"time\")\n", + "ax.set_ylabel(\"$|\\mathbf{v}_{swiftest} - \\mathbf{v}_{swifter}|$\")\n", + "ax.set_title(\"Heliocentric velocity differences \\n Test Particles only\")\n", + "legend = ax.legend()\n", + "legend.remove()\n", + "fig.savefig(\"symba_swifter_comparison-8pl-16tp-testparticles-vmag.png\", facecolor='white', transparent=False, dpi=300)" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "swiftestOOF", + "language": "python", + "name": "swiftestoof" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.7.10" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/examples/symba_swifter_comparison/8pl/tp.in b/examples/symba_swifter_comparison/8pl/tp.in new file mode 100644 index 000000000..573541ac9 --- /dev/null +++ b/examples/symba_swifter_comparison/8pl/tp.in @@ -0,0 +1 @@ +0 diff --git a/examples/symba_swifter_comparison/8pl/tp.swifter.in b/examples/symba_swifter_comparison/8pl/tp.swifter.in new file mode 100644 index 000000000..573541ac9 --- /dev/null +++ b/examples/symba_swifter_comparison/8pl/tp.swifter.in @@ -0,0 +1 @@ +0 diff --git a/examples/symba_swifter_comparison/8pl/tp.swiftest.in b/examples/symba_swifter_comparison/8pl/tp.swiftest.in new file mode 100644 index 000000000..573541ac9 --- /dev/null +++ b/examples/symba_swifter_comparison/8pl/tp.swiftest.in @@ -0,0 +1 @@ +0 diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt new file mode 100644 index 000000000..5ea24cc0d --- /dev/null +++ b/src/CMakeLists.txt @@ -0,0 +1,131 @@ +######################################## +# Set up how to compile the source files +######################################## + +# Add the source files +SET(FOO_src + ${SRC}/modules/encounter_classes.f90 + ${SRC}/modules/fraggle_classes.f90 + ${SRC}/modules/helio_classes.f90 + ${SRC}/modules/lambda_function.f90 + ${SRC}/modules/rmvs_classes.f90 + ${SRC}/modules/swiftest_classes.f90 + ${SRC}/modules/swiftest_globals.f90 + ${SRC}/modules/swiftest_operators.f90 + ${SRC}/modules/swiftest.f90 + ${SRC}/modules/symba_classes.f90 + ${SRC}/modules/walltime_classes.f90 + ${SRC}/modules/whm_classes.f90 + ${SRC}/discard/discard.f90 + ${SRC}/drift/drift.f90 + ${SRC}/encounter/encounter_check.f90 + ${SRC}/encounter/encounter_io.f90 + ${SRC}/encounter/encounter_setup.f90 + ${SRC}/encounter/encounter_util.f90 + ${SRC}/fraggle/fraggle_generate.f90 + ${SRC}/fraggle/fraggle_io.f90 + ${SRC}/fraggle/fraggle_placeholder.f90 + ${SRC}/fraggle/fraggle_regime.f90 + ${SRC}/fraggle/fraggle_set.f90 + ${SRC}/fraggle/fraggle_setup.f90 + ${SRC}/fraggle/fraggle_util.f90 + ${SRC}/gr/gr.f90 + ${SRC}/helio/helio_drift.f90 + ${SRC}/helio/helio_gr.f90 + ${SRC}/helio/helio_kick.f90 + ${SRC}/helio/helio_setup.f90 + ${SRC}/helio/helio_step.f90 + ${SRC}/helio/helio_util.f90 + ${SRC}/io/io.f90 + ${SRC}/kick/kick.f90 + ${SRC}/netcdf/netcdf.f90 + ${SRC}/obl/obl.f90 + ${SRC}/operators/operator_cross.f90 + ${SRC}/operators/operator_mag.f90 + ${SRC}/orbel/orbel.f90 + ${SRC}/rmvs/rmvs_discard.f90 + ${SRC}/rmvs/rmvs_encounter_check.f90 + ${SRC}/rmvs/rmvs_io.f90 + ${SRC}/rmvs/rmvs_kick.f90 + ${SRC}/rmvs/rmvs_setup.f90 + ${SRC}/rmvs/rmvs_step.f90 + ${SRC}/rmvs/rmvs_util.f90 + ${SRC}/setup/setup.f90 + ${SRC}/symba/symba_collision.f90 + ${SRC}/symba/symba_discard.f90 + ${SRC}/symba/symba_drift.f90 + ${SRC}/symba/symba_encounter_check.f90 + ${SRC}/symba/symba_gr.f90 + ${SRC}/symba/symba_io.f90 + ${SRC}/symba/symba_kick.f90 + ${SRC}/symba/symba_setup.f90 + ${SRC}/symba/symba_step.f90 + ${SRC}/symba/symba_util.f90 + ${SRC}/tides/tides_getacch_pl.f90 + ${SRC}/tides/tides_spin_step.f90 + ${SRC}/user/user_getacch.f90 + ${SRC}/util/util_append.f90 + ${SRC}/util/util_coord.f90 + ${SRC}/util/util_copy.f90 + ${SRC}/util/util_dealloc.f90 + ${SRC}/util/util_exit.f90 + ${SRC}/util/util_fill.f90 + ${SRC}/util/util_flatten.f90 + ${SRC}/util/util_get_energy_momentum.f90 + ${SRC}/util/util_index_array.f90 + ${SRC}/util/util_minimize_bfgs.f90 + ${SRC}/util/util_peri.f90 + ${SRC}/util/util_rescale.f90 + ${SRC}/util/util_resize.f90 + ${SRC}/util/util_set.f90 + ${SRC}/util/util_solve.f90 + ${SRC}/util/util_sort.f90 + ${SRC}/util/util_spill.f90 + ${SRC}/util/util_valid.f90 + ${SRC}/util/util_version.f90 + ${SRC}/walltime/walltime.f90 + ${SRC}/whm/whm_coord.f90 + ${SRC}/whm/whm_drift.f90 + ${SRC}/whm/whm_gr.f90 + ${SRC}/whm/whm_kick.f90 + ${SRC}/whm/whm_setup.f90 + ${SRC}/whm/whm_step.f90 + ${SRC}/whm/whm_util.f90 + ${SRC}/main/swiftest_driver.f90 +) + +# Define the executable in terms of the source files +ADD_EXECUTABLE(${FOOEXE} ${FOO_src}) + +##################################################### +# Add the needed libraries and special compiler flags +##################################################### + +# Uncomment if you need to link to BLAS and LAPACK +TARGET_LINK_LIBRARIES(${FOOEXE} ${NETCDF_LIBRARIES} ${NETCDF_FORTRAN_LIBRARIES}) + +# Uncomment if you have parallization +IF(USE_OPENMP) + SET_TARGET_PROPERTIES(${FOOEXE} PROPERTIES + COMPILE_FLAGS "${OpenMP_Fortran_FLAGS}" + LINK_FLAGS "${OpenMP_Fortran_FLAGS}") +ELSEIF(USE_MPI) + SET_TARGET_PROPERTIES(${FOOEXE} PROPERTIES + COMPILE_FLAGS "${MPI_Fortran_COMPILE_FLAGS}" + LINK_FLAGS "${MPI_Fortran_LINK_FLAGS}") + INCLUDE_DIRECTORIES(${MPI_Fortran_INCLUDE_PATH}) + TARGET_LINK_LIBRARIES(${FOOEXE} ${MPI_Fortran_LIBRARIES}) +ENDIF(USE_OPENMP) + + + +##################################### +# Tell how to install this executable +##################################### + +IF(WIN32) + SET(CMAKE_INSTALL_PREFIX "C:\\Program Files") +ELSE() + SET(CMAKE_INSTALL_PREFIX /usr/local) +ENDIF(WIN32) +INSTALL(TARGETS ${FOOEXE} RUNTIME DESTINATION bin) \ No newline at end of file diff --git a/src/discard/discard.f90 b/src/discard/discard.f90 index e3bde988b..ffaba5dd6 100644 --- a/src/discard/discard.f90 +++ b/src/discard/discard.f90 @@ -21,7 +21,7 @@ module subroutine discard_system(self, param) class(swiftest_nbody_system), intent(inout) :: self !! Swiftest system object class(swiftest_parameters), intent(inout) :: param !! Current run configuration parameters ! Internals - logical :: lany_discards, lpl_discards, ltp_discards, lpl_check, ltp_check + logical :: lpl_discards, ltp_discards, lpl_check, ltp_check lpl_check = allocated(self%pl_discards) ltp_check = allocated(self%tp_discards) @@ -189,7 +189,6 @@ subroutine discard_peri_tp(tp, system, param) class(swiftest_nbody_system), intent(inout) :: system !! Swiftest nbody system object class(swiftest_parameters), intent(in) :: param !! Current run configuration parameterss ! Internals - logical, save :: lfirst = .true. integer(I4B) :: i, j, ih real(DP) :: r2 real(DP), dimension(NDIM) :: dx diff --git a/src/drift/drift.f90 b/src/drift/drift.f90 index be0154c5b..b2e3c1b9a 100644 --- a/src/drift/drift.f90 +++ b/src/drift/drift.f90 @@ -89,11 +89,11 @@ module subroutine drift_all(mu, x, v, n, param, dt, lmask, iflag) where(lmask(1:n)) dtp(1:n) = dt end if - !$omp simd + !!$omp simd ! SIMD does not yet work do i = 1, n if (lmask(i)) call drift_one(mu(i), x(1,i), x(2,i), x(3,i), v(1,i), v(2,i), v(3,i), dtp(i), iflag(i)) end do - !$omp end simd + !!$omp end simd deallocate(dtp) @@ -101,7 +101,7 @@ module subroutine drift_all(mu, x, v, n, param, dt, lmask, iflag) end subroutine drift_all - module pure elemental subroutine drift_one(mu, px, py, pz, vx, vy, vz, dt, iflag) + pure elemental module subroutine drift_one(mu, px, py, pz, vx, vy, vz, dt, iflag) !! author: The Purdue Swiftest Team - David A. Minton, Carlisle A. Wishard, Jennifer L.L. Pouplin, and Jacob R. Elliott !! !! Perform Danby drift for one body, redoing drift with smaller substeps if original accuracy is insufficient diff --git a/src/encounter/encounter_check.f90 b/src/encounter/encounter_check.f90 index ff3cb91cc..6d866fb50 100644 --- a/src/encounter/encounter_check.f90 +++ b/src/encounter/encounter_check.f90 @@ -34,7 +34,6 @@ module subroutine encounter_check_all_plpl(param, npl, x, v, renc, dt, & logical, save :: lfirst = .true. logical, save :: skipit = .false. ! This will be used to ensure that the sort & sweep subroutine gets called at least once before timing it so that the extent array is nearly sorted when it is timed integer(I8B) :: nplpl = 0_I8B - integer(I8B) :: k if (param%ladaptive_encounters_plpl .and. (.not. skipit)) then nplpl = (npl * (npl - 1) / 2) @@ -100,8 +99,7 @@ module subroutine encounter_check_all_plplm(param, nplm, nplt, xplm, vplm, xplt, logical, save :: lfirst = .true. logical, save :: skipit = .false. integer(I8B) :: nplplm = 0_I8B - integer(I4B) :: npl, i - integer(I8B) :: k + integer(I4B) :: npl logical, dimension(:), allocatable :: plmplt_lvdotr !! Logical flag indicating the sign of v .dot. x in the plm-plt group integer(I4B), dimension(:), allocatable :: plmplt_index1 !! List of indices for body 1 in each encounter in the plm-plt group integer(I4B), dimension(:), allocatable :: plmplt_index2 !! List of indices for body 2 in each encounter in the plm-lt group @@ -263,10 +261,9 @@ subroutine encounter_check_all_sort_and_sweep_plpl(npl, x, v, renc, dt, nenc, in integer(I4B), dimension(:), allocatable, intent(out) :: index2 !! List of indices for body 2 in each encounter logical, dimension(:), allocatable, intent(out) :: lvdotr !! Logical flag indicating the sign of v .dot. x ! Internals - integer(I4B) :: i, dim, n + integer(I4B) :: dim, n integer(I4B), save :: npl_last = 0 type(encounter_bounding_box), save :: boundingbox - logical, dimension(:), allocatable :: lencounter integer(I2B), dimension(npl) :: vshift_min, vshift_max if (npl == 0) return @@ -325,12 +322,10 @@ subroutine encounter_check_all_sort_and_sweep_plplm(nplm, nplt, xplm, vplm, xplt logical, dimension(:), allocatable, intent(out) :: lvdotr !! Logical flag indicating the sign of v .dot. x ! Internals type(encounter_bounding_box), save :: boundingbox - integer(I4B) :: i, dim, n, ntot + integer(I4B) :: dim, n, ntot integer(I4B), save :: ntot_last = 0 - logical, dimension(:), allocatable :: lencounter integer(I2B), dimension(nplm) :: vplmshift_min, vplmshift_max integer(I2B), dimension(nplt) :: vpltshift_min, vpltshift_max - logical, save :: lfirst=.true. ! If this is the first time through, build the index lists if ((nplm == 0) .or. (nplt == 0)) return @@ -399,9 +394,8 @@ subroutine encounter_check_all_sort_and_sweep_pltp(npl, ntp, xpl, vpl, xtp, vtp, logical, dimension(:), allocatable, intent(out) :: lvdotr !! Logical flag indicating the sign of v .dot. x ! Internals type(encounter_bounding_box), save :: boundingbox - integer(I4B) :: i, dim, n, ntot + integer(I4B) :: dim, n, ntot integer(I4B), save :: ntot_last = 0 - logical, dimension(:), allocatable :: lencounter integer(I2B), dimension(npl) :: vplshift_min, vplshift_max integer(I2B), dimension(ntp) :: vtpshift_min, vtpshift_max real(DP), dimension(ntp) :: renctp @@ -476,7 +470,6 @@ pure subroutine encounter_check_all_sweep_one(i, n, xi, yi, zi, vxi, vyi, vzi, x logical, dimension(:), allocatable, intent(inout) :: lvdotr !! v.dot.r direction array ! Internals integer(I4B) :: j - integer(I8B) :: k real(DP) :: xr, yr, zr, vxr, vyr, vzr, renc12 logical, dimension(n) :: lencounteri, lvdotri @@ -524,7 +517,7 @@ pure subroutine encounter_check_all_triangular_one(i, n, xi, yi, zi, vxi, vyi, v type(encounter_list), intent(out) :: lenci !! Output encounter lists containing number of encounters, the v.dot.r direction array, and the index list of encountering bodies ! Internals integer(I4B) :: j - integer(I8B) :: k, nenci + integer(I8B) :: nenci real(DP) :: xr, yr, zr, vxr, vyr, vzr, renc12 logical, dimension(n) :: lencounteri, lvdotri @@ -568,9 +561,7 @@ subroutine encounter_check_all_triangular_plpl(npl, x, v, renc, dt, nenc, index1 integer(I4B), dimension(:), allocatable, intent(out) :: index2 !! List of indices for body 2 in each encounter logical, dimension(:), allocatable, intent(out) :: lvdotr !! Logical flag indicating the sign of v .dot. x ! Internals - integer(I4B) :: i, j, k, nenci, j0, j1 - real(DP) :: xr, yr, zr, vxr, vyr, vzr, renc12 - logical, dimension(npl) :: lencounteri, lvdotri + integer(I4B) :: i integer(I4B), dimension(:), allocatable, save :: ind_arr type(encounter_list), dimension(npl) :: lenc @@ -618,7 +609,6 @@ subroutine encounter_check_all_triangular_plplm(nplm, nplt, xplm, vplm, xplt, vp logical, dimension(:), allocatable, intent(out) :: lvdotr !! Logical flag indicating the sign of v .dot. x ! Internals integer(I4B) :: i - logical, dimension(nplt) :: lencounteri, lvdotri integer(I4B), dimension(:), allocatable, save :: ind_arr type(encounter_list), dimension(nplm) :: lenc @@ -665,7 +655,6 @@ subroutine encounter_check_all_triangular_pltp(npl, ntp, xpl, vpl, xtp, vtp, ren logical, dimension(:), allocatable, intent(out) :: lvdotr !! Logical flag indicating the sign of v .dot. x ! Internals integer(I4B) :: i - logical, dimension(ntp) :: lencounteri, lvdotri integer(I4B), dimension(:), allocatable, save :: ind_arr type(encounter_list), dimension(npl) :: lenc real(DP), dimension(ntp) :: renct @@ -692,7 +681,7 @@ subroutine encounter_check_all_triangular_pltp(npl, ntp, xpl, vpl, xtp, vtp, ren end subroutine encounter_check_all_triangular_pltp - module elemental subroutine encounter_check_one(xr, yr, zr, vxr, vyr, vzr, renc, dt, lencounter, lvdotr) + elemental module subroutine encounter_check_one(xr, yr, zr, vxr, vyr, vzr, renc, dt, lencounter, lvdotr) !! author: David A. Minton !! !! Determine whether a test particle and planet are having or will have an encounter within the next time step @@ -874,7 +863,7 @@ subroutine encounter_check_remove_duplicates(n, nenc, index1, index2, lvdotr) end subroutine encounter_check_remove_duplicates - module pure subroutine encounter_check_sort_aabb_1D(self, n, extent_arr) + pure module subroutine encounter_check_sort_aabb_1D(self, n, extent_arr) !! author: David A. Minton !! !! Sorts the bounding box extents along a single dimension prior to the sweep phase. @@ -923,15 +912,11 @@ module subroutine encounter_check_sweep_aabb_double_list(self, n1, n2, x1, v1, x integer(I4B), dimension(:), allocatable, intent(out) :: index2 !! List of indices for body 2 in each encounter candidate pair logical, dimension(:), allocatable, intent(out) :: lvdotr !! Logical array indicating which pairs are approaching ! Internals - integer(I4B) :: ii, i, j, ntot, nbox, dim - integer(I8B) :: k + integer(I4B) :: ii, i, ntot, nbox, dim logical, dimension(n1+n2) :: loverlap logical, dimension(SWEEPDIM,n1+n2) :: loverlap_by_dimension - integer(I4B), dimension(SWEEPDIM) :: noverlap - integer(I4B), dimension(SWEEPDIM,n1+n2) :: nbox_arr logical, dimension(SWEEPDIM,2*(n1+n2)) :: llist1 integer(I4B), dimension(SWEEPDIM,2*(n1+n2)) :: ext_ind - integer(I4B), dimension(:), allocatable :: x_ind type(encounter_list), dimension(n1+n2) :: lenc !! Array of encounter lists (one encounter list per body) integer(I4B), dimension(:), allocatable, save :: ind_arr integer(I8B) :: ibeg, iend diff --git a/src/fraggle/fraggle_generate.f90 b/src/fraggle/fraggle_generate.f90 index 26b6e97fb..d59e2a9b7 100644 --- a/src/fraggle/fraggle_generate.f90 +++ b/src/fraggle/fraggle_generate.f90 @@ -92,21 +92,21 @@ module subroutine fraggle_generate_fragments(self, colliders, system, param, lfa end do call frag%get_energy_and_momentum(colliders, system, param, lbefore=.false.) - call frag%set_budgets(colliders) + call frag%set_budgets() - call fraggle_generate_spins(frag, colliders, f_spin, lfailure) + call fraggle_generate_spins(frag, f_spin, lfailure) if (lfailure) then call io_log_one_message(FRAGGLE_LOG_OUT, "Fraggle failed to find spins") cycle end if - call fraggle_generate_tan_vel(frag, colliders, lfailure) + call fraggle_generate_tan_vel(frag, lfailure) if (lfailure) then call io_log_one_message(FRAGGLE_LOG_OUT, "Fraggle failed to find tangential velocities") cycle end if - call fraggle_generate_rad_vel(frag, colliders, lfailure) + call fraggle_generate_rad_vel(frag, lfailure) if (lfailure) then call io_log_one_message(FRAGGLE_LOG_OUT, "Fraggle failed to find radial velocities") cycle @@ -226,7 +226,7 @@ subroutine fraggle_generate_pos_vec(frag, colliders, r_max_start) end subroutine fraggle_generate_pos_vec - subroutine fraggle_generate_spins(frag, colliders, f_spin, lfailure) + subroutine fraggle_generate_spins(frag, f_spin, lfailure) !! Author: Jennifer L.L. Pouplin, Carlisle A. Wishard, and David A. Minton !! !! Calculates the spins of a collection of fragments such that they conserve angular momentum without blowing the fragment kinetic energy budget. @@ -235,7 +235,6 @@ subroutine fraggle_generate_spins(frag, colliders, f_spin, lfailure) implicit none ! Arguments class(fraggle_fragments), intent(inout) :: frag !! Fraggle fragment system object - class(fraggle_colliders), intent(in) :: colliders !! Fraggle collider system object real(DP), intent(in) :: f_spin !! Fraction of energy or momentum that goes into spin (whichever gives the lowest kinetic energy) logical, intent(out) :: lfailure !! Logical flag indicating whether this step fails or succeeds! ! Internals @@ -287,7 +286,7 @@ subroutine fraggle_generate_spins(frag, colliders, f_spin, lfailure) end subroutine fraggle_generate_spins - subroutine fraggle_generate_tan_vel(frag, colliders, lfailure) + subroutine fraggle_generate_tan_vel(frag, lfailure) !! Author: Jennifer L.L. Pouplin, Carlisle A. Wishard, and David A. Minton !! !! Adjusts the tangential velocities and spins of a collection of fragments such that they conserve angular momentum without blowing the fragment kinetic energy budget. @@ -303,7 +302,6 @@ subroutine fraggle_generate_tan_vel(frag, colliders, lfailure) implicit none ! Arguments class(fraggle_fragments), intent(inout) :: frag !! Fraggle fragment system object - class(fraggle_colliders), intent(in) :: colliders !! Fraggle collider system object logical, intent(out) :: lfailure !! Logical flag indicating whether this step fails or succeeds ! Internals integer(I4B) :: i @@ -311,10 +309,9 @@ subroutine fraggle_generate_tan_vel(frag, colliders, lfailure) real(DP), parameter :: TOL_INIT = 1e-14_DP real(DP), parameter :: VNOISE_MAG = 1e-3_DP !! Magnitude of the noise to apply to initial conditions to help minimizer find a solution in case of failure integer(I4B), parameter :: MAXLOOP = 10 - real(DP) :: tol, ke_remainder + real(DP) :: tol real(DP), dimension(:), allocatable :: v_t_initial real(DP), dimension(frag%nbody) :: kefrag, vnoise - type(lambda_obj) :: spinfunc type(lambda_obj_err) :: objective_function real(DP), dimension(NDIM) :: Li, L_remainder, L_frag_tot character(len=STRMAX) :: message @@ -473,7 +470,7 @@ end function tangential_objective_function end subroutine fraggle_generate_tan_vel - subroutine fraggle_generate_rad_vel(frag, colliders, lfailure) + subroutine fraggle_generate_rad_vel(frag, lfailure) !! Author: Jennifer L.L. Pouplin, Carlisle A. Wishard, and David A. Minton !! !! @@ -481,7 +478,6 @@ subroutine fraggle_generate_rad_vel(frag, colliders, lfailure) implicit none ! Arguments class(fraggle_fragments), intent(inout) :: frag !! Fraggle fragment system object - class(fraggle_colliders), intent(in) :: colliders !! Fraggle collider system object logical, intent(out) :: lfailure !! Logical flag indicating whether this step fails or succeeds! ! Internals real(DP), parameter :: TOL_MIN = FRAGGLE_ETOL ! This needs to be more accurate than the tangential step, as we are trying to minimize the total residual energy @@ -489,9 +485,8 @@ subroutine fraggle_generate_rad_vel(frag, colliders, lfailure) real(DP), parameter :: VNOISE_MAG = 1e-10_DP !! Magnitude of the noise to apply to initial conditions to help minimizer find a solution in case of failure integer(I4B), parameter :: MAXLOOP = 100 real(DP) :: ke_radial, tol - integer(I4B) :: i, j + integer(I4B) :: i real(DP), dimension(:), allocatable :: v_r_initial - real(DP), dimension(:,:), allocatable :: v_r real(DP), dimension(frag%nbody) :: vnoise type(lambda_obj) :: objective_function character(len=STRMAX) :: message diff --git a/src/fraggle/fraggle_regime.f90 b/src/fraggle/fraggle_regime.f90 index 4b516bd4c..cf8d5891c 100644 --- a/src/fraggle/fraggle_regime.f90 +++ b/src/fraggle/fraggle_regime.f90 @@ -24,12 +24,11 @@ module subroutine fraggle_regime_colliders(self, frag, system, param) class(swiftest_nbody_system), intent(in) :: system !! Swiftest nbody system object class(swiftest_parameters), intent(in) :: param !! Current Swiftest run configuration parameters ! Internals - integer(I4B) :: jtarg, jproj, regime + integer(I4B) :: jtarg, jproj real(DP), dimension(2) :: radius_si, mass_si, density_si real(DP) :: min_mfrag_si, Mcb_si real(DP), dimension(NDIM) :: x1_si, v1_si, x2_si, v2_si - real(DP) :: mlr, mslr, mtot, dentot, msys, msys_new, Qloss, impact_parameter - logical :: fileExists + real(DP) :: mlr, mslr, mtot, dentot associate(colliders => self) ! Convert all quantities to SI units and determine which of the pair is the projectile vs. target before sending them to the regime determination subroutine diff --git a/src/fraggle/fraggle_set.f90 b/src/fraggle/fraggle_set.f90 index 81cb3774a..6f61b989c 100644 --- a/src/fraggle/fraggle_set.f90 +++ b/src/fraggle/fraggle_set.f90 @@ -11,14 +11,13 @@ use swiftest contains - module subroutine fraggle_set_budgets_fragments(self, colliders) + module subroutine fraggle_set_budgets_fragments(self) !! author: David A. Minton !! !! Sets the energy and momentum budgets of the fragments based on the collider values and the before/after values of energy and momentum implicit none ! Arguments class(fraggle_fragments), intent(inout) :: self !! Fraggle fragment system object - class(fraggle_colliders), intent(inout) :: colliders !! Fraggle collider system object ! Internals real(DP) :: dEtot real(DP), dimension(NDIM) :: dL @@ -171,7 +170,7 @@ module subroutine fraggle_set_coordinate_system(self, colliders) class(fraggle_colliders), intent(inout) :: colliders !! Fraggle collider system object ! Internals integer(I4B) :: i - real(DP), dimension(NDIM) :: x_cross_v, delta_r, delta_v, Ltot + real(DP), dimension(NDIM) :: delta_r, delta_v, Ltot real(DP) :: r_col_norm, v_col_norm, L_mag real(DP), dimension(NDIM, self%nbody) :: L_sigma diff --git a/src/fraggle/fraggle_util.f90 b/src/fraggle/fraggle_util.f90 index 28037104e..8d9594974 100644 --- a/src/fraggle/fraggle_util.f90 +++ b/src/fraggle/fraggle_util.f90 @@ -147,10 +147,7 @@ module subroutine fraggle_util_get_energy_momentum(self, colliders, system, para class(swiftest_parameters), intent(inout) :: param !! Current swiftest run configuration parameters logical, intent(in) :: lbefore !! Flag indicating that this the "before" state of the system, with colliders included and fragments excluded or vice versa ! Internals - integer(I4B) :: i, nplm logical, dimension(:), allocatable :: lexclude - logical :: lk_plpl - logical, save :: ladd_frags class(swiftest_nbody_system), allocatable, save :: tmpsys class(swiftest_parameters), allocatable, save :: tmpparam integer(I4B) :: npl_before, npl_after @@ -223,10 +220,7 @@ module subroutine fraggle_util_restructure(self, colliders, try, f_spin, r_max_s real(DP), intent(inout) :: f_spin !! Fraction of energy/momentum that goes into spin. This decreases ater a failed attempt real(DP), intent(inout) :: r_max_start !! The maximum radial distance that the position calculation starts with. This increases after a failed attempt ! Internals - integer(I4B) :: i real(DP), save :: ke_tot_deficit, r_max_start_old, ke_avg_deficit_old - real(DP), dimension(:), allocatable :: m_frag_new, rad_frag_new - real(DP), dimension(:,:), allocatable :: xb_frag_new, vb_frag_new, Ip_frag_new, rot_frag_new real(DP) :: delta_r, delta_r_max, ke_avg_deficit real(DP), parameter :: ke_avg_deficit_target = 0.0_DP diff --git a/src/gr/gr.f90 b/src/gr/gr.f90 index 3ed042b28..8b32c7654 100644 --- a/src/gr/gr.f90 +++ b/src/gr/gr.f90 @@ -11,7 +11,7 @@ use swiftest contains - module pure subroutine gr_kick_getaccb_ns_body(self, system, param) + pure module subroutine gr_kick_getaccb_ns_body(self, system, param) !! author: David A. Minton !! !! Add relativistic correction acceleration for non-symplectic integrators. @@ -54,7 +54,7 @@ module pure subroutine gr_kick_getaccb_ns_body(self, system, param) end subroutine gr_kick_getaccb_ns_body - module pure subroutine gr_kick_getacch(mu, x, lmask, n, inv_c2, agr) + pure module subroutine gr_kick_getacch(mu, x, lmask, n, inv_c2, agr) !! author: David A. Minton !! !! Compute relativisitic accelerations of massive bodies @@ -84,7 +84,7 @@ module pure subroutine gr_kick_getacch(mu, x, lmask, n, inv_c2, agr) end subroutine gr_kick_getacch - module pure subroutine gr_p4_pos_kick(param, x, v, dt) + pure module subroutine gr_p4_pos_kick(param, x, v, dt) !! author: David A. Minton !! !! Position kick due to p**4 term in the post-Newtonian correction @@ -113,7 +113,7 @@ module pure subroutine gr_p4_pos_kick(param, x, v, dt) end subroutine gr_p4_pos_kick - module pure subroutine gr_pseudovel2vel(param, mu, xh, pv, vh) + pure module subroutine gr_pseudovel2vel(param, mu, xh, pv, vh) !! author: David A. Minton !! !! Converts the relativistic pseudovelocity back into a veliocentric velocity @@ -145,7 +145,7 @@ module pure subroutine gr_pseudovel2vel(param, mu, xh, pv, vh) end subroutine gr_pseudovel2vel - module pure subroutine gr_pv2vh_body(self, param) + pure module subroutine gr_pv2vh_body(self, param) !! author: David A. Minton !! !! Wrapper function that converts from pseudovelocity to heliocentric velocity for swiftest bodies @@ -170,7 +170,7 @@ module pure subroutine gr_pv2vh_body(self, param) end subroutine gr_pv2vh_body - module pure subroutine gr_vel2pseudovel(param, mu, xh, vh, pv) + pure module subroutine gr_vel2pseudovel(param, mu, xh, vh, pv) !! author: David A. Minton !! !! Converts the heliocentric velocity into a pseudovelocity with relativistic corrections. @@ -247,7 +247,7 @@ module pure subroutine gr_vel2pseudovel(param, mu, xh, vh, pv) end subroutine gr_vel2pseudovel - module pure subroutine gr_vh2pv_body(self, param) + pure module subroutine gr_vh2pv_body(self, param) !! author: David A. Minton !! !! Wrapper function that converts from heliocentric velocity to pseudovelocity for Swiftest bodies diff --git a/src/helio/helio_drift.f90 b/src/helio/helio_drift.f90 index ce3100783..60c6d52a8 100644 --- a/src/helio/helio_drift.f90 +++ b/src/helio/helio_drift.f90 @@ -26,7 +26,6 @@ module subroutine helio_drift_body(self, system, param, dt) real(DP), intent(in) :: dt !! Stepsize ! Internals integer(I4B) :: i !! Loop counter - real(DP) :: rmag, vmag2, energy integer(I4B), dimension(:),allocatable :: iflag !! Vectorized error code flag real(DP), dimension(:), allocatable :: mu @@ -140,7 +139,6 @@ module subroutine helio_drift_linear_pl(self, cb, dt, lbeg) logical, intent(in) :: lbeg !! Argument that determines whether or not this is the beginning or end of the step ! Internals real(DP), dimension(NDIM) :: pt !! negative barycentric velocity of the central body - integer(I4B) :: i if (self%nbody == 0) return diff --git a/src/helio/helio_gr.f90 b/src/helio/helio_gr.f90 index f58be72db..5ffbf60b2 100644 --- a/src/helio/helio_gr.f90 +++ b/src/helio/helio_gr.f90 @@ -11,7 +11,7 @@ use swiftest contains - module pure subroutine helio_gr_kick_getacch_pl(self, param) + pure module subroutine helio_gr_kick_getacch_pl(self, param) !! author: David A. Minton !! !! Compute relativisitic accelerations of massive bodies @@ -22,11 +22,6 @@ module pure subroutine helio_gr_kick_getacch_pl(self, param) ! Arguments class(helio_pl), intent(inout) :: self !! Helio massive body particle data structure class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters - ! Internals - integer(I4B) :: i - real(DP), dimension(NDIM) :: suma - real(DP), dimension(:, :), allocatable :: aj - real(DP) :: beta, rjmag4 if (self%nbody == 0) return @@ -39,7 +34,7 @@ module pure subroutine helio_gr_kick_getacch_pl(self, param) end subroutine helio_gr_kick_getacch_pl - module pure subroutine helio_gr_kick_getacch_tp(self, param) + pure module subroutine helio_gr_kick_getacch_tp(self, param) !! author: David A. Minton !! !! Compute relativisitic accelerations of test particles @@ -50,9 +45,6 @@ module pure subroutine helio_gr_kick_getacch_tp(self, param) ! Arguments class(helio_tp), intent(inout) :: self !! Helio massive body particle data structure class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters - ! Internals - integer(I4B) :: i - real(DP) :: rjmag4, beta if (self%nbody == 0) return @@ -65,7 +57,7 @@ module pure subroutine helio_gr_kick_getacch_tp(self, param) end subroutine helio_gr_kick_getacch_tp - module pure subroutine helio_gr_p4_pl(self, system, param, dt) + pure module subroutine helio_gr_p4_pl(self, system, param, dt) !! author: David A. Minton !! !! Position kick to massive bodies due to p**4 term in the post-Newtonian correction @@ -93,7 +85,7 @@ module pure subroutine helio_gr_p4_pl(self, system, param, dt) end subroutine helio_gr_p4_pl - module pure subroutine helio_gr_p4_tp(self, system, param, dt) + pure module subroutine helio_gr_p4_tp(self, system, param, dt) !! author: David A. Minton !! !! Position kick to test particles due to p**4 term in the post-Newtonian correction diff --git a/src/io/io.f90 b/src/io/io.f90 index a8e77972a..208b5d2ed 100644 --- a/src/io/io.f90 +++ b/src/io/io.f90 @@ -243,7 +243,6 @@ module subroutine io_dump_base(self, param) class(swiftest_base), intent(inout) :: self !! Swiftest base object class(swiftest_parameters), intent(inout) :: param !! Current run configuration parameters ! Internals - integer(I4B) :: ierr !! Error code integer(I4B) :: iu = LUN character(len=:), allocatable :: dump_file_name character(STRMAX) :: errmsg @@ -960,13 +959,6 @@ module subroutine io_param_writer(self, unit, iotype, v_list, iostat, iomsg) character(*),parameter :: Ifmt = '(I0)' !! Format label for integer values character(*),parameter :: Rfmt = '(ES25.17)' !! Format label for real values character(*),parameter :: Lfmt = '(L1)' !! Format label for logical values - character(len=NAMELEN) :: param_name - character(LEN=STRMAX) :: param_value, v1, v2, v3 - type character_array - character(25) :: value - end type character_array - type(character_array), dimension(:), allocatable :: param_array - integer(I4B) :: i associate(param => self) call io_param_writer_one("T0", param%t0, unit) @@ -1253,8 +1245,6 @@ module subroutine io_read_in_base(self,param) implicit none class(swiftest_base), intent(inout) :: self !! Swiftest base object class(swiftest_parameters), intent(inout) :: param !! Current run configuration parameters - ! Internals - integer(I4B) :: ierr !! Error code: returns 0 if the read is successful if ((param%in_type == NETCDF_FLOAT_TYPE) .or. (param%in_type == NETCDF_DOUBLE_TYPE)) return ! This method is not used in NetCDF mode, as reading is done for the whole system, not on individual particle types @@ -1285,9 +1275,9 @@ subroutine io_read_in_body(self, param) integer(I4B) :: i, nbody logical :: is_ascii character(len=:), allocatable :: infile - real(DP) :: t character(STRMAX) :: errmsg - integer(I4B) :: ierr + ! Internals + integer(I4B) :: ierr !! Error code: returns 0 if the read is successful ! Select the appropriate polymorphic class (test particle or massive body) @@ -1346,7 +1336,7 @@ subroutine io_read_in_cb(self, param) ! Internals integer(I4B) :: iu = LUN character(len=STRMAX) :: errmsg - integer(I4B) :: ierr, idold + integer(I4B) :: ierr character(len=NAMELEN) :: name if (param%in_type == 'ASCII') then @@ -1852,7 +1842,7 @@ module subroutine io_read_particle_info_system(self, param) class(swiftest_nbody_system), intent(inout) :: self !! Swiftest nbody system object class(swiftest_parameters), intent(inout) :: param !! Current run configuration parameters ! Internals - integer(I4B) :: i, id, idx + integer(I4B) :: id, idx logical :: lmatch character(STRMAX) :: errmsg type(swiftest_particle_info), allocatable :: tmpinfo diff --git a/src/kick/kick.f90 b/src/kick/kick.f90 index 775e1bd14..dd0682bf0 100644 --- a/src/kick/kick.f90 +++ b/src/kick/kick.f90 @@ -264,7 +264,7 @@ module subroutine kick_getacch_int_all_tp(ntp, npl, xtp, xpl, GMpl, lmask, acc) end subroutine kick_getacch_int_all_tp - module pure subroutine kick_getacch_int_one_pl(rji2, xr, yr, zr, Gmi, Gmj, axi, ayi, azi, axj, ayj, azj) + pure module subroutine kick_getacch_int_one_pl(rji2, xr, yr, zr, Gmi, Gmj, axi, ayi, azi, axj, ayj, azj) !! author: David A. Minton !! !! Compute direct cross (third) term heliocentric accelerations for a single pair of massive bodies @@ -295,7 +295,7 @@ module pure subroutine kick_getacch_int_one_pl(rji2, xr, yr, zr, Gmi, Gmj, axi, end subroutine kick_getacch_int_one_pl - module pure subroutine kick_getacch_int_one_tp(rji2, xr, yr, zr, GMpl, ax, ay, az) + pure module subroutine kick_getacch_int_one_tp(rji2, xr, yr, zr, GMpl, ax, ay, az) !! author: David A. Minton !! !! Compute direct cross (third) term heliocentric accelerations of a single test particle massive body pair. diff --git a/src/modules/encounter_classes.f90 b/src/modules/encounter_classes.f90 index 7e0e3e7a1..bf209c477 100644 --- a/src/modules/encounter_classes.f90 +++ b/src/modules/encounter_classes.f90 @@ -116,7 +116,7 @@ module subroutine encounter_check_all_pltp(param, npl, ntp, xpl, vpl, xtp, vtp, logical, dimension(:), allocatable, intent(out) :: lvdotr !! Logical flag indicating the sign of v .dot. x end subroutine encounter_check_all_pltp - module elemental subroutine encounter_check_one(xr, yr, zr, vxr, vyr, vzr, renc, dt, lencounter, lvdotr) + elemental module subroutine encounter_check_one(xr, yr, zr, vxr, vyr, vzr, renc, dt, lencounter, lvdotr) !$omp declare simd(encounter_check_one) implicit none real(DP), intent(in) :: xr, yr, zr !! Relative distance vector components @@ -137,7 +137,7 @@ module subroutine encounter_check_collapse_ragged_list(ragged_list, n1, nenc, in logical, dimension(:), allocatable, intent(out), optional :: lvdotr !! Array indicating which bodies are approaching end subroutine encounter_check_collapse_ragged_list - module pure subroutine encounter_check_sort_aabb_1D(self, n, extent_arr) + pure module subroutine encounter_check_sort_aabb_1D(self, n, extent_arr) implicit none class(encounter_bounding_box_1D), intent(inout) :: self !! Bounding box structure along a single dimension integer(I4B), intent(in) :: n !! Number of bodies with extents diff --git a/src/modules/fraggle_classes.f90 b/src/modules/fraggle_classes.f90 index c6a4932d0..d7c949a01 100644 --- a/src/modules/fraggle_classes.f90 +++ b/src/modules/fraggle_classes.f90 @@ -173,10 +173,9 @@ module subroutine fraggle_regime_colliders(self, frag, system, param) class(swiftest_parameters), intent(in) :: param !! Current Swiftest run configuration parameters end subroutine fraggle_regime_colliders - module subroutine fraggle_set_budgets_fragments(self, colliders) + module subroutine fraggle_set_budgets_fragments(self) implicit none class(fraggle_fragments), intent(inout) :: self !! Fraggle fragment system object - class(fraggle_colliders), intent(inout) :: colliders !! Fraggle collider system object end subroutine fraggle_set_budgets_fragments module subroutine fraggle_set_coordinate_system(self, colliders) diff --git a/src/modules/helio_classes.f90 b/src/modules/helio_classes.f90 index ac5c36533..3f12628b7 100644 --- a/src/modules/helio_classes.f90 +++ b/src/modules/helio_classes.f90 @@ -117,21 +117,21 @@ module subroutine helio_drift_linear_tp(self, cb, dt, lbeg) logical, intent(in) :: lbeg !! Argument that determines whether or not this is the beginning or end of the step end subroutine helio_drift_linear_tp - module pure subroutine helio_gr_kick_getacch_pl(self, param) + pure module subroutine helio_gr_kick_getacch_pl(self, param) use swiftest_classes, only : swiftest_parameters implicit none class(helio_pl), intent(inout) :: self !! Helio massive body particle data structure class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters end subroutine helio_gr_kick_getacch_pl - module pure subroutine helio_gr_kick_getacch_tp(self, param) + pure module subroutine helio_gr_kick_getacch_tp(self, param) use swiftest_classes, only : swiftest_parameters implicit none class(helio_tp), intent(inout) :: self !! Helio massive body particle data structure class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters end subroutine helio_gr_kick_getacch_tp - module pure subroutine helio_gr_p4_pl(self, system, param, dt) + pure module subroutine helio_gr_p4_pl(self, system, param, dt) use swiftest_classes, only : swiftest_parameters, swiftest_nbody_system implicit none class(helio_pl), intent(inout) :: self !! Swiftest particle object @@ -140,7 +140,7 @@ module pure subroutine helio_gr_p4_pl(self, system, param, dt) real(DP), intent(in) :: dt !! Step size end subroutine helio_gr_p4_pl - module pure subroutine helio_gr_p4_tp(self, system, param, dt) + pure module subroutine helio_gr_p4_tp(self, system, param, dt) use swiftest_classes, only : swiftest_parameters, swiftest_nbody_system implicit none class(helio_tp), intent(inout) :: self !! Swiftest particle object diff --git a/src/modules/lambda_function.f90 b/src/modules/lambda_function.f90 index 8c5809b2b..44b97dfcc 100644 --- a/src/modules/lambda_function.f90 +++ b/src/modules/lambda_function.f90 @@ -159,6 +159,7 @@ module lambda_function type, extends(lambda_obj) :: lambda_obj_tvar !! Base class for an lambda function object. This object takes no additional arguments other than the dependent variable x, an array of real numbers procedure(lambda0tvar), pointer, nopass :: lambdaptr_tvar => null() + real(DP) :: t contains generic :: init => lambda_init_tvar procedure :: evalt => lambda_eval_tvar @@ -220,6 +221,7 @@ type(lambda_obj_tvar) function lambda_init_tvar(lambda, t) procedure(lambda0tvar) :: lambda real(DP), intent(in) :: t lambda_init_tvar%lambdaptr_tvar => lambda + lambda_init_tvar%t = t return end function lambda_init_tvar diff --git a/src/modules/swiftest_classes.f90 b/src/modules/swiftest_classes.f90 index fa199746c..d58891fe5 100644 --- a/src/modules/swiftest_classes.f90 +++ b/src/modules/swiftest_classes.f90 @@ -518,7 +518,7 @@ module subroutine drift_body(self, system, param, dt) real(DP), intent(in) :: dt !! Stepsize end subroutine drift_body - module pure elemental subroutine drift_one(mu, px, py, pz, vx, vy, vz, dt, iflag) + pure elemental module subroutine drift_one(mu, px, py, pz, vx, vy, vz, dt, iflag) !$omp declare simd(drift_one) implicit none real(DP), intent(in) :: mu !! G * (Mcb + m), G = gravitational constant, Mcb = mass of central body, m = mass of body to drift @@ -527,14 +527,14 @@ module pure elemental subroutine drift_one(mu, px, py, pz, vx, vy, vz, dt, iflag integer(I4B), intent(out) :: iflag !! iflag : error status flag for Danby drift (0 = OK, nonzero = ERROR) end subroutine drift_one - module pure subroutine gr_kick_getaccb_ns_body(self, system, param) + pure module subroutine gr_kick_getaccb_ns_body(self, system, param) implicit none class(swiftest_body), intent(inout) :: self !! Swiftest generic body object class(swiftest_nbody_system), intent(inout) :: system !! Swiftest nbody system object class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters end subroutine gr_kick_getaccb_ns_body - module pure subroutine gr_kick_getacch(mu, x, lmask, n, inv_c2, agr) + pure module subroutine gr_kick_getacch(mu, x, lmask, n, inv_c2, agr) implicit none real(DP), dimension(:), intent(in) :: mu !! Gravitational constant real(DP), dimension(:,:), intent(in) :: x !! Position vectors @@ -544,7 +544,7 @@ module pure subroutine gr_kick_getacch(mu, x, lmask, n, inv_c2, agr) real(DP), dimension(:,:), intent(out) :: agr !! Accelerations end subroutine gr_kick_getacch - module pure subroutine gr_p4_pos_kick(param, x, v, dt) + pure module subroutine gr_p4_pos_kick(param, x, v, dt) implicit none class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters real(DP), dimension(:), intent(inout) :: x !! Position vector @@ -552,7 +552,7 @@ module pure subroutine gr_p4_pos_kick(param, x, v, dt) real(DP), intent(in) :: dt !! Step size end subroutine gr_p4_pos_kick - module pure subroutine gr_pseudovel2vel(param, mu, xh, pv, vh) + pure module subroutine gr_pseudovel2vel(param, mu, xh, pv, vh) implicit none class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters real(DP), intent(in) :: mu !! G * (Mcb + m), G = gravitational constant, Mcb = mass of central body, m = mass of body @@ -561,13 +561,13 @@ module pure subroutine gr_pseudovel2vel(param, mu, xh, pv, vh) real(DP), dimension(:), intent(out) :: vh !! Swiftestcentric velocity vector end subroutine gr_pseudovel2vel - module pure subroutine gr_pv2vh_body(self, param) + pure module subroutine gr_pv2vh_body(self, param) implicit none class(swiftest_body), intent(inout) :: self !! Swiftest particle object class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters end subroutine gr_pv2vh_body - module pure subroutine gr_vel2pseudovel(param, mu, xh, vh, pv) + pure module subroutine gr_vel2pseudovel(param, mu, xh, vh, pv) implicit none class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters real(DP), intent(in) :: mu !! G * (Mcb + m), G = gravitational constant, Mcb = mass of central body, m = mass of body @@ -576,7 +576,7 @@ module pure subroutine gr_vel2pseudovel(param, mu, xh, vh, pv) real(DP), dimension(:), intent(out) :: pv !! Pseudovelocity vector - see Saha & Tremain (1994), eq. (32) end subroutine gr_vel2pseudovel - module pure subroutine gr_vh2pv_body(self, param) + pure module subroutine gr_vh2pv_body(self, param) implicit none class(swiftest_body), intent(inout) :: self !! Swiftest particle object class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters @@ -878,7 +878,7 @@ module subroutine kick_getacch_int_all_tp(ntp, npl, xtp, xpl, GMpl, lmask, acc) real(DP), dimension(:,:), intent(inout) :: acc !! Acceleration vector array end subroutine kick_getacch_int_all_tp - module pure subroutine kick_getacch_int_one_pl(rji2, xr, yr, zr, Gmi, Gmj, axi, ayi, azi, axj, ayj, azj) + pure module subroutine kick_getacch_int_one_pl(rji2, xr, yr, zr, Gmi, Gmj, axi, ayi, azi, axj, ayj, azj) !$omp declare simd(kick_getacch_int_one_pl) implicit none real(DP), intent(in) :: rji2 !! Square of distance between the two bodies @@ -889,7 +889,7 @@ module pure subroutine kick_getacch_int_one_pl(rji2, xr, yr, zr, Gmi, Gmj, axi, real(DP), intent(inout) :: axj, ayj, azj !! Acceleration vector components of body j end subroutine kick_getacch_int_one_pl - module pure subroutine kick_getacch_int_one_tp(rji2, xr, yr, zr, Gmpl, ax, ay, az) + pure module subroutine kick_getacch_int_one_tp(rji2, xr, yr, zr, Gmpl, ax, ay, az) !$omp declare simd(kick_getacch_int_one_tp) implicit none real(DP), intent(in) :: rji2 !! Square of distance between the test particle and massive body @@ -1015,14 +1015,14 @@ module subroutine orbel_el2xv_vec(self, cb) class(swiftest_cb), intent(inout) :: cb !! Swiftest central body object end subroutine orbel_el2xv_vec - module pure subroutine orbel_scget(angle, sx, cx) + pure module subroutine orbel_scget(angle, sx, cx) !$omp declare simd(orbel_scget) implicit none real(DP), intent(in) :: angle real(DP), intent(out) :: sx, cx end subroutine orbel_scget - module pure subroutine orbel_xv2aeq(mu, px, py, pz, vx, vy, vz, a, e, q) + pure module subroutine orbel_xv2aeq(mu, px, py, pz, vx, vy, vz, a, e, q) !$omp declare simd(orbel_xv2aeq) implicit none real(DP), intent(in) :: mu !! Gravitational constant @@ -1033,7 +1033,7 @@ module pure subroutine orbel_xv2aeq(mu, px, py, pz, vx, vy, vz, a, e, q) real(DP), intent(out) :: q !! periapsis end subroutine orbel_xv2aeq - module pure subroutine orbel_xv2aqt(mu, px, py, pz, vx, vy, vz, a, q, capm, tperi) + pure module subroutine orbel_xv2aqt(mu, px, py, pz, vx, vy, vz, a, q, capm, tperi) !$omp declare simd(orbel_xv2aqt) implicit none real(DP), intent(in) :: mu !! Gravitational constant @@ -1045,7 +1045,7 @@ module pure subroutine orbel_xv2aqt(mu, px, py, pz, vx, vy, vz, a, q, capm, tper real(DP), intent(out) :: tperi !! time of pericenter passage end subroutine orbel_xv2aqt - module pure subroutine orbel_xv2el(mu, px, py, pz, vx, vy, vz, a, e, inc, capom, omega, capm) + pure module subroutine orbel_xv2el(mu, px, py, pz, vx, vy, vz, a, e, inc, capom, omega, capm) implicit none real(DP), intent(in) :: mu !! Gravitational constant real(DP), intent(in) :: px,py,pz !! Position vector @@ -1370,7 +1370,7 @@ end subroutine util_fill_arr_logical end interface interface - module pure subroutine util_flatten_eucl_ij_to_k(n, i, j, k) + pure module subroutine util_flatten_eucl_ij_to_k(n, i, j, k) !$omp declare simd(util_flatten_eucl_ij_to_k) implicit none integer(I4B), intent(in) :: n !! Number of bodies @@ -1379,7 +1379,7 @@ module pure subroutine util_flatten_eucl_ij_to_k(n, i, j, k) integer(I8B), intent(out) :: k !! Index of the flattened matrix end subroutine util_flatten_eucl_ij_to_k - module pure subroutine util_flatten_eucl_k_to_ij(n, k, i, j) + pure module subroutine util_flatten_eucl_k_to_ij(n, k, i, j) implicit none integer(I4B), intent(in) :: n !! Number of bodies integer(I8B), intent(in) :: k !! Index of the flattened matrix @@ -1605,46 +1605,46 @@ end function util_solve_rkf45 end interface interface util_sort - module pure subroutine util_sort_i4b(arr) + pure module subroutine util_sort_i4b(arr) implicit none integer(I4B), dimension(:), intent(inout) :: arr end subroutine util_sort_i4b - module pure subroutine util_sort_index_i4b(arr,ind) + pure module subroutine util_sort_index_i4b(arr,ind) implicit none integer(I4B), dimension(:), intent(in) :: arr integer(I4B), dimension(:), allocatable, intent(inout) :: ind end subroutine util_sort_index_i4b - module pure subroutine util_sort_index_I4B_I8Bind(arr,ind) + pure module subroutine util_sort_index_I4B_I8Bind(arr,ind) implicit none integer(I4B), dimension(:), intent(in) :: arr integer(I8B), dimension(:), allocatable, intent(inout) :: ind end subroutine util_sort_index_I4b_I8Bind - module pure subroutine util_sort_index_I8B_I8Bind(arr,ind) + pure module subroutine util_sort_index_I8B_I8Bind(arr,ind) implicit none integer(I8B), dimension(:), intent(in) :: arr integer(I8B), dimension(:), allocatable, intent(inout) :: ind end subroutine util_sort_index_I8B_I8Bind - module pure subroutine util_sort_sp(arr) + pure module subroutine util_sort_sp(arr) implicit none real(SP), dimension(:), intent(inout) :: arr end subroutine util_sort_sp - module pure subroutine util_sort_index_sp(arr,ind) + pure module subroutine util_sort_index_sp(arr,ind) implicit none real(SP), dimension(:), intent(in) :: arr integer(I4B), dimension(:), allocatable, intent(inout) :: ind end subroutine util_sort_index_sp - module pure subroutine util_sort_dp(arr) + pure module subroutine util_sort_dp(arr) implicit none real(DP), dimension(:), intent(inout) :: arr end subroutine util_sort_dp - module pure subroutine util_sort_index_dp(arr,ind) + pure module subroutine util_sort_index_dp(arr,ind) implicit none real(DP), dimension(:), intent(in) :: arr integer(I4B), dimension(:), allocatable, intent(inout) :: ind @@ -1652,35 +1652,35 @@ end subroutine util_sort_index_dp end interface util_sort interface util_sort_rearrange - module pure subroutine util_sort_rearrange_arr_char_string(arr, ind, n) + pure module subroutine util_sort_rearrange_arr_char_string(arr, ind, n) implicit none character(len=STRMAX), dimension(:), allocatable, intent(inout) :: arr !! Destination array integer(I4B), dimension(:), intent(in) :: ind !! Index to rearrange against integer(I4B), intent(in) :: n !! Number of elements in arr and ind to rearrange end subroutine util_sort_rearrange_arr_char_string - module pure subroutine util_sort_rearrange_arr_DP(arr, ind, n) + pure module subroutine util_sort_rearrange_arr_DP(arr, ind, n) implicit none real(DP), dimension(:), allocatable, intent(inout) :: arr !! Destination array integer(I4B), dimension(:), intent(in) :: ind !! Index to rearrange against integer(I4B), intent(in) :: n !! Number of elements in arr and ind to rearrange end subroutine util_sort_rearrange_arr_DP - module pure subroutine util_sort_rearrange_arr_DPvec(arr, ind, n) + pure module subroutine util_sort_rearrange_arr_DPvec(arr, ind, n) implicit none real(DP), dimension(:,:), allocatable, intent(inout) :: arr !! Destination array integer(I4B), dimension(:), intent(in) :: ind !! Index to rearrange against integer(I4B), intent(in) :: n !! Number of elements in arr and ind to rearrange end subroutine util_sort_rearrange_arr_DPvec - module pure subroutine util_sort_rearrange_arr_I4B(arr, ind, n) + pure module subroutine util_sort_rearrange_arr_I4B(arr, ind, n) implicit none integer(I4B), dimension(:), allocatable, intent(inout) :: arr !! Destination array integer(I4B), dimension(:), intent(in) :: ind !! Index to rearrange against integer(I4B), intent(in) :: n !! Number of elements in arr and ind to rearrange end subroutine util_sort_rearrange_arr_I4B - module pure subroutine util_sort_rearrange_arr_I4B_I8Bind(arr, ind, n) + pure module subroutine util_sort_rearrange_arr_I4B_I8Bind(arr, ind, n) implicit none integer(I4B), dimension(:), allocatable, intent(inout) :: arr !! Destination array integer(I8B), dimension(:), intent(in) :: ind !! Index to rearrange against @@ -1694,14 +1694,14 @@ module subroutine util_sort_rearrange_arr_info(arr, ind, n) integer(I4B), intent(in) :: n !! Number of elements in arr and ind to rearrange end subroutine util_sort_rearrange_arr_info - module pure subroutine util_sort_rearrange_arr_logical(arr, ind, n) + pure module subroutine util_sort_rearrange_arr_logical(arr, ind, n) implicit none logical, dimension(:), allocatable, intent(inout) :: arr !! Destination array integer(I4B), dimension(:), intent(in) :: ind !! Index to rearrange against integer(I4B), intent(in) :: n !! Number of elements in arr and ind to rearrange end subroutine util_sort_rearrange_arr_logical - module pure subroutine util_sort_rearrange_arr_logical_I8Bind(arr, ind, n) + pure module subroutine util_sort_rearrange_arr_logical_I8Bind(arr, ind, n) implicit none logical, dimension(:), allocatable, intent(inout) :: arr !! Destination array integer(I8B), dimension(:), intent(in) :: ind !! Index to rearrange against diff --git a/src/modules/swiftest_operators.f90 b/src/modules/swiftest_operators.f90 index 29c9b77e0..30e5b26a6 100644 --- a/src/modules/swiftest_operators.f90 +++ b/src/modules/swiftest_operators.f90 @@ -23,92 +23,92 @@ module swiftest_operators !******************************************************************************************************************************** interface operator(.cross.) - module pure function operator_cross_sp(A, B) result(C) + pure module function operator_cross_sp(A, B) result(C) !$omp declare simd(operator_cross_sp) implicit none real(SP), dimension(:), intent(in) :: A, B real(SP), dimension(3) :: C end function operator_cross_sp - module pure function operator_cross_dp(A, B) result(C) + pure module function operator_cross_dp(A, B) result(C) !$omp declare simd(operator_cross_dp) implicit none real(DP), dimension(:), intent(in) :: A, B real(DP), dimension(3) :: C end function operator_cross_dp - module pure function operator_cross_qp(A, B) result(C) + pure module function operator_cross_qp(A, B) result(C) !$omp declare simd(operator_cross_qp) implicit none real(QP), dimension(:), intent(in) :: A, B real(QP), dimension(3) :: C end function operator_cross_qp - module pure function operator_cross_i1b(A, B) result(C) + pure module function operator_cross_i1b(A, B) result(C) !$omp declare simd(operator_cross_i1b) implicit none integer(I1B), dimension(:), intent(in) :: A, B integer(I1B), dimension(3) :: C end function operator_cross_i1b - module pure function operator_cross_i2b(A, B) result(C) + pure module function operator_cross_i2b(A, B) result(C) !$omp declare simd(operator_cross_i2b) implicit none integer(I2B), dimension(:), intent(in) :: A, B integer(I2B), dimension(3) :: C end function operator_cross_i2b - module pure function operator_cross_i4b(A, B) result(C) + pure module function operator_cross_i4b(A, B) result(C) !$omp declare simd(operator_cross_i4b) implicit none integer(I4B), dimension(:), intent(in) :: A, B integer(I4B), dimension(3) :: C end function operator_cross_i4b - module pure function operator_cross_i8b(A, B) result(C) + pure module function operator_cross_i8b(A, B) result(C) !$omp declare simd(operator_cross_i8b) implicit none integer(I8B), dimension(:), intent(in) :: A, B integer(I8B), dimension(3) :: C end function operator_cross_i8b - module pure function operator_cross_el_sp(A, B) result(C) + pure module function operator_cross_el_sp(A, B) result(C) implicit none real(SP), dimension(:,:), intent(in) :: A, B real(SP), dimension(:,:), allocatable :: C end function operator_cross_el_sp - module pure function operator_cross_el_dp(A, B) result(C) + pure module function operator_cross_el_dp(A, B) result(C) implicit none real(DP), dimension(:,:), intent(in) :: A, B real(DP), dimension(:,:), allocatable :: C end function operator_cross_el_dp - module pure function operator_cross_el_qp(A, B) result(C) + pure module function operator_cross_el_qp(A, B) result(C) implicit none real(QP), dimension(:,:), intent(in) :: A, B real(QP), dimension(:,:), allocatable :: C end function operator_cross_el_qp - module pure function operator_cross_el_i1b(A, B) result(C) + pure module function operator_cross_el_i1b(A, B) result(C) implicit none integer(I1B), dimension(:,:), intent(in) :: A, B integer(I1B), dimension(:,:), allocatable :: C end function operator_cross_el_i1b - module pure function operator_cross_el_i2b(A, B) result(C) + pure module function operator_cross_el_i2b(A, B) result(C) implicit none integer(I2B), dimension(:,:), intent(in) :: A, B integer(I2B), dimension(:,:), allocatable :: C end function operator_cross_el_i2b - module pure function operator_cross_el_i4b(A, B) result(C) + pure module function operator_cross_el_i4b(A, B) result(C) implicit none integer(I4B), dimension(:,:), intent(in) :: A, B integer(I4B), dimension(:,:), allocatable :: C end function operator_cross_el_i4b - module pure function operator_cross_el_i8b(A, B) result(C) + pure module function operator_cross_el_i8b(A, B) result(C) implicit none integer(I8B), dimension(:,:), intent(in) :: A, B integer(I8B), dimension(:,:), allocatable :: C @@ -120,40 +120,40 @@ end function operator_cross_el_i8b !******************************************************************************************************************************** interface operator(.mag.) - module pure function operator_mag_sp(A) result(B) + pure module function operator_mag_sp(A) result(B) !$omp declare simd(operator_mag_sp) implicit none real(SP), dimension(:), intent(in) :: A real(SP) :: B end function operator_mag_sp - module pure function operator_mag_dp(A) result(B) + pure module function operator_mag_dp(A) result(B) !$omp declare simd(operator_mag_dp) implicit none real(DP), dimension(:), intent(in) :: A real(DP) :: B end function operator_mag_dp - module pure function operator_mag_qp(A) result(B) + pure module function operator_mag_qp(A) result(B) !$omp declare simd(operator_mag_qp) implicit none real(QP), dimension(:), intent(in) :: A real(QP) :: B end function operator_mag_qp - module pure function operator_mag_el_sp(A) result(B) + pure module function operator_mag_el_sp(A) result(B) implicit none real(SP), dimension(:,:), intent(in) :: A real(SP), dimension(:), allocatable :: B end function operator_mag_el_sp - module pure function operator_mag_el_dp(A) result(B) + pure module function operator_mag_el_dp(A) result(B) implicit none real(DP), dimension(:,:), intent(in) :: A real(DP), dimension(:), allocatable :: B end function operator_mag_el_dp - module pure function operator_mag_el_qp(A) result(B) + pure module function operator_mag_el_qp(A) result(B) implicit none real(QP), dimension(:,:), intent(in) :: A real(QP), dimension(:), allocatable :: B diff --git a/src/modules/symba_classes.f90 b/src/modules/symba_classes.f90 index 5a30e2149..cacad4b4d 100644 --- a/src/modules/symba_classes.f90 +++ b/src/modules/symba_classes.f90 @@ -315,7 +315,7 @@ module function symba_encounter_check_tp(self, param, system, dt, irec) result(l logical :: lany_encounter !! Returns true if there is at least one close encounter end function symba_encounter_check_tp - module pure subroutine symba_gr_p4_pl(self, system, param, dt) + pure module subroutine symba_gr_p4_pl(self, system, param, dt) use swiftest_classes, only : swiftest_parameters, swiftest_nbody_system implicit none class(symba_pl), intent(inout) :: self !! SyMBA massive body object @@ -324,7 +324,7 @@ module pure subroutine symba_gr_p4_pl(self, system, param, dt) real(DP), intent(in) :: dt !! Step size end subroutine symba_gr_p4_pl - module pure subroutine symba_gr_p4_tp(self, system, param, dt) + pure module subroutine symba_gr_p4_tp(self, system, param, dt) use swiftest_classes, only : swiftest_parameters, swiftest_nbody_system implicit none class(symba_tp), intent(inout) :: self !! SyMBA test particle object @@ -494,7 +494,7 @@ module subroutine symba_step_set_recur_levels_system(self, ireci) integer(I4B), intent(in) :: ireci !! Input recursion level end subroutine symba_step_set_recur_levels_system - module recursive subroutine symba_step_recur_system(self, param, t, ireci) + recursive module subroutine symba_step_recur_system(self, param, t, ireci) use swiftest_classes, only : swiftest_parameters implicit none class(symba_nbody_system), intent(inout) :: self !! SyMBA nbody system object @@ -672,7 +672,6 @@ module subroutine symba_util_reset_kinship(self, idx) implicit none class(symba_pl), intent(inout) :: self !! SyMBA massive body object integer(I4B), dimension(:), intent(in) :: idx !! Index array of bodies to reset - integer(I4B) :: i, j end subroutine symba_util_reset_kinship end interface diff --git a/src/modules/whm_classes.f90 b/src/modules/whm_classes.f90 index 4126e8ae4..34922c29a 100644 --- a/src/modules/whm_classes.f90 +++ b/src/modules/whm_classes.f90 @@ -165,21 +165,21 @@ module subroutine whm_kick_vh_tp(self, system, param, t, dt, lbeg) logical, intent(in) :: lbeg !! Logical flag indicating whether this is the beginning of the half step or not. end subroutine whm_kick_vh_tp - module pure subroutine whm_gr_kick_getacch_pl(self, param) + pure module subroutine whm_gr_kick_getacch_pl(self, param) use swiftest_classes, only : swiftest_cb, swiftest_parameters implicit none class(whm_pl), intent(inout) :: self !! WHM massive body particle data structure class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters end subroutine whm_gr_kick_getacch_pl - module pure subroutine whm_gr_kick_getacch_tp(self, param) + pure module subroutine whm_gr_kick_getacch_tp(self, param) use swiftest_classes, only : swiftest_cb, swiftest_parameters implicit none class(whm_tp), intent(inout) :: self !! WHM test particle data structure class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters end subroutine whm_gr_kick_getacch_tp - module pure subroutine whm_gr_p4_pl(self, system, param, dt) + pure module subroutine whm_gr_p4_pl(self, system, param, dt) use swiftest_classes, only : swiftest_parameters implicit none class(whm_pl), intent(inout) :: self !! WHM massive body object @@ -188,7 +188,7 @@ module pure subroutine whm_gr_p4_pl(self, system, param, dt) real(DP), intent(in) :: dt !! Step size end subroutine whm_gr_p4_pl - module pure subroutine whm_gr_p4_tp(self, system, param, dt) + pure module subroutine whm_gr_p4_tp(self, system, param, dt) use swiftest_classes, only : swiftest_parameters implicit none class(whm_tp), intent(inout) :: self !! WHM test particle object diff --git a/src/netcdf/netcdf.f90 b/src/netcdf/netcdf.f90 index 58927b5df..463bb80cf 100644 --- a/src/netcdf/netcdf.f90 +++ b/src/netcdf/netcdf.f90 @@ -78,7 +78,7 @@ module function netcdf_get_old_t_final_system(self, param) result(old_t_final) real(DP), dimension(:), allocatable :: vals real(DP), dimension(1) :: val real(DP), dimension(NDIM) :: rot0, Ip0, Lnow - real(DP) :: KE_orb_orig, KE_spin_orig, PE_orig, Ltmp + real(DP) :: KE_orb_orig, KE_spin_orig, PE_orig call param%nciu%open(param) call check( nf90_inquire_dimension(param%nciu%ncid, param%nciu%time_dimid, len=itmax), "netcdf_get_old_t_final_system time_dimid" ) @@ -177,12 +177,12 @@ module subroutine netcdf_initialize_output(self, param) class(netcdf_parameters), intent(inout) :: self !! Parameters used to identify a particular NetCDF dataset class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters ! Internals - integer(I4B) :: old_mode, nvar, varid, vartype, old_unit + integer(I4B) :: nvar, varid, vartype real(DP) :: dfill real(SP) :: sfill logical :: fileExists character(len=STRMAX) :: errmsg - integer(I4B) :: storage, ndims, i + integer(I4B) :: ndims dfill = ieee_value(dfill, IEEE_QUIET_NAN) sfill = ieee_value(sfill, IEEE_QUIET_NAN) @@ -487,7 +487,7 @@ module function netcdf_read_frame_system(self, iu, param) result(ierr) ! Return integer(I4B) :: ierr !! Error code: returns 0 if the read is successful ! Internals - integer(I4B) :: dim, i, j, tslot, idmax, npl_check, ntp_check, nplm_check, t_max, str_max + integer(I4B) :: tslot, idmax, npl_check, ntp_check, nplm_check, t_max, str_max real(DP), dimension(:), allocatable :: rtemp integer(I4B), dimension(:), allocatable :: itemp logical, dimension(:), allocatable :: validmask, tpmask, plmask @@ -783,7 +783,7 @@ module subroutine netcdf_read_particle_info_system(self, iu, param, plmask, tpma logical, dimension(:), intent(in) :: plmask !! Logical array indicating which index values belong to massive bodies logical, dimension(:), intent(in) :: tpmask !! Logical array indicating which index values belong to test particles ! Internals - integer(I4B) :: i, j, tslot, idslot, old_mode, idmax + integer(I4B) :: i, idmax real(DP), dimension(:), allocatable :: rtemp real(DP), dimension(:,:), allocatable :: rtemp_arr integer(I4B), dimension(:), allocatable :: itemp @@ -1100,7 +1100,7 @@ module subroutine netcdf_write_particle_info_base(self, iu, param) class(netcdf_parameters), intent(inout) :: iu !! Parameters used to identify a particular NetCDF dataset class(swiftest_parameters), intent(inout) :: param !! Current run configuration parameters ! Internals - integer(I4B) :: i, j, tslot, idslot, old_mode + integer(I4B) :: i, j, idslot, old_mode integer(I4B), dimension(:), allocatable :: ind character(len=NAMELEN) :: charstring diff --git a/src/obl/obl.f90 b/src/obl/obl.f90 index 9536d4854..9ae30a5e4 100644 --- a/src/obl/obl.f90 +++ b/src/obl/obl.f90 @@ -137,7 +137,7 @@ module subroutine obl_pot_system(self) associate(system => self, pl => self%pl, npl => self%pl%nbody, cb => self%cb) if (.not. any(pl%lmask(1:npl))) return do concurrent (i = 1:npl, pl%lmask(i)) - oblpot_arr(i) = obl_pot_one(npl, cb%Gmass, pl%Gmass(i), cb%j2rp2, cb%j4rp4, pl%xh(3,i), 1.0_DP / norm2(pl%xh(:,i))) + oblpot_arr(i) = obl_pot_one(cb%Gmass, pl%Gmass(i), cb%j2rp2, cb%j4rp4, pl%xh(3,i), 1.0_DP / norm2(pl%xh(:,i))) end do system%oblpot = sum(oblpot_arr, pl%lmask(1:npl)) end associate @@ -146,7 +146,7 @@ module subroutine obl_pot_system(self) end subroutine obl_pot_system - elemental function obl_pot_one(npl, GMcb, GMpl, j2rp2, j4rp4, zh, irh) result(oblpot) + elemental function obl_pot_one(GMcb, GMpl, j2rp2, j4rp4, zh, irh) result(oblpot) !! author: David A. Minton !! !! Compute the contribution to the total gravitational potential due solely to the oblateness of the central body from a single massive body @@ -158,7 +158,6 @@ elemental function obl_pot_one(npl, GMcb, GMpl, j2rp2, j4rp4, zh, irh) result(ob !! Adapted from Hal Levison's Swift routine obl_pot.f implicit none ! Arguments - integer(I4B), intent(in) :: npl !! Number of massive bodies real(DP), intent(in) :: GMcb !! G*mass of the central body real(DP), intent(in) :: GMpl !! G*mass of the massive body real(DP), intent(in) :: j2rp2 !! J_2 / R**2 of the central body @@ -169,8 +168,7 @@ elemental function obl_pot_one(npl, GMcb, GMpl, j2rp2, j4rp4, zh, irh) result(ob real(DP) :: oblpot !! Gravitational potential ! Internals - integer(I4B) :: i - real(DP) :: rinv2, t0, t1, t2, t3, p2, p4, mu + real(DP) :: rinv2, t0, t1, t2, t3, p2, p4 rinv2 = irh**2 t0 = GMcb * GMpl * rinv2 * irh diff --git a/src/operators/operator_cross.f90 b/src/operators/operator_cross.f90 index f8d08bdb7..ba9582828 100644 --- a/src/operators/operator_cross.f90 +++ b/src/operators/operator_cross.f90 @@ -16,7 +16,7 @@ !! Vector list implementations: C(1:3, :) = A(1:3, :) .cross. B(1:3, :) contains - module pure function operator_cross_sp(A, B) result(C) + pure module function operator_cross_sp(A, B) result(C) implicit none real(SP), dimension(:), intent(in) :: A, B real(SP), dimension(3) :: C @@ -26,7 +26,7 @@ module pure function operator_cross_sp(A, B) result(C) return end function operator_cross_sp - module pure function operator_cross_dp(A, B) result(C) + pure module function operator_cross_dp(A, B) result(C) implicit none real(DP), dimension(:), intent(in) :: A, B real(DP), dimension(3) :: C @@ -36,7 +36,7 @@ module pure function operator_cross_dp(A, B) result(C) return end function operator_cross_dp - module pure function operator_cross_qp(A, B) result(C) + pure module function operator_cross_qp(A, B) result(C) implicit none real(QP), dimension(:), intent(in) :: A, B real(QP), dimension(3) :: C @@ -46,7 +46,7 @@ module pure function operator_cross_qp(A, B) result(C) return end function operator_cross_qp - module pure function operator_cross_i1b(A, B) result(C) + pure module function operator_cross_i1b(A, B) result(C) implicit none integer(I1B), dimension(:), intent(in) :: A, B integer(I1B), dimension(3) :: C @@ -56,7 +56,7 @@ module pure function operator_cross_i1b(A, B) result(C) return end function operator_cross_i1b - module pure function operator_cross_i2b(A, B) result(C) + pure module function operator_cross_i2b(A, B) result(C) implicit none integer(I2B), dimension(:), intent(in) :: A, B integer(I2B), dimension(3) :: C @@ -66,7 +66,7 @@ module pure function operator_cross_i2b(A, B) result(C) return end function operator_cross_i2b - module pure function operator_cross_i4b(A, B) result(C) + pure module function operator_cross_i4b(A, B) result(C) implicit none integer(I4B), dimension(:), intent(in) :: A, B integer(I4B), dimension(3) :: C @@ -76,7 +76,7 @@ module pure function operator_cross_i4b(A, B) result(C) return end function operator_cross_i4b - module pure function operator_cross_i8b(A, B) result(C) + pure module function operator_cross_i8b(A, B) result(C) implicit none integer(I8B), dimension(:), intent(in) :: A, B integer(I8B), dimension(3) :: C @@ -86,7 +86,7 @@ module pure function operator_cross_i8b(A, B) result(C) return end function operator_cross_i8b - module pure function operator_cross_el_sp(A, B) result(C) + pure module function operator_cross_el_sp(A, B) result(C) implicit none real(SP), dimension(:,:), intent(in) :: A, B real(SP), dimension(:,:), allocatable :: C @@ -100,7 +100,7 @@ module pure function operator_cross_el_sp(A, B) result(C) return end function operator_cross_el_sp - module pure function operator_cross_el_dp(A, B) result(C) + pure module function operator_cross_el_dp(A, B) result(C) implicit none real(DP), dimension(:,:), intent(in) :: A, B real(DP), dimension(:,:), allocatable :: C @@ -114,7 +114,7 @@ module pure function operator_cross_el_dp(A, B) result(C) return end function operator_cross_el_dp - module pure function operator_cross_el_qp(A, B) result(C) + pure module function operator_cross_el_qp(A, B) result(C) implicit none real(QP), dimension(:,:), intent(in) :: A, B real(QP), dimension(:,:), allocatable :: C @@ -128,7 +128,7 @@ module pure function operator_cross_el_qp(A, B) result(C) return end function operator_cross_el_qp - module pure function operator_cross_el_i1b(A, B) result(C) + pure module function operator_cross_el_i1b(A, B) result(C) implicit none integer(I1B), dimension(:,:), intent(in) :: A, B integer(I1B), dimension(:,:), allocatable :: C @@ -142,7 +142,7 @@ module pure function operator_cross_el_i1b(A, B) result(C) return end function operator_cross_el_i1b - module pure function operator_cross_el_i2b(A, B) result(C) + pure module function operator_cross_el_i2b(A, B) result(C) implicit none integer(I2B), dimension(:,:), intent(in) :: A, B integer(I2B), dimension(:,:), allocatable :: C @@ -156,7 +156,7 @@ module pure function operator_cross_el_i2b(A, B) result(C) return end function operator_cross_el_i2b - module pure function operator_cross_el_i4b(A, B) result(C) + pure module function operator_cross_el_i4b(A, B) result(C) implicit none integer(I4B), dimension(:,:), intent(in) :: A, B integer(I4B), dimension(:,:), allocatable :: C @@ -170,7 +170,7 @@ module pure function operator_cross_el_i4b(A, B) result(C) return end function operator_cross_el_i4b - module pure function operator_cross_el_i8b(A, B) result(C) + pure module function operator_cross_el_i8b(A, B) result(C) implicit none integer(I8B), dimension(:,:), intent(in) :: A, B integer(I8B), dimension(:,:), allocatable :: C diff --git a/src/operators/operator_mag.f90 b/src/operators/operator_mag.f90 index a40da7758..bea89d55b 100644 --- a/src/operators/operator_mag.f90 +++ b/src/operators/operator_mag.f90 @@ -15,7 +15,7 @@ !! Vector list implementations: B(:) = .mag. A(1:3, :) contains - module pure function operator_mag_sp(A) result(B) + pure module function operator_mag_sp(A) result(B) implicit none real(SP), dimension(:), intent(in) :: A real(SP) :: B @@ -23,7 +23,7 @@ module pure function operator_mag_sp(A) result(B) return end function operator_mag_sp - module pure function operator_mag_dp(A) result(B) + pure module function operator_mag_dp(A) result(B) implicit none real(DP), dimension(:), intent(in) :: A real(DP) :: B @@ -31,7 +31,7 @@ module pure function operator_mag_dp(A) result(B) return end function operator_mag_dp - module pure function operator_mag_el_sp(A) result(B) + pure module function operator_mag_el_sp(A) result(B) implicit none real(SP), dimension(:,:), intent(in) :: A real(SP), dimension(:), allocatable :: B @@ -45,7 +45,7 @@ module pure function operator_mag_el_sp(A) result(B) return end function operator_mag_el_sp - module pure function operator_mag_el_dp(A) result(B) + pure module function operator_mag_el_dp(A) result(B) implicit none real(DP), dimension(:,:), intent(in) :: A real(DP), dimension(:), allocatable :: B @@ -59,7 +59,7 @@ module pure function operator_mag_el_dp(A) result(B) return end function operator_mag_el_dp - module pure function operator_mag_el_qp(A) result(B) + pure module function operator_mag_el_qp(A) result(B) implicit none real(QP), dimension(:,:), intent(in) :: A real(QP), dimension(:), allocatable :: B diff --git a/src/orbel/orbel.f90 b/src/orbel/orbel.f90 index 13e99dc83..9dc68c397 100644 --- a/src/orbel/orbel.f90 +++ b/src/orbel/orbel.f90 @@ -137,7 +137,7 @@ pure subroutine orbel_el2xv(mu, a, ie, inc, capom, omega, capm, x, v) end subroutine orbel_el2xv - module pure subroutine orbel_scget(angle, sx, cx) + pure module subroutine orbel_scget(angle, sx, cx) !! author: David A. Minton !! !! Efficiently compute the sine and cosine of an input angle @@ -226,7 +226,6 @@ real(DP) pure function orbel_flon(e,icapn) real(DP) :: a,b,sq,biga,bigb, capn real(DP) :: x,x2 real(DP) :: f,fp,dx - real(DP) :: diff real(DP) :: a0,a1 real(DP) :: b1 integer(I4B), parameter :: IMAX = 10 @@ -692,7 +691,7 @@ real(DP) pure function orbel_fhybrid(e,n) end function orbel_fhybrid - module pure subroutine orbel_xv2aeq(mu, px, py, pz, vx, vy, vz, a, e, q) + pure module subroutine orbel_xv2aeq(mu, px, py, pz, vx, vy, vz, a, e, q) !! author: David A. Minton !! !! Compute semimajor axis, eccentricity, and pericentric distance from relative Cartesian position and velocity @@ -757,7 +756,7 @@ module pure subroutine orbel_xv2aeq(mu, px, py, pz, vx, vy, vz, a, e, q) end subroutine orbel_xv2aeq - module pure subroutine orbel_xv2aqt(mu, px, py, pz, vx, vy, vz, a, q, capm, tperi) + pure module subroutine orbel_xv2aqt(mu, px, py, pz, vx, vy, vz, a, q, capm, tperi) !! author: David A. Minton !! !! Compute semimajor axis, pericentric distance, mean anomaly, and time to nearest pericenter passage from @@ -897,7 +896,7 @@ module subroutine orbel_xv2el_vec(self, cb) end subroutine orbel_xv2el_vec - module pure subroutine orbel_xv2el(mu, px, py, pz, vx, vy, vz, a, e, inc, capom, omega, capm) + pure module subroutine orbel_xv2el(mu, px, py, pz, vx, vy, vz, a, e, inc, capom, omega, capm) !! author: David A. Minton !! !! Compute osculating orbital elements from relative Cartesian position and velocity diff --git a/src/rmvs/rmvs_encounter_check.f90 b/src/rmvs/rmvs_encounter_check.f90 index 3a8aa96f9..cf6b73624 100644 --- a/src/rmvs/rmvs_encounter_check.f90 +++ b/src/rmvs/rmvs_encounter_check.f90 @@ -27,11 +27,8 @@ module function rmvs_encounter_check_tp(self, param, system, dt) result(lencount ! Result logical :: lencounter !! Returns true if there is at least one close encounter ! Internals - integer(I4B) :: i, j + integer(I4B) :: i integer(I8B) :: nenc - real(DP) :: xr, yr, zr, vxr, vyr, vzr - real(DP), dimension(system%pl%nbody) :: rcrit - logical :: lflag logical, dimension(:), allocatable :: lvdotr integer(I4B), dimension(:), allocatable :: index1, index2 @@ -51,8 +48,8 @@ module function rmvs_encounter_check_tp(self, param, system, dt) result(lencount lencounter = (nenc > 0_I8B) if (lencounter) then tp%plencP(index2(1_I8B:nenc)) = index1(1_I8B:nenc) - do j = 1, npl - pl%nenc(j) = count(tp%plencP(1:ntp) == j) + do i = 1, npl + pl%nenc(i) = count(tp%plencP(1:ntp) == i) end do end if end associate diff --git a/src/rmvs/rmvs_setup.f90 b/src/rmvs/rmvs_setup.f90 index 388d17ca9..49cd102cc 100644 --- a/src/rmvs/rmvs_setup.f90 +++ b/src/rmvs/rmvs_setup.f90 @@ -23,7 +23,7 @@ module subroutine rmvs_setup_pl(self, n, param) integer(I4B), intent(in) :: n !! Number of particles to allocate space for class(swiftest_parameters), intent(in) :: param !! Current run configuration parameter ! Internals - integer(I4B) :: i,j + integer(I4B) :: i !> Call allocation method for parent class associate(pl => self) diff --git a/src/rmvs/rmvs_step.f90 b/src/rmvs/rmvs_step.f90 index 92df6df91..c341d7d41 100644 --- a/src/rmvs/rmvs_step.f90 +++ b/src/rmvs/rmvs_step.f90 @@ -25,10 +25,8 @@ module subroutine rmvs_step_system(self, param, t, dt) real(DP), intent(in) :: t !! Current simulation time real(DP), intent(in) :: dt !! Current stepsiz ! Internals - logical :: lencounter, lfirstpl, lfirsttp - real(DP) :: rts + logical :: lencounter, lfirstpl real(DP), dimension(:,:), allocatable :: xbeg, xend, vbeg - integer(I4B) :: i if (self%tp%nbody == 0) then call whm_step_system(self, param, t, dt) @@ -173,8 +171,8 @@ subroutine rmvs_step_out(cb, pl, tp, system, param, t, dt) real(DP), intent(in) :: t !! Current simulation time real(DP), intent(in) :: dt !! Current stepsiz ! Internals - integer(I4B) :: outer_index, j, k - real(DP) :: dto, outer_time, rts + integer(I4B) :: outer_index, j + real(DP) :: dto, outer_time logical :: lencounter, lfirsttp associate(npl => pl%nbody, ntp => tp%nbody) @@ -363,7 +361,7 @@ subroutine rmvs_step_in(cb, pl, tp, param, outer_time, dto) real(DP), intent(in) :: dto !! Outer step size ! Internals logical :: lfirsttp - integer(I4B) :: i, j, ipleP + integer(I4B) :: i, j real(DP) :: dti, inner_time associate(npl => pl%nbody) diff --git a/src/rmvs/rmvs_util.f90 b/src/rmvs/rmvs_util.f90 index 517c8b0bf..0fc1ed272 100644 --- a/src/rmvs/rmvs_util.f90 +++ b/src/rmvs/rmvs_util.f90 @@ -157,8 +157,6 @@ module subroutine rmvs_util_fill_pl(self, inserts, lfill_list) class(rmvs_pl), intent(inout) :: self !! RMVS massive body object class(swiftest_body), intent(in) :: inserts !! Inserted object logical, dimension(:), intent(in) :: lfill_list !! Logical array of bodies to merge into the keeps - ! Internals - integer(I4B) :: i associate(keeps => self) select type(inserts) @@ -472,8 +470,6 @@ module subroutine rmvs_util_spill_pl(self, discards, lspill_list, ldestructive) class(swiftest_body), intent(inout) :: discards !! Discarded object logical, dimension(:), intent(in) :: lspill_list !! Logical array of bodies to spill into the discards logical, intent(in) :: ldestructive !! Logical flag indicating whether or not this operation should alter the keeps array or not - ! Internals - integer(I4B) :: i associate(keeps => self) select type(discards) @@ -505,8 +501,6 @@ module subroutine rmvs_util_spill_tp(self, discards, lspill_list, ldestructive) class(swiftest_body), intent(inout) :: discards !! Discarded object logical, dimension(:), intent(in) :: lspill_list !! Logical array of bodies to spill into the discards logical, intent(in) :: ldestructive !! Logical flag indicating whether or not this operation should alter the keeps array or not - ! Internals - integer(I4B) :: i associate(keeps => self) select type(discards) diff --git a/src/setup/setup.f90 b/src/setup/setup.f90 index 348425fac..859e8c6ba 100644 --- a/src/setup/setup.f90 +++ b/src/setup/setup.f90 @@ -89,7 +89,6 @@ module subroutine setup_finalize_system(self, param) ! Arguments class(swiftest_nbody_system), intent(inout) :: self !! Swiftest system object class(swiftest_parameters), intent(inout) :: param !! Current run configuration parameters - integer(I4B) :: ierr associate(system => self) if ((param%out_type == NETCDF_FLOAT_TYPE) .or. (param%out_type == NETCDF_DOUBLE_TYPE)) then @@ -141,7 +140,6 @@ module subroutine setup_initialize_system(self, param) ! Arguments class(swiftest_nbody_system), intent(inout) :: self !! Swiftest system object class(swiftest_parameters), intent(inout) :: param !! Current run configuration parameters - integer(I4B) :: ierr associate(system => self, cb => self%cb, pl => self%pl, tp => self%tp) diff --git a/src/symba/symba_collision.f90 b/src/symba/symba_collision.f90 index 7e6b872ac..0e47e8c24 100644 --- a/src/symba/symba_collision.f90 +++ b/src/symba/symba_collision.f90 @@ -92,7 +92,6 @@ module function symba_collision_casehitandrun(system, param, colliders, frag) r integer(I4B) :: i, ibiggest, nfrag, jtarg, jproj logical :: lpure character(len=STRMAX) :: message - character(len=NAMELEN) :: idstr message = "Hit and run between" call symba_collision_collider_message(system%pl, colliders%idx, message) @@ -165,10 +164,8 @@ module function symba_collision_casemerge(system, param, colliders, frag) resul integer(I4B) :: status !! Status flag assigned to this outcome ! Internals integer(I4B) :: i, j, k, ibiggest - real(DP), dimension(2) :: volume, density real(DP) :: pe real(DP), dimension(NDIM) :: L_spin_new - character(len=NAMELEN) :: idstr character(len=STRMAX) :: message message = "Merging" @@ -460,7 +457,7 @@ function symba_collision_consolidate_colliders(pl, cb, param, idx_parent, collid integer(I4B), dimension(2) :: nchild integer(I4B) :: i, j, ncolliders, idx_child real(DP), dimension(2) :: volume, density - real(DP) :: mchild, mtot, volchild + real(DP) :: mchild, volchild real(DP), dimension(NDIM) :: xc, vc, xcom, vcom, xchild, vchild, xcrossv real(DP), dimension(NDIM,2) :: mxc, vcc @@ -724,7 +721,6 @@ subroutine symba_collision_mergeaddsub(system, param, colliders, frag, status) class(symba_pl), allocatable :: plnew, plsub character(*), parameter :: FRAGFMT = '("Newbody",I0.7)' character(len=NAMELEN) :: newname - character(len=STRMAX) :: message select type(pl => system%pl) class is (symba_pl) @@ -894,8 +890,6 @@ module subroutine symba_collision_resolve_fragmentations(self, system, param) ! Internals ! Internals integer(I4B), dimension(2) :: idx_parent !! Index of the two bodies considered the "parents" of the collision - real(DP), dimension(NDIM,2) :: x, v, L_spin, Ip !! Output values that represent a 2-body equivalent of a possibly 2+ body collision - real(DP), dimension(2) :: mass, radius !! Output values that represent a 2-body equivalent of a possibly 2+ body collision logical :: lgoodcollision integer(I4B) :: i type(fraggle_colliders) :: colliders !! Fraggle colliders object @@ -946,8 +940,6 @@ module subroutine symba_collision_resolve_mergers(self, system, param) class(symba_parameters), intent(inout) :: param !! Current run configuration parameters with SyMBA additions ! Internals integer(I4B), dimension(2) :: idx_parent !! Index of the two bodies considered the "parents" of the collision - real(DP), dimension(NDIM,2) :: x, v, L_spin, Ip !! Output values that represent a 2-body equivalent of a possibly 2+ body collision - real(DP), dimension(2) :: mass, radius !! Output values that represent a 2-body equivalent of a possibly 2+ body collision logical :: lgoodcollision integer(I4B) :: i type(fraggle_colliders) :: colliders !! Fraggle colliders object diff --git a/src/symba/symba_discard.f90 b/src/symba/symba_discard.f90 index fe23bf75c..f60b91a28 100644 --- a/src/symba/symba_discard.f90 +++ b/src/symba/symba_discard.f90 @@ -27,7 +27,7 @@ subroutine symba_discard_cb_pl(pl, system, param) class(swiftest_nbody_system), intent(inout) :: system !! Swiftest nbody system object class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters ! Internals - integer(I4B) :: i, j + integer(I4B) :: i real(DP) :: energy, vb2, rb2, rh2, rmin2, rmax2, rmaxu2 character(len=STRMAX) :: idstr, timestr, message diff --git a/src/symba/symba_encounter_check.f90 b/src/symba/symba_encounter_check.f90 index fdf41f34f..035d7fd3c 100644 --- a/src/symba/symba_encounter_check.f90 +++ b/src/symba/symba_encounter_check.f90 @@ -26,14 +26,10 @@ module function symba_encounter_check_pl(self, param, system, dt, irec) result(l ! Result logical :: lany_encounter !! Returns true if there is at least one close encounter ! Internals - integer(I8B) :: k, nplplm, kenc, nenc + integer(I8B) :: k, nenc integer(I4B) :: i, j, npl, nplm, nplt - logical, dimension(:), allocatable :: lencounter, loc_lvdotr, lvdotr + logical, dimension(:), allocatable :: lvdotr integer(I4B), dimension(:), allocatable :: index1, index2 - integer(I4B), dimension(:,:), allocatable :: k_plpl_enc - type(interaction_timer), save :: itimer - logical, save :: lfirst = .true. - type(walltimer) :: timer lany_encounter = .false. if (self%nbody == 0) return @@ -207,11 +203,8 @@ module function symba_encounter_check_tp(self, param, system, dt, irec) result(l ! Result logical :: lany_encounter !! Returns true if there is at least one close encounter ! Internals - real(DP) :: r2crit, vdotr, r2, v2, tmin, r2min, term2 - integer(I4B) :: i, j, plind, tpind + integer(I4B) :: plind, tpind integer(I8B) :: k, nenc - real(DP), dimension(NDIM) :: xr, vr - real(DP) :: rshell_irec logical, dimension(:), allocatable :: lvdotr integer(I4B), dimension(:), allocatable :: index1, index2 diff --git a/src/symba/symba_gr.f90 b/src/symba/symba_gr.f90 index 7d423d3fc..fea0f46d9 100644 --- a/src/symba/symba_gr.f90 +++ b/src/symba/symba_gr.f90 @@ -11,7 +11,7 @@ use swiftest contains - module pure subroutine symba_gr_p4_pl(self, system, param, dt) + pure module subroutine symba_gr_p4_pl(self, system, param, dt) !! author: David A. Minton !! !! Position kick to massive bodies due to p**4 term in the post-Newtonian correction @@ -40,7 +40,7 @@ module pure subroutine symba_gr_p4_pl(self, system, param, dt) end subroutine symba_gr_p4_pl - module pure subroutine symba_gr_p4_tp(self, system, param, dt) + pure module subroutine symba_gr_p4_tp(self, system, param, dt) !! author: David A. Minton !! !! Position kick to test particles due to p**4 term in the post-Newtonian correction @@ -53,8 +53,6 @@ module pure subroutine symba_gr_p4_tp(self, system, param, dt) class(swiftest_nbody_system), intent(inout) :: system !! Swiftest nbody system object class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters real(DP), intent(in) :: dt !! Step size - ! Internals - integer(I4B) :: i if (self%nbody == 0) return diff --git a/src/symba/symba_io.f90 b/src/symba/symba_io.f90 index 66dd2a295..7f2792309 100644 --- a/src/symba/symba_io.f90 +++ b/src/symba/symba_io.f90 @@ -176,13 +176,11 @@ module subroutine symba_io_write_discard(self, param) ! Internals integer(I4B) :: iadd, isub, j, nsub, nadd logical, save :: lfirst = .true. - real(DP), dimension(:,:), allocatable :: vh character(*), parameter :: HDRFMT = '(E23.16, 1X, I8, 1X, L1)' character(*), parameter :: NAMEFMT = '(A, 2(1X, I8))' character(*), parameter :: VECFMT = '(3(E23.16, 1X))' character(*), parameter :: NPLFMT = '(I8)' character(*), parameter :: PLNAMEFMT = '(I8, 2(1X, E23.16))' - class(swiftest_body), allocatable :: pltemp character(STRMAX) :: errmsg, out_stat associate(pl => self%pl, npl => self%pl%nbody, pl_adds => self%pl_adds) diff --git a/src/symba/symba_kick.f90 b/src/symba/symba_kick.f90 index 7421004b9..476fd1697 100644 --- a/src/symba/symba_kick.f90 +++ b/src/symba/symba_kick.f90 @@ -70,9 +70,7 @@ module subroutine symba_kick_getacch_pl(self, system, param, t, lbeg) real(DP), intent(in) :: t !! Current simulation time logical, intent(in) :: lbeg !! Logical flag that determines whether or not this is the beginning or end of the step ! Internals - integer(I4B) :: i, j integer(I8B) :: nplplenc - real(DP) :: rjj, rlim2, xr, yr, zr real(DP), dimension(NDIM,self%nbody) :: ah_enc integer(I4B), dimension(:,:), allocatable :: k_plpl_enc @@ -116,7 +114,7 @@ module subroutine symba_kick_getacch_tp(self, system, param, t, lbeg) logical, intent(in) :: lbeg !! Logical flag that determines whether or not this is the beginning or end of the step ! Internals integer(I4B) :: i, j, k - real(DP) :: rjj, fac, rlim2 + real(DP) :: rjj, fac real(DP), dimension(NDIM) :: dx if (self%nbody == 0) return diff --git a/src/symba/symba_setup.f90 b/src/symba/symba_setup.f90 index deee3e1f0..9187e4457 100644 --- a/src/symba/symba_setup.f90 +++ b/src/symba/symba_setup.f90 @@ -21,8 +21,6 @@ module subroutine symba_setup_initialize_system(self, param) ! Arguments class(symba_nbody_system), intent(inout) :: self !! SyMBA system object class(swiftest_parameters), intent(inout) :: param !! Current run configuration parameters - ! Internals - integer(I4B) :: i, j ! Call parent method associate(system => self) @@ -47,8 +45,6 @@ module subroutine symba_setup_merger(self, n, param) class(symba_merger), intent(inout) :: self !! SyMBA merger list object integer(I4B), intent(in) :: n !! Number of particles to allocate space for class(swiftest_parameters), intent(in) :: param !! Current run configuration parameter - ! Internals - integer(I4B) :: i !> Call allocation method for parent class. In this case, helio_pl does not have its own setup method so we use the base method for swiftest_pl call symba_setup_pl(self, n, param) diff --git a/src/symba/symba_step.f90 b/src/symba/symba_step.f90 index a9cb70a80..e24eeec31 100644 --- a/src/symba/symba_step.f90 +++ b/src/symba/symba_step.f90 @@ -126,7 +126,7 @@ module subroutine symba_step_set_recur_levels_system(self, ireci) class(symba_nbody_system), intent(inout) :: self !! SyMBA nbody system object integer(I4B), intent(in) :: ireci !! Input recursion level ! Internals - integer(I4B) :: k, irecp + integer(I4B) :: irecp associate(system => self, plplenc_list => self%plplenc_list, pltpenc_list => self%pltpenc_list, & npl => self%pl%nbody, ntp => self%tp%nbody) @@ -159,7 +159,7 @@ module subroutine symba_step_set_recur_levels_system(self, ireci) end subroutine symba_step_set_recur_levels_system - module recursive subroutine symba_step_recur_system(self, param, t, ireci) + recursive module subroutine symba_step_recur_system(self, param, t, ireci) !! author: David A. Minton !! !! Step interacting planets and active test particles ahead in democratic heliocentric coordinates at the current @@ -174,9 +174,8 @@ module recursive subroutine symba_step_recur_system(self, param, t, ireci) real(DP), intent(in) :: t integer(I4B), intent(in) :: ireci !! input recursion level ! Internals - integer(I4B) :: i, j, irecp, nloops + integer(I4B) :: j, irecp, nloops real(DP) :: dtl, dth - real(DP), dimension(NDIM) :: xr, vr logical :: lencounter, lplpl_collision, lpltp_collision associate(system => self, plplenc_list => self%plplenc_list, pltpenc_list => self%pltpenc_list) diff --git a/src/symba/symba_util.f90 b/src/symba/symba_util.f90 index 23a839554..8d110451f 100644 --- a/src/symba/symba_util.f90 +++ b/src/symba/symba_util.f90 @@ -411,8 +411,7 @@ module subroutine symba_util_flatten_eucl_plpl(self, param) class(symba_pl), intent(inout) :: self !! SyMBA massive body object class(swiftest_parameters), intent(inout) :: param !! Current run configuration parameters ! Internals - integer(I8B) :: k, npl, nplm - integer(I4B) :: i, j, err + integer(I8B) :: npl, nplm associate(pl => self, nplplm => self%nplplm) npl = int(self%nbody, kind=I8B) @@ -609,7 +608,7 @@ module subroutine symba_util_rearray_pl(self, system, param) class(symba_parameters), intent(inout) :: param !! Current run configuration parameters ! Internals class(symba_pl), allocatable :: tmp !! The discarded body list. - integer(I4B) :: i, j, k, npl, nadd, nencmin, nenc_old, idnew1, idnew2, idold1, idold2 + integer(I4B) :: i, k, npl, nadd, nencmin, nenc_old, idnew1, idnew2, idold1, idold2 logical, dimension(:), allocatable :: lmask, ldump_mask class(symba_plplenc), allocatable :: plplenc_old logical :: lencounter @@ -1053,8 +1052,6 @@ module subroutine symba_util_sort_rearrange_pl(self, ind) ! Arguments class(symba_pl), intent(inout) :: self !! SyMBA massive body object integer(I4B), dimension(:), intent(in) :: ind !! Index array used to restructure the body (should contain all 1:n index values in the desired order) - ! Internals - integer(I4B) :: i, j associate(pl => self, npl => self%nbody) call util_sort_rearrange(pl%lcollision, ind, npl) diff --git a/src/util/util_fill.f90 b/src/util/util_fill.f90 index 4ae8f82e0..deb78f4ee 100644 --- a/src/util/util_fill.f90 +++ b/src/util/util_fill.f90 @@ -150,8 +150,6 @@ module subroutine util_fill_body(self, inserts, lfill_list) class(swiftest_body), intent(inout) :: self !! Swiftest generic body object class(swiftest_body), intent(in) :: inserts !! Inserted object logical, dimension(:), intent(in) :: lfill_list !! Logical array of bodies to merge into the keeps - ! internals - integer(I4B) :: i ! For each component, pack the discarded bodies into the discard object and do the inverse with the keeps !> Fill all the common components @@ -195,8 +193,6 @@ module subroutine util_fill_pl(self, inserts, lfill_list) class(swiftest_pl), intent(inout) :: self !! Swiftest massive body object class(swiftest_body), intent(in) :: inserts !! Swiftest body object to be inserted logical, dimension(:), intent(in) :: lfill_list !! Logical array of bodies to merge into the keeps - ! Internals - integer(I4B) :: i associate(keeps => self) diff --git a/src/util/util_flatten.f90 b/src/util/util_flatten.f90 index ee7a65355..36fee2489 100644 --- a/src/util/util_flatten.f90 +++ b/src/util/util_flatten.f90 @@ -11,7 +11,7 @@ use swiftest contains - module pure subroutine util_flatten_eucl_ij_to_k(n, i, j, k) + pure module subroutine util_flatten_eucl_ij_to_k(n, i, j, k) !! author: Jacob R. Elliott and David A. Minton !! !! Turns i,j indices into k index for use in the Euclidean distance matrix for pl-pl interactions. @@ -38,7 +38,7 @@ module pure subroutine util_flatten_eucl_ij_to_k(n, i, j, k) end subroutine util_flatten_eucl_ij_to_k - module pure subroutine util_flatten_eucl_k_to_ij(n, k, i, j) + pure module subroutine util_flatten_eucl_k_to_ij(n, k, i, j) !! author: Jacob R. Elliott and David A. Minton !! !! Turns k index into i,j indices for use in the Euclidean distance matrix for pl-pl interactions. diff --git a/src/util/util_get_energy_momentum.f90 b/src/util/util_get_energy_momentum.f90 index 0761b64a2..621ea80a6 100644 --- a/src/util/util_get_energy_momentum.f90 +++ b/src/util/util_get_energy_momentum.f90 @@ -22,10 +22,10 @@ module subroutine util_get_energy_momentum_system(self, param) class(swiftest_nbody_system), intent(inout) :: self !! Swiftest nbody system object class(swiftest_parameters), intent(in) :: param !! Current run configuration parameters ! Internals - integer(I4B) :: i, j - integer(I8B) :: k, nplpl - real(DP) :: oblpot, kecb, kespincb - real(DP), dimension(self%pl%nbody) :: irh, kepl, kespinpl + integer(I4B) :: i + integer(I8B) :: nplpl + real(DP) :: kecb, kespincb + real(DP), dimension(self%pl%nbody) :: kepl, kespinpl real(DP), dimension(self%pl%nbody) :: Lplorbitx, Lplorbity, Lplorbitz real(DP), dimension(self%pl%nbody) :: Lplspinx, Lplspiny, Lplspinz real(DP), dimension(NDIM) :: Lcborbit, Lcbspin diff --git a/src/util/util_minimize_bfgs.f90 b/src/util/util_minimize_bfgs.f90 index 6fcacad6f..cd9e8f8bc 100644 --- a/src/util/util_minimize_bfgs.f90 +++ b/src/util/util_minimize_bfgs.f90 @@ -38,7 +38,7 @@ module function util_minimize_bfgs(f, N, x0, eps, maxloop, lerr) result(x1) ! Result real(DP), dimension(:), allocatable :: x1 ! Internals - integer(I4B) :: i, j, k, l, conv, num + integer(I4B) :: i, j, k, l, conv real(DP), parameter :: graddelta = 1e-4_DP !! Delta x for gradient calculations real(DP), dimension(N) :: S !! Direction vectors real(DP), dimension(N,N) :: H !! Approximated inverse Hessian matrix diff --git a/src/util/util_solve.f90 b/src/util/util_solve.f90 index 7d38b08c9..2480eae46 100644 --- a/src/util/util_solve.f90 +++ b/src/util/util_solve.f90 @@ -179,7 +179,7 @@ module function util_solve_rkf45(f, y0in, t1, dt0, tol) result(y1) integer(I4B) :: rkn !! Runge-Kutta loop index real(DP) :: t, x1, dt, trem !! Current time, step size and total time remaining real(DP) :: s, yerr, yscale !! Step size reduction factor, error in dependent variable, and error scale factor - integer(I4B) :: i, n + integer(I4B) :: i allocate(y0, source=y0in) allocate(y1, mold=y0) diff --git a/src/util/util_sort.f90 b/src/util/util_sort.f90 index 66e7fc6fd..dde5d7dfe 100644 --- a/src/util/util_sort.f90 +++ b/src/util/util_sort.f90 @@ -66,7 +66,7 @@ module subroutine util_sort_body(self, sortby, ascending) end subroutine util_sort_body - module pure subroutine util_sort_dp(arr) + pure module subroutine util_sort_dp(arr) !! author: David A. Minton !! !! Sort input DP precision array in place into ascending numerical order using quicksort. @@ -81,7 +81,7 @@ module pure subroutine util_sort_dp(arr) end subroutine util_sort_dp - module pure subroutine util_sort_index_dp(arr, ind) + pure module subroutine util_sort_index_dp(arr, ind) !! author: David A. Minton !! !! Sort input DP precision array by index in ascending numerical order using quick sort. @@ -195,7 +195,7 @@ pure subroutine partition_DP(arr, marker, ind) end subroutine partition_DP - module pure subroutine util_sort_i4b(arr) + pure module subroutine util_sort_i4b(arr) !! author: David A. Minton !! !! Sort input integer array in place into ascending numerical order using quick sort. @@ -211,7 +211,7 @@ module pure subroutine util_sort_i4b(arr) end subroutine util_sort_i4b - module pure subroutine util_sort_index_I4B(arr, ind) + pure module subroutine util_sort_index_I4B(arr, ind) !! author: David A. Minton !! !! Sort input integer array by index in ascending numerical order using quicksort. @@ -239,7 +239,7 @@ module pure subroutine util_sort_index_I4B(arr, ind) end subroutine util_sort_index_I4B - module pure subroutine util_sort_index_I4B_I8Bind(arr, ind) + pure module subroutine util_sort_index_I4B_I8Bind(arr, ind) !! author: David A. Minton !! !! Sort input integer array by index in ascending numerical order using quicksort. @@ -519,7 +519,7 @@ pure subroutine partition_I8B_I8Bind(arr, marker, ind) end subroutine partition_I8B_I8Bind - module pure subroutine util_sort_sp(arr) + pure module subroutine util_sort_sp(arr) !! author: David A. Minton !! !! Sort input DP precision array in place into ascending numerical order using quicksort. @@ -534,7 +534,7 @@ module pure subroutine util_sort_sp(arr) end subroutine util_sort_sp - module pure subroutine util_sort_index_sp(arr, ind) + pure module subroutine util_sort_index_sp(arr, ind) !! author: David A. Minton !! !! Sort input DP precision array by index in ascending numerical order using quicksort. @@ -783,7 +783,7 @@ module subroutine util_sort_rearrange_body(self, ind) end subroutine util_sort_rearrange_body - module pure subroutine util_sort_rearrange_arr_char_string(arr, ind, n) + pure module subroutine util_sort_rearrange_arr_char_string(arr, ind, n) !! author: David A. Minton !! !! Rearrange a single array of character string in-place from an index list. @@ -804,7 +804,7 @@ module pure subroutine util_sort_rearrange_arr_char_string(arr, ind, n) end subroutine util_sort_rearrange_arr_char_string - module pure subroutine util_sort_rearrange_arr_DP(arr, ind, n) + pure module subroutine util_sort_rearrange_arr_DP(arr, ind, n) !! author: David A. Minton !! !! Rearrange a single array of DP type in-place from an index list. @@ -825,7 +825,7 @@ module pure subroutine util_sort_rearrange_arr_DP(arr, ind, n) end subroutine util_sort_rearrange_arr_DP - module pure subroutine util_sort_rearrange_arr_DPvec(arr, ind, n) + pure module subroutine util_sort_rearrange_arr_DPvec(arr, ind, n) !! author: David A. Minton !! !! Rearrange a single array of (NDIM,n) DP-type vectors in-place from an index list. @@ -846,7 +846,7 @@ module pure subroutine util_sort_rearrange_arr_DPvec(arr, ind, n) end subroutine util_sort_rearrange_arr_DPvec - module pure subroutine util_sort_rearrange_arr_I4B(arr, ind, n) + pure module subroutine util_sort_rearrange_arr_I4B(arr, ind, n) !! author: David A. Minton !! !! Rearrange a single array of integers in-place from an index list. @@ -866,7 +866,7 @@ module pure subroutine util_sort_rearrange_arr_I4B(arr, ind, n) return end subroutine util_sort_rearrange_arr_I4B - module pure subroutine util_sort_rearrange_arr_I4B_I8Bind(arr, ind, n) + pure module subroutine util_sort_rearrange_arr_I4B_I8Bind(arr, ind, n) !! author: David A. Minton !! !! Rearrange a single array of integers in-place from an index list. @@ -887,7 +887,7 @@ module pure subroutine util_sort_rearrange_arr_I4B_I8Bind(arr, ind, n) end subroutine util_sort_rearrange_arr_I4B_I8Bind - module pure subroutine util_sort_rearrange_arr_logical(arr, ind, n) + pure module subroutine util_sort_rearrange_arr_logical(arr, ind, n) !! author: David A. Minton !! !! Rearrange a single array of logicals in-place from an index list. @@ -908,7 +908,7 @@ module pure subroutine util_sort_rearrange_arr_logical(arr, ind, n) end subroutine util_sort_rearrange_arr_logical - module pure subroutine util_sort_rearrange_arr_logical_I8Bind(arr, ind, n) + pure module subroutine util_sort_rearrange_arr_logical_I8Bind(arr, ind, n) !! author: David A. Minton !! !! Rearrange a single array of logicals in-place from an index list. @@ -940,8 +940,6 @@ module subroutine util_sort_rearrange_arr_info(arr, ind, n) integer(I4B), intent(in) :: n !! Number of elements in arr and ind to rearrange ! Internals type(swiftest_particle_info), dimension(:), allocatable :: tmp !! Temporary copy of array used during rearrange operation - integer(I4B) :: i - if (.not. allocated(arr) .or. n <= 0) return allocate(tmp, mold=arr) diff --git a/src/walltime/walltime.f90 b/src/walltime/walltime.f90 index 8b0f5ca94..6c53e2276 100644 --- a/src/walltime/walltime.f90 +++ b/src/walltime/walltime.f90 @@ -89,8 +89,6 @@ module subroutine walltime_reset(self) ! Arguments class(walltimer), intent(inout) :: self !! Walltimer object ! Internals - integer(I8B) :: count_delta - self%is_paused = .false. self%wall_step = 0.0_DP @@ -156,7 +154,7 @@ module subroutine walltime_interaction_adapt(self, param, ninteractions, pl) integer(I8B), intent(in) :: ninteractions !! Current number of interactions (used to normalize the timed loop and to determine if number of interactions has changed since the last timing class(swiftest_pl), intent(inout), optional :: pl !! Swiftest massive body object ! Internals - character(len=STRMAX) :: tstr, nstr, cstr, mstr + character(len=STRMAX) :: nstr, cstr, mstr character(len=11) :: lstyle, advancedstyle, standardstyle character(len=1) :: schar logical :: ladvanced_final @@ -242,8 +240,6 @@ module function walltime_interaction_check(self, param, ninteractions) result(lt class(swiftest_parameters), intent(inout) :: param !! Current run configuration parameters integer(I8B), intent(in) :: ninteractions !! Current number of interactions (used to normalize the timed loop and to determine if number of interactions has changed since the last timing logical :: ltimeit !! Logical flag indicating whether this loop should be timed or not - ! Internals - character(len=STRMAX) :: tstring if (self%is_on) then ! Entering the second stage of the loop timing. Therefore we will swap the interaction style and time this loop self%stage = self%stage + 1 diff --git a/src/whm/whm_gr.f90 b/src/whm/whm_gr.f90 index be6bf42be..02dc7d4a4 100644 --- a/src/whm/whm_gr.f90 +++ b/src/whm/whm_gr.f90 @@ -11,7 +11,7 @@ use swiftest contains - module pure subroutine whm_gr_kick_getacch_pl(self, param) + pure module subroutine whm_gr_kick_getacch_pl(self, param) !! author: David A. Minton !! !! Compute relativisitic accelerations of massive bodies @@ -44,7 +44,7 @@ module pure subroutine whm_gr_kick_getacch_pl(self, param) end subroutine whm_gr_kick_getacch_pl - module pure subroutine whm_gr_kick_getacch_tp(self, param) + pure module subroutine whm_gr_kick_getacch_tp(self, param) !! author: David A. Minton !! !! Compute relativisitic accelerations of test particles @@ -70,7 +70,7 @@ module pure subroutine whm_gr_kick_getacch_tp(self, param) end subroutine whm_gr_kick_getacch_tp - module pure subroutine whm_gr_p4_pl(self, system, param, dt) + pure module subroutine whm_gr_p4_pl(self, system, param, dt) !! author: David A. Minton !! !! Position kick to massive bodies due to p**4 term in the post-Newtonian correction @@ -97,7 +97,7 @@ module pure subroutine whm_gr_p4_pl(self, system, param, dt) end subroutine whm_gr_p4_pl - module pure subroutine whm_gr_p4_tp(self, system, param, dt) + pure module subroutine whm_gr_p4_tp(self, system, param, dt) !! author: David A. Minton !! !! Position kick to test particles due to p**4 term in the post-Newtonian correction diff --git a/src/whm/whm_util.f90 b/src/whm/whm_util.f90 index cf6d800ab..2143cf0e9 100644 --- a/src/whm/whm_util.f90 +++ b/src/whm/whm_util.f90 @@ -74,8 +74,6 @@ module subroutine whm_util_fill_pl(self, inserts, lfill_list) class(whm_pl), intent(inout) :: self !! WHM massive body object class(swiftest_body), intent(in) :: inserts !! inserted object logical, dimension(:), intent(in) :: lfill_list !! Logical array of bodies to merge into the keeps - ! Internals - integer(I4B) :: i associate(keeps => self) select type(inserts) @@ -268,8 +266,7 @@ module subroutine whm_util_spill_pl(self, discards, lspill_list, ldestructive) class(swiftest_body), intent(inout) :: discards !! Discarded object logical, dimension(:), intent(in) :: lspill_list !! Logical array of bodies to spill into the discards logical, intent(in) :: ldestructive !! Logical flag indicating whether or not this operation should alter the keeps array or not - ! Internals - integer(I4B) :: i + associate(keeps => self) select type(discards) class is (whm_pl)