From 9d4e26f2ab99ea22069c3874a180d7193459f4b7 Mon Sep 17 00:00:00 2001 From: matekelemen Date: Thu, 2 Nov 2023 09:33:25 +0100 Subject: [PATCH 01/65] fix mac build script --- scripts/mac_build | 34 ++++++++++++++++++++++++---------- 1 file changed, 24 insertions(+), 10 deletions(-) diff --git a/scripts/mac_build b/scripts/mac_build index 0b4f485a1d2e..4388b68260c8 100755 --- a/scripts/mac_build +++ b/scripts/mac_build @@ -8,12 +8,14 @@ script_name="$(basename ${BASH_SOURCE[0]})" # Function for printing usage info print_help() { echo "$script_name - Configure, build, and install KratosMultiphysics." + echo "Usage: $script_name [-h] [-C] [-b ] [-i ] [-t ] [-a ] [-o ]" echo "-h : print this help and exit" echo "-C : clean build and install directories, then exit" - echo "-b build_path : path to the build directory (created if it does not exist yet)" - echo "-i install_path : path to the install directory (created if it does not exist yet)" - echo "-t build_type : build type [FullDebug, Debug, Release, RelWithDebInfo] (Default: Release)" - echo "-a application_name : name of the application to build (can be passed repeatedly to add more applications)" + echo "-b : path to the build directory (created if it does not exist yet)" + echo "-i : path to the install directory (created if it does not exist yet)" + echo "-t : build type [FullDebug, Debug, Release, RelWithDebInfo] (Default: Release)" + echo "-a : name of the application to build (can be passed repeatedly to add more applications)" + echo "-o : options/arguments to pass on to CMake. Semicolon (;) delimited, or defined repeatedly." echo echo "This script provides a build environment for KratosMultiphysics targeting systems running on Apple Silicon." echo "The interface is minimal, so users seeking more control over the build process are invited to tweak this" @@ -94,7 +96,7 @@ add_app() { } # Parse command line arguments -while getopts "hCb:i:t:a:" arg; do +while getopts ":h C b: i: t: a:" arg; do case "$arg" in h) # Print help and exit without doing anything print_help @@ -111,13 +113,20 @@ while getopts "hCb:i:t:a:" arg; do ;; t) # Set build type build_type="$OPTARG" - (("${build_type}" == "FullDebug" || "${build_type}" == "Debug" || "${build_type}" == "RelWithDebInfo" || "${build_type}" == "Release")) || (print_help && echo "Error: invalid build type: ${build_type}" && exit 1) + if [[ "${build_type}" == "FullDebug" + || "${build_type}" == "Debug" + || "${build_type}" == "RelWithDebInfo" + || "${build_type}" == "Release" ]]; then + print_help + echo "Error: invalid build type: ${build_type}" + exit 1 + fi ;; a) # Add application add_app "$OPTARG" ;; \?) # Unrecognized argumnet - echo "Error: unrecognized argument: $arg" + echo "Error: unrecognized argument: $OPTARG" exit 1 esac done @@ -215,6 +224,12 @@ if [ ! -d "$build_dir" ]; then mkdir -p "$build_dir" fi +# Symlink python scripts to the install directory +# instead of copying them. Unset this option if you +# need multiple versions of Kratos installed at the +# same time. +export KRATOS_INSTALL_PYTHON_USING_LINKS=ON + # Configure if ! cmake \ "-H$source_dir" \ @@ -233,15 +248,14 @@ if ! cmake \ "-DUSE_MPI:BOOL=$mpi_flag" \ "-DUSE_EIGEN_MKL:BOOL=OFF" \ "-DKRATOS_GENERATE_PYTHON_STUBS:BOOL=ON" \ - "-DKRATOS_INSTALL_PYTHON_USING_LINKS:BOOL=ON" \ "-DKRATOS_ENABLE_PROFILING:BOOL=OFF" \ ; then - exit $? + exit 1 fi # Build and install if ! cmake --build "$build_dir" --target install -j; then - exit $? + exit 1 fi exit 0 From 8cd89fb0a4f8a2aae79748098ab8db5bcc1a8e94 Mon Sep 17 00:00:00 2001 From: matekelemen Date: Thu, 2 Nov 2023 09:40:25 +0100 Subject: [PATCH 02/65] missing dash --- scripts/mac_build | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/mac_build b/scripts/mac_build index 4388b68260c8..7e999c80b80b 100755 --- a/scripts/mac_build +++ b/scripts/mac_build @@ -126,7 +126,7 @@ while getopts ":h C b: i: t: a:" arg; do add_app "$OPTARG" ;; \?) # Unrecognized argumnet - echo "Error: unrecognized argument: $OPTARG" + echo "Error: unrecognized argument: -$OPTARG" exit 1 esac done From 06d16ca628a796ab241b01dfd18cf10899bb0d55 Mon Sep 17 00:00:00 2001 From: matekelemen Date: Thu, 2 Nov 2023 09:53:48 +0100 Subject: [PATCH 03/65] pass cmake options and clear cmake's cache --- scripts/mac_build | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/scripts/mac_build b/scripts/mac_build index 7e999c80b80b..b6276c3e1bbb 100755 --- a/scripts/mac_build +++ b/scripts/mac_build @@ -78,6 +78,7 @@ build_dir="${source_dir}/build" # <== path to the build directory install_dir="$(get_site_packages_dir)" # <== path to install kratos to clean=0 # <== clean the build and install directories, then exit app_names="" # <== list of app names to build +cmake_arguments="" # <== semicolon-separated list of options to pass to CMake # Function to append the list of applications to build add_app() { @@ -96,7 +97,7 @@ add_app() { } # Parse command line arguments -while getopts ":h C b: i: t: a:" arg; do +while getopts ":h C b: i: t: a: o:" arg; do case "$arg" in h) # Print help and exit without doing anything print_help @@ -113,10 +114,10 @@ while getopts ":h C b: i: t: a:" arg; do ;; t) # Set build type build_type="$OPTARG" - if [[ "${build_type}" == "FullDebug" - || "${build_type}" == "Debug" - || "${build_type}" == "RelWithDebInfo" - || "${build_type}" == "Release" ]]; then + if ! [[ "${build_type}" == "FullDebug" + || "${build_type}" == "Debug" + || "${build_type}" == "RelWithDebInfo" + || "${build_type}" == "Release" ]]; then print_help echo "Error: invalid build type: ${build_type}" exit 1 @@ -125,8 +126,12 @@ while getopts ":h C b: i: t: a:" arg; do a) # Add application add_app "$OPTARG" ;; + o) # Add CMake option + cmake_arguments="$cmake_arguments;$OPTARG" + ;; \?) # Unrecognized argumnet echo "Error: unrecognized argument: -$OPTARG" + print_help exit 1 esac done @@ -137,6 +142,9 @@ if [ -d "$build_dir" ]; then echo "Error: user '$(hostname)' has no write access to the build directory: '$build_dir'" exit 1 fi + + rm -f "$build_dir/CMakeCache.txt" + rm -rf "$build_dir/CMakeFiles" fi # Check write access to the install dir @@ -249,6 +257,7 @@ if ! cmake \ "-DUSE_EIGEN_MKL:BOOL=OFF" \ "-DKRATOS_GENERATE_PYTHON_STUBS:BOOL=ON" \ "-DKRATOS_ENABLE_PROFILING:BOOL=OFF" \ + $(echo $cmake_arguments | tr '\;' '\n') \ ; then exit 1 fi From f6ed83b99d854aa52283f060896a504a0fd331b1 Mon Sep 17 00:00:00 2001 From: matekelemen Date: Wed, 8 Nov 2023 10:32:11 +0100 Subject: [PATCH 04/65] fix number of build jobs --- scripts/mac_build | 48 ++++++++++++++++++++++++++++------------------- 1 file changed, 29 insertions(+), 19 deletions(-) diff --git a/scripts/mac_build b/scripts/mac_build index b6276c3e1bbb..4553c09f1ca2 100755 --- a/scripts/mac_build +++ b/scripts/mac_build @@ -14,6 +14,7 @@ print_help() { echo "-b : path to the build directory (created if it does not exist yet)" echo "-i : path to the install directory (created if it does not exist yet)" echo "-t : build type [FullDebug, Debug, Release, RelWithDebInfo] (Default: Release)" + echo "-j : number of build jobs to launch in parallel (Default: use as many threads as the machine supports)." echo "-a : name of the application to build (can be passed repeatedly to add more applications)" echo "-o : options/arguments to pass on to CMake. Semicolon (;) delimited, or defined repeatedly." echo @@ -24,7 +25,7 @@ print_help() { echo "By default, Kratos is installed to the site-packages directory of the available python" echo "interpreter. This makes KratosMultiphysics and its applications immediately available from" echo "anywhere on the system without having to append PYTHONPATH, provided that the same interpreter" - echo "is used. Note however, that it is recommend to use a virtual python environment to avoid tainting" + echo "is used. Note however, that it is recommended to use a virtual python environment to avoid tainting" echo "the system python." echo echo "Build requirements:" @@ -60,27 +61,28 @@ get_site_packages_dir() { # (assumed to be kratos_repo_root/scripts) script_dir="$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )" -source_dir="$(dirname "${script_dir}")" # <== path to the kratos repo root -app_dir="${source_dir}/applications" # <== path to the app directory of the kratos repo +source_dir="$(dirname "${script_dir}")" # <== path to the kratos repo root +app_dir="${source_dir}/applications" # <== path to the app directory of the kratos repo -toolchain_root="" # <== root path of the compiler package (llvm) -toolchain_bin="" # <== directory containing compiler executables -toolchain_lib="" # <== directory containing compiler libraries -toolchain_include="" # <== directory containing compiler headers +toolchain_root="" # <== root path of the compiler package (llvm) +toolchain_bin="" # <== directory containing compiler executables +toolchain_lib="" # <== directory containing compiler libraries +toolchain_include="" # <== directory containing compiler headers -generator_target="Unix Makefiles" # <== name of the generator program in CMake -ccache_flag="" # <== sets CXX_COMPILER_LAUNCHER in CMake to ccache if available -mpi_flag="OFF" # <== MPI flag to pass to CMake via USE_MPI +generator_target="Unix Makefiles" # <== name of the generator program in CMake +ccache_flag="" # <== sets CXX_COMPILER_LAUNCHER in CMake to ccache if available +mpi_flag="OFF" # <== MPI flag to pass to CMake via USE_MPI # Define default arguments -build_type="Release". # <== passed to CMAKE_BUILD_TYPE -build_dir="${source_dir}/build" # <== path to the build directory -install_dir="$(get_site_packages_dir)" # <== path to install kratos to -clean=0 # <== clean the build and install directories, then exit -app_names="" # <== list of app names to build -cmake_arguments="" # <== semicolon-separated list of options to pass to CMake +build_type="Release". # <== passed to CMAKE_BUILD_TYPE +job_count=$(sysctl -n machdep.cpu.thread_count) # <== number of jobs to use for building +build_dir="${source_dir}/build" # <== path to the build directory +install_dir="$(get_site_packages_dir)" # <== path to install kratos to +clean=0 # <== clean the build and install directories, then exit +app_names="" # <== list of app names to build +cmake_arguments="" # <== semicolon-separated list of options to pass to CMake -# Function to append the list of applications to build +# Function to append the list of built applications add_app() { if [ "$1" != "${1#/}" ]; then # <== absolute path if [ -d "$1" ]; then @@ -97,7 +99,7 @@ add_app() { } # Parse command line arguments -while getopts ":h C b: i: t: a: o:" arg; do +while getopts ":h C b: i: t: j: a: o:" arg; do case "$arg" in h) # Print help and exit without doing anything print_help @@ -123,6 +125,14 @@ while getopts ":h C b: i: t: a: o:" arg; do exit 1 fi ;; + j) # Set the number of build jobs + if [[ "$OPTARG" =~ ^[1-9][0-9]*$ ]]; then + job_count="$OPTARG" + else + echo "Error: invalid number of jobs requested: '$OPTARG'" + exit 1 + fi + ;; a) # Add application add_app "$OPTARG" ;; @@ -263,7 +273,7 @@ if ! cmake \ fi # Build and install -if ! cmake --build "$build_dir" --target install -j; then +if ! cmake --build "$build_dir" --target install -j$job_count; then exit 1 fi From 6298ab37cb452d7ccd1dd3c6354016595a6677c6 Mon Sep 17 00:00:00 2001 From: matekelemen Date: Wed, 8 Nov 2023 10:32:32 +0100 Subject: [PATCH 05/65] fix ccache --- scripts/mac_build | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/mac_build b/scripts/mac_build index 4553c09f1ca2..13ca430beb5e 100755 --- a/scripts/mac_build +++ b/scripts/mac_build @@ -224,7 +224,7 @@ check_recommended_homebrew_package() { # Optional dependency - ccache if check_recommended_homebrew_package ccache; then - ccache_flag="-DCXX_COMPILER_LAUNCHER:STRING=ccache" + ccache_flag="-DCMAKE_CXX_COMPILER_LAUNCHER:STRING=ccache" fi # Optional dependency - ninja From 1069ac6afdb7f3ef835e1579d0b9d0b31304c758 Mon Sep 17 00:00:00 2001 From: matekelemen Date: Wed, 8 Nov 2023 11:45:09 +0100 Subject: [PATCH 06/65] use standard bash string comparison operator --- scripts/mac_build | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/scripts/mac_build b/scripts/mac_build index 13ca430beb5e..c3f099e6f4c4 100755 --- a/scripts/mac_build +++ b/scripts/mac_build @@ -116,12 +116,12 @@ while getopts ":h C b: i: t: j: a: o:" arg; do ;; t) # Set build type build_type="$OPTARG" - if ! [[ "${build_type}" == "FullDebug" - || "${build_type}" == "Debug" - || "${build_type}" == "RelWithDebInfo" - || "${build_type}" == "Release" ]]; then - print_help + if ! [[ "${build_type}" = "FullDebug" + || "${build_type}" = "Debug" + || "${build_type}" = "RelWithDebInfo" + || "${build_type}" = "Release" ]]; then echo "Error: invalid build type: ${build_type}" + print_help exit 1 fi ;; From 4935c8cd2f22fc8e8d4f32b551f640f94d91f07b Mon Sep 17 00:00:00 2001 From: matekelemen Date: Wed, 8 Nov 2023 12:08:37 +0100 Subject: [PATCH 07/65] update help --- scripts/mac_build | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/mac_build b/scripts/mac_build index c3f099e6f4c4..fe079849fec3 100755 --- a/scripts/mac_build +++ b/scripts/mac_build @@ -8,7 +8,7 @@ script_name="$(basename ${BASH_SOURCE[0]})" # Function for printing usage info print_help() { echo "$script_name - Configure, build, and install KratosMultiphysics." - echo "Usage: $script_name [-h] [-C] [-b ] [-i ] [-t ] [-a ] [-o ]" + echo "Usage: $script_name [-h] [-C] [-b ] [-i ] [-t ] [-j ] [-a ] [-o ]" echo "-h : print this help and exit" echo "-C : clean build and install directories, then exit" echo "-b : path to the build directory (created if it does not exist yet)" From 3b6be156a1624cd20383aef69640e33556d72a90 Mon Sep 17 00:00:00 2001 From: matekelemen Date: Wed, 8 Nov 2023 12:16:25 +0100 Subject: [PATCH 08/65] update help --- scripts/mac_build | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/scripts/mac_build b/scripts/mac_build index fe079849fec3..751672911de6 100755 --- a/scripts/mac_build +++ b/scripts/mac_build @@ -1,6 +1,6 @@ #!/bin/bash # authors: Máté Kelemen -# Run this script with the -h flag for info. +# Run this script with the -h flag for more info. # Name of this script script_name="$(basename ${BASH_SOURCE[0]})" @@ -36,7 +36,7 @@ print_help() { echo echo "Recommended build tools:" echo " - ccache ('brew install ccache')" - echo " - ninja ('brew install ccache')" + echo " - ninja ('brew install ninja')" echo echo "Caveats:" echo "The clang that gets shipped by default lacks OpenMP binaries, so one option is to use another version" From 829676044bdeed2c9b6b3fe980912b3202c105b2 Mon Sep 17 00:00:00 2001 From: matekelemen Date: Tue, 6 Feb 2024 10:23:16 +0100 Subject: [PATCH 09/65] fix passing CMake arguments --- scripts/mac_build | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/scripts/mac_build b/scripts/mac_build index 751672911de6..fdfeac4e23f7 100755 --- a/scripts/mac_build +++ b/scripts/mac_build @@ -80,7 +80,7 @@ build_dir="${source_dir}/build" # <== path to the build director install_dir="$(get_site_packages_dir)" # <== path to install kratos to clean=0 # <== clean the build and install directories, then exit app_names="" # <== list of app names to build -cmake_arguments="" # <== semicolon-separated list of options to pass to CMake +cmake_arguments=() # <== list of options to pass to CMake # Function to append the list of built applications add_app() { @@ -137,7 +137,7 @@ while getopts ":h C b: i: t: j: a: o:" arg; do add_app "$OPTARG" ;; o) # Add CMake option - cmake_arguments="$cmake_arguments;$OPTARG" + cmake_arguments=("${cmake_arguments[@]}" "$OPTARG") ;; \?) # Unrecognized argumnet echo "Error: unrecognized argument: -$OPTARG" @@ -267,7 +267,7 @@ if ! cmake \ "-DUSE_EIGEN_MKL:BOOL=OFF" \ "-DKRATOS_GENERATE_PYTHON_STUBS:BOOL=ON" \ "-DKRATOS_ENABLE_PROFILING:BOOL=OFF" \ - $(echo $cmake_arguments | tr '\;' '\n') \ + "${cmake_arguments[@]}" \ ; then exit 1 fi From 2d67f26485faed436680db06ff6df2c411d44cd1 Mon Sep 17 00:00:00 2001 From: aronnoordam Date: Tue, 9 Jul 2024 13:10:05 +0200 Subject: [PATCH 10/65] corrected mass matrix calculation solid elements --- .../custom_utilities/equation_of_motion_utilities.cpp | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/applications/GeoMechanicsApplication/custom_utilities/equation_of_motion_utilities.cpp b/applications/GeoMechanicsApplication/custom_utilities/equation_of_motion_utilities.cpp index a2162e538fe6..6b0dafdf421f 100644 --- a/applications/GeoMechanicsApplication/custom_utilities/equation_of_motion_utilities.cpp +++ b/applications/GeoMechanicsApplication/custom_utilities/equation_of_motion_utilities.cpp @@ -28,15 +28,12 @@ Matrix GeoEquationOfMotionUtilities::CalculateMassMatrix(std::size_t dimension { const std::size_t block_element_size = number_U_nodes * dimension; Matrix Nu = ZeroMatrix(dimension, block_element_size); - Matrix aux_density_matrix = ZeroMatrix(dimension, block_element_size); - Matrix density_matrix = ZeroMatrix(dimension, dimension); Matrix mass_matrix = ZeroMatrix(block_element_size, block_element_size); for (unsigned int g_point = 0; g_point < NumberIntegrationPoints; ++g_point) { - GeoElementUtilities::AssembleDensityMatrix(density_matrix, rSolidDensities[g_point]); GeoElementUtilities::CalculateNuMatrix(dimension, number_U_nodes, Nu, Nu_container, g_point); - noalias(aux_density_matrix) = prod(density_matrix, Nu); - mass_matrix += prod(trans(Nu), aux_density_matrix) * rIntegrationCoefficients[g_point]; + + mass_matrix += rSolidDensities[g_point] * prod(trans(Nu), Nu) * rIntegrationCoefficients[g_point]; } return mass_matrix; } From 9a4215bb27b56e9cc4febcdc35c5ea202cc22113 Mon Sep 17 00:00:00 2001 From: aronnoordam Date: Tue, 9 Jul 2024 14:55:21 +0200 Subject: [PATCH 11/65] corrected mass matrix unit tests --- .../cpp_tests/test_equation_of_motion.cpp | 48 +++++++++---------- 1 file changed, 24 insertions(+), 24 deletions(-) diff --git a/applications/GeoMechanicsApplication/tests/cpp_tests/test_equation_of_motion.cpp b/applications/GeoMechanicsApplication/tests/cpp_tests/test_equation_of_motion.cpp index a29c156c2d4a..8f77283ec630 100644 --- a/applications/GeoMechanicsApplication/tests/cpp_tests/test_equation_of_motion.cpp +++ b/applications/GeoMechanicsApplication/tests/cpp_tests/test_equation_of_motion.cpp @@ -47,18 +47,18 @@ KRATOS_TEST_CASE_IN_SUITE(CalculateMassMatrix2D6NDiffOrderGivesCorrectResults, K r_geom.WorkingSpaceDimension() * r_geom.PointsNumber() + 3); // clang-format off expected_mass_matrix <<= - 0.0524691,0.0524691,-0.0262346,-0.0262346,-0.0262346,-0.0262346,0.0262346,0.0262346,-0.0524691,-0.0524691,0.0262346,0.0262346,0,0,0, - 0.0524691,0.0524691,-0.0262346,-0.0262346,-0.0262346,-0.0262346,0.0262346,0.0262346,-0.0524691,-0.0524691,0.0262346,0.0262346,0,0,0, - -0.0262346,-0.0262346,0.0524691,0.0524691,-0.0262346,-0.0262346,0.0262346,0.0262346,0.0262346,0.0262346,-0.0524691,-0.0524691,0,0,0, - -0.0262346,-0.0262346,0.0524691,0.0524691,-0.0262346,-0.0262346,0.0262346,0.0262346,0.0262346,0.0262346,-0.0524691,-0.0524691,0,0,0, - -0.0262346,-0.0262346,-0.0262346,-0.0262346,0.0524691,0.0524691,-0.0524691,-0.0524691,0.0262346,0.0262346,0.0262346,0.0262346,0,0,0, - -0.0262346,-0.0262346,-0.0262346,-0.0262346,0.0524691,0.0524691,-0.0524691,-0.0524691,0.0262346,0.0262346,0.0262346,0.0262346,0,0,0, - 0.0262346,0.0262346,0.0262346,0.0262346,-0.0524691,-0.0524691,0.28858,0.28858,0.209877,0.209877,0.209877,0.209877,0,0,0, - 0.0262346,0.0262346,0.0262346,0.0262346,-0.0524691,-0.0524691,0.28858,0.28858,0.209877,0.209877,0.209877,0.209877,0,0,0, - -0.0524691,-0.0524691,0.0262346,0.0262346,0.0262346,0.0262346,0.209877,0.209877,0.28858,0.28858,0.209877,0.209877,0,0,0, - -0.0524691,-0.0524691,0.0262346,0.0262346,0.0262346,0.0262346,0.209877,0.209877,0.28858,0.28858,0.209877,0.209877,0,0,0, - 0.0262346,0.0262346,-0.0524691,-0.0524691,0.0262346,0.0262346,0.209877,0.209877,0.209877,0.209877,0.28858,0.28858,0,0,0, - 0.0262346,0.0262346,-0.0524691,-0.0524691,0.0262346,0.0262346,0.209877,0.209877,0.209877,0.209877,0.28858,0.28858,0,0,0, + 0.0524691,0.0,-0.0262346,0.0,-0.0262346,0.0,0.0262346,0.0,-0.0524691,0.0,0.0262346,0.0,0,0,0, + 0.0,0.0524691,0.0,-0.0262346,0.0,-0.0262346,0.0,0.0262346,0.0,-0.0524691,0.0,0.0262346,0,0,0, + -0.0262346,0.0,0.0524691,0.0,-0.0262346,0.0,0.0262346,0.0,0.0262346,0.0,-0.0524691,0.0,0,0,0, + 0.0,-0.0262346,0.0,0.0524691,0.0,-0.0262346,0.0,0.0262346,0.0,0.0262346,0.0,-0.0524691,0,0,0, + -0.0262346,0.0,-0.0262346,0.0,0.0524691,0.0,-0.0524691,0.0,0.0262346,0.0,0.0262346,0.0,0,0,0, + 0.0,-0.0262346,0.0,-0.0262346,0.0,0.0524691,0.0,-0.0524691,0.0,0.0262346,0.0,0.0262346,0,0,0, + 0.0262346,0.0,0.0262346,0.0,-0.0524691,0.0,0.28858,0.0,0.209877,0.0,0.209877,0.0,0,0,0, + 0.0,0.0262346,0.0,0.0262346,0.0,-0.0524691,0.0,0.28858,0.0,0.209877,0.0,0.209877,0,0,0, + -0.0524691,0.0,0.0262346,0.0,0.0262346,0.0,0.209877,0.0,0.28858,0.0,0.209877,0.0,0,0,0, + 0.0,-0.0524691,0.0,0.0262346,0.0,0.0262346,0.0,0.209877,0.0,0.28858,0.0,0.209877,0,0,0, + 0.0262346,0.0,-0.0524691,0.0,0.0262346,0.0,0.209877,0.0,0.209877,0.0,0.28858,0.0,0,0,0, + 0.0,0.0262346,0.0,-0.0524691,0.0,0.0262346,0.0,0.209877,0.0,0.209877,0.0,0.28858,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0; @@ -98,18 +98,18 @@ KRATOS_TEST_CASE_IN_SUITE(CalculateMassMatrix3D4NGivesCorrectResults, KratosGeoM (r_geom.WorkingSpaceDimension() + 1) * r_geom.PointsNumber()); // clang-format off expected_mass_matrix <<= - 34.1667,34.1667,34.1667,17.0833,17.0833,17.0833,17.0833,17.0833,17.0833,17.0833,17.0833,17.0833,0,0,0,0, - 34.1667,34.1667,34.1667,17.0833,17.0833,17.0833,17.0833,17.0833,17.0833,17.0833,17.0833,17.0833,0,0,0,0, - 34.1667,34.1667,34.1667,17.0833,17.0833,17.0833,17.0833,17.0833,17.0833,17.0833,17.0833,17.0833,0,0,0,0, - 17.0833,17.0833,17.0833,34.1667,34.1667,34.1667,17.0833,17.0833,17.0833,17.0833,17.0833,17.0833,0,0,0,0, - 17.0833,17.0833,17.0833,34.1667,34.1667,34.1667,17.0833,17.0833,17.0833,17.0833,17.0833,17.0833,0,0,0,0, - 17.0833,17.0833,17.0833,34.1667,34.1667,34.1667,17.0833,17.0833,17.0833,17.0833,17.0833,17.0833,0,0,0,0, - 17.0833,17.0833,17.0833,17.0833,17.0833,17.0833,34.1667,34.1667,34.1667,17.0833,17.0833,17.0833,0,0,0,0, - 17.0833,17.0833,17.0833,17.0833,17.0833,17.0833,34.1667,34.1667,34.1667,17.0833,17.0833,17.0833,0,0,0,0, - 17.0833,17.0833,17.0833,17.0833,17.0833,17.0833,34.1667,34.1667,34.1667,17.0833,17.0833,17.0833,0,0,0,0, - 17.0833,17.0833,17.0833,17.0833,17.0833,17.0833,17.0833,17.0833,17.0833,34.1667,34.1667,34.1667,0,0,0,0, - 17.0833,17.0833,17.0833,17.0833,17.0833,17.0833,17.0833,17.0833,17.0833,34.1667,34.1667,34.1667,0,0,0,0, - 17.0833,17.0833,17.0833,17.0833,17.0833,17.0833,17.0833,17.0833,17.0833,34.1667,34.1667,34.1667,0,0,0,0, + 34.1667,0.0,0.0,17.0833,0.0,0.0,17.0833,0.0,0.0,17.0833,0.0,0.0,0,0,0,0, + 0.0,34.1667,0.0,0.0,17.0833,0.0,0.0,17.0833,0.0,0.0,17.0833,0.0,0,0,0,0, + 0.0,0.0,34.1667,0.0,0.0,17.0833,0.0,0.0,17.0833,0.0,0.0,17.0833,0,0,0,0, + 17.0833,0.0,0.0,34.1667,0.0,0.0,17.0833,0.0,0.0,17.0833,0.0,0.0,0,0,0,0, + 0.0,17.0833,0.0,0.0,34.1667,0.0,0.0,17.0833,0.0,0.0,17.0833,0.0,0,0,0,0, + 0.0,0.0,17.0833,0.0,0.0,34.1667,0.0,0.0,17.0833,0.0,0.0,17.0833,0,0,0,0, + 17.0833,0.0,0.0,17.0833,0.0,0.0,34.1667,0.0,0.0,17.0833,0.0,0.0,0,0,0,0, + 0.0,17.0833,0.0,0.0,17.0833,0.0,0.0,34.1667,0.0,0.0,17.0833,0.0,0,0,0,0, + 0.0,0.0,17.0833,0.0,0.0,17.0833,0.0,0.0,34.1667,0.0,0.0,17.0833,0,0,0,0, + 17.0833,0.0,0.0,17.0833,0.0,0.0,17.0833,0.0,0.0,34.1667,0.0,0.0,0,0,0,0, + 0.0,17.0833,0.0,0.0,17.0833,0.0,0.0,17.0833,0.0,0.0,34.1667,0.0,0,0,0,0, + 0.0,0.0,17.0833,0.0,0.0,17.0833,0.0,0.0,17.0833,0.0,0.0,34.1667,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, From 4d755512780df1907b12a813c7a116546b9b1eab Mon Sep 17 00:00:00 2001 From: Carlos Roig Date: Wed, 10 Jul 2024 10:49:11 +0200 Subject: [PATCH 12/65] Updating testing doc --- .../Kratos/Testing/{ => General}/testing.md | 16 +-- .../Kratos/Testing/General/testing_ci.md | 11 ++ .../Testing/General/testing_examples.md | 131 ++++++++++++++++++ .../Testing/General/testing_quick_start.md | 89 ++++++++++++ docs/pages/Kratos/Testing/menu_info.json | 2 +- 5 files changed, 240 insertions(+), 9 deletions(-) rename docs/pages/Kratos/Testing/{ => General}/testing.md (98%) create mode 100644 docs/pages/Kratos/Testing/General/testing_ci.md create mode 100644 docs/pages/Kratos/Testing/General/testing_examples.md create mode 100644 docs/pages/Kratos/Testing/General/testing_quick_start.md diff --git a/docs/pages/Kratos/Testing/testing.md b/docs/pages/Kratos/Testing/General/testing.md similarity index 98% rename from docs/pages/Kratos/Testing/testing.md rename to docs/pages/Kratos/Testing/General/testing.md index 141108f5ea69..103fb5102c3d 100644 --- a/docs/pages/Kratos/Testing/testing.md +++ b/docs/pages/Kratos/Testing/General/testing.md @@ -10,17 +10,17 @@ summary: This section will descrive the different layers of Kratos testing, and its characteristics. -- Organization -- Cpp Tests -- MPI Cpp Tests -- Python Tests -- MPI Python Tests +- [Organization](#organization) +- [Cpp Tests](#cpp-tests) +- [MPI Cpp Tests](#mpi-cpp) + If you are interested in examples, how to run tests, and how are run in our CI, please refeer to: -- Quick Start -- How To run tests -- CI configuration +- [Quick Start+](/docs/pages/Kratos/Testing/General/testing_quick_start.md) +- [Examples](/docs/pages/Kratos/Testing/General/testing_examples.md) +- [CI configuration](/docs/pages/Kratos/Testing/General/testing_ci.md) ### Organization diff --git a/docs/pages/Kratos/Testing/General/testing_ci.md b/docs/pages/Kratos/Testing/General/testing_ci.md new file mode 100644 index 000000000000..f2e3614a68b6 --- /dev/null +++ b/docs/pages/Kratos/Testing/General/testing_ci.md @@ -0,0 +1,11 @@ +--- +title: Testing Examples +keywords: +tags: [Testing Test Cpp_Tests Python_Tests Examples] +sidebar: kratos_testing +summary: +--- + +## Overview + +This section will descrive how the tests are executed in the CI, its organization across the different contaienrs and build matrix and its restrictions. diff --git a/docs/pages/Kratos/Testing/General/testing_examples.md b/docs/pages/Kratos/Testing/General/testing_examples.md new file mode 100644 index 000000000000..42b3927a3ba1 --- /dev/null +++ b/docs/pages/Kratos/Testing/General/testing_examples.md @@ -0,0 +1,131 @@ +--- +title: Testing Examples +keywords: +tags: [Testing Test Cpp_Tests Python_Tests Examples] +sidebar: kratos_testing +summary: +--- + +# How to run tests + +This section will provided some common (and not so common) use cases for Kratos tests. + +Unless stated otherwise, we asume that we running `KratosCoreTest` or `KratosMPICoreTest`. We will consider the `Array1DTest` as an example test + +Note that even if not present in this page, you can mix and combine many of the different flags shown in the examples. + +## Exectuion + +### Running a suite of tests + +```console +./KratosCoreTests +``` + +### Running a single test from a suite + +```console +./KratosCoreTests --gtest_filter="KratosCoreFastSuite.Array1DTest" +``` + +```console +Kratos::Testing::GTestMain::InitializeTesting +Note: Google Test filter = KratosCoreFastSuite.Array1DTest +[==========] Running 1 test from 1 test suite. +[----------] Global test environment set-up. +[----------] 1 test from KratosCoreFastSuite +[ RUN ] KratosCoreFastSuite.Array1DTest +[ OK ] KratosCoreFastSuite.Array1DTest (1 ms) +[----------] 1 test from KratosCoreFastSuite (1 ms total) + +[----------] Global test environment tear-down +[==========] 1 test from 1 test suite ran. (2 ms total) +[ PASSED ] 1 test. +``` + +### Running all tests matching a patter from a suite + +In this example we make use of a regex `KratosCoreFastSuite.*` in the filter in order to run all the tests from the `KratosCoreFastSuite` +isnide the KratosCoreTests binary. + +```console +./KratosCoreTests --gtest_filter="KratosCoreFastSuite.*" +``` + +After executuon the command we will se something like: + +```console +[ OK ] KratosCoreFastSuite.XmlOStreamWriterWriteDataElementBinaryMixed (1 ms) +[----------] 936 tests from KratosCoreFastSuite (378175 ms total) +[----------] Global test environment tear-down +[==========] 936 tests from 1 test suites ran. (379719 ms total) +``` + +### Running a single tests from a suite multiple times + +In this example we make use of the ... to run a single test multiple times. + +We take the change to encourage you to make small tests to make the best use of options like this. + +Be warned that negative values will repeat the test endlessly + +```console +./KratosCoreTests --gtest_repeat=10 --gtest_filter="KratosCoreFastSuite.Array1DTest" +``` + +If negative values are combined with `--gtest_fail_fast` which causes the test to stop at the first failure it is very usefull to catch race conditions that only happens a given a small number of times of the total amount of executions. + +```console +./KratosCoreTests --gtest_repeat=-1 --gtest_fail_fast --gtest_filter="KratosCoreFastSuite.[YourRaceConditionTest]" +``` + +### Randomizing the execution of a subset of tests from a suite + +Historically Kratos tests have had the problem of sharing a common Initialized kernel which lead to situation in which the test execution order could result in problems. While this should be minimized in the current framework were every tests is run in its own initializes kernel, GTest still provides a mechanism to randomize the execution order in case hidden dependencies causing problems are still present in the code. + +In this example we show how to randomize the execution order of the tests inside a binary. + +```console +./KratosCoreTests --gtest_filter="KratosCoreFastSuite.*" +``` + +### Get the list of available tests from a suite + +```console +./KratosCoreTests --gtest_list_tests +``` + +## Debugging + +### Running a single test from a suite with GDB + +```console +./KratosCoreTests --gtest_catch_exceptions=0 --gtest_filter="KratosCoreFastSuite.Array1DTest" +``` + +### Running multiple tests with GDB stoping at the first failure + +```console +gdb --args ./KratosCoreTests --gtest_catch_exceptions=0 --gtest_break_on_failure --gtest_filter="KratosCoreFastSuite.*" +``` + +### Running a single test from a suite with valgrind + +```console +valgrind ./KratosCoreTests --gtest_catch_exceptions=0 --gtest_break_on_failure --gtest_filter="KratosCoreFastSuite.Array1DTest" +``` + +### Running a single test from a suite with valgrind (to discover memory leaks) + +```console +valgrind --leak-check=full --show-leak-kinds=all --track-origins=yes ./KratosCoreTests --gtest_catch_exceptions=0 --gtest_break_on_failure --gtest_filter="KratosCoreFastSuite.*" +``` + +## MPI + +### Running multiple test with MPI with 4 procs + +```console +OMP_NUM_THREADS=1 mpirun -np 4 ./KratosMPICoreTests --gtest_filter="KratosMPICoreFastSuite.*" +``` + diff --git a/docs/pages/Kratos/Testing/General/testing_quick_start.md b/docs/pages/Kratos/Testing/General/testing_quick_start.md new file mode 100644 index 000000000000..064d3d9d0c01 --- /dev/null +++ b/docs/pages/Kratos/Testing/General/testing_quick_start.md @@ -0,0 +1,89 @@ +--- +title: Testing Quick Start +keywords: +tags: [Testing Test Cpp_Tests Python_Tests Quick Start] +sidebar: kratos_testing +summary: +--- + +## How to run tests + +This section provides insight on how to run the different Kratos tests and some of the options available. + +- [Cpp Tests](#cpp-tests) +- [Python Tests](#python-tests) + +### CPP Tests + +There are several ways to run the different cpp level tests in Kratos: + +- [Direct Execution](#direct-execution) +- [Python Launcher](#python-launcher) + +#### Direct Execution + +The most straigh forward way to run a test is execute it directly from the binary file containing it. You will be able to find the test binaries in `kratos/bin/[Release|Debug|FullDebug]/test`. + +You may see different binaries based on the applications and components that you have compiled. + +For exampe having compiled the `FluidDynamicsApplication`, the `MappingApplication` and `TrilinosApplication` with `MPI` support enabled, will generate the following binaries: + +```console +$ ls -la +-rwxr-xr-x 1 user group 60834304 Jun 13 09:56 KratosCoreTest +-rwxr-xr-x 1 user group 10199936 Jun 13 09:56 KratosFluidDynamicsCoreTest +-rwxr-xr-x 1 user group 4140904 Jun 13 09:57 KratosMappingCoreTest +-rwxr-xr-x 1 user group 2633736 Jun 13 09:57 KratosMappingMPICoreTest +-rwxr-xr-x 1 user group 2344424 Jun 13 09:57 KratosMeshMovingCoreTest +-rwxr-xr-x 1 user group 8239136 Jun 13 09:56 KratosMPICoreTest +-rwxr-xr-x 1 user group 4928160 Jun 13 09:56 KratosTrilinosCoreTest +``` + +You may execute the serial tests (no `MPI` in the name with the following command): + +```console +./KratosCoreTest +``` + +For MPI based tests, you may execute them invoking the binary through the mpi wrapper: + +```console +mpiexec -np [N] ./KratosMPICoreTest +``` + +This commands will result in an output like this: + +```console +[==========] Running 1495 tests from 10 test suites. +[----------] Global test environment set-up. +[----------] 936 tests from KratosCoreFastSuite +[ RUN ] KratosCoreFastSuite.ConstitutiveLawHasMethods +[ OK ] KratosCoreFastSuite.ConstitutiveLawHasMethods (1 ms) +... +[----------] Global test environment tear-down +[==========] 1495 tests from 10 test suites ran. (379719 ms total) +[ PASSED ] 1488 tests. +``` + +There are serveral options that can be used to have more control over which tests inside a suite are run, what information is shown, and overall tailor the run to your needs. You can find a complete list of options in [Running Test Programs: Advanced Options](https://google.github.io/googletest/advanced.html#running-test-programs-advanced-options) + +As a resume, a brief list of some commonly used ones for Kratos are: + +- **--gtest_list_tests**: Prints the list of available tests in a binary. +- **--gtest_filter=\***: Runs only a subset of the specified tests. +- **--gtest_repeat=N**: Repeats the selected tests multiple times (usefull to detect race conditions). +- **--gtest_shuffle**: Randomizes the running order of tests. While combined with `--gtest_repeat` will select a different order for every repetition. +- **--gtest_brief=N**: Controls the verbosity of the output. + +We also provide different [examples]() of this different options if you are interested. + +#### Debugging + +While historically it has been hard for the Kratos tests to be run alongisde debugging tools due to its reliance on python launcher, this is no longer the case anymore with GTest as they provide a direct access to the C++ layer of Kratos. + +#### Python Launcher + +You may also run the tests through the python launcher located in + +### Python Tests + diff --git a/docs/pages/Kratos/Testing/menu_info.json b/docs/pages/Kratos/Testing/menu_info.json index 6fdd4f03e069..50e6145d1842 100644 --- a/docs/pages/Kratos/Testing/menu_info.json +++ b/docs/pages/Kratos/Testing/menu_info.json @@ -1,6 +1,6 @@ { "side_bar_name": "kratos_testing", - "landing_page": "testing.md", + "landing_page": "General/testing_quick_start.md", "additional_menu_options": { "product": "Testing", "title": "sidebar" From 3fd94b141ded4dd92c2c0b60d252fcea088c83ca Mon Sep 17 00:00:00 2001 From: aronnoordam Date: Wed, 10 Jul 2024 16:35:19 +0200 Subject: [PATCH 13/65] added wip analytical solution file --- .../tests/test_lamb/lamb.py | 513 ++++++++++++++++++ 1 file changed, 513 insertions(+) create mode 100644 applications/GeoMechanicsApplication/tests/test_lamb/lamb.py diff --git a/applications/GeoMechanicsApplication/tests/test_lamb/lamb.py b/applications/GeoMechanicsApplication/tests/test_lamb/lamb.py new file mode 100644 index 000000000000..bdc873209c45 --- /dev/null +++ b/applications/GeoMechanicsApplication/tests/test_lamb/lamb.py @@ -0,0 +1,513 @@ +import math +class Lamb: + + def __init__(self, young, poisson, density, load): + + self.young = young + self.poisson = poisson + self.density = density + self.load = load + + self.shear_modulus = self.young / (2 * (1 + self.poisson)) + self.p_wave_modulus = self.young * (1-self.poisson)/((1+self.poisson)*(1-2*self.poisson)) + self.cs = math.sqrt(self.shear_modulus / self.density) # shear wave velocity + self.cp = math.sqrt(self.p_wave_modulus / self.density) # compression wave velocity + + self.eta = self.cs / self.cp + + + def find_rayleigh_tau(self, tol=1e-12): + + # iterate until rayleigh wave arrival is found + + residual = 1 + b = (1 - self.poisson) / 8 + if self.poisson > 0.1: + while residual > tol: + a = b + b = (1 - self.poisson) / (8 * (1 + a) * (self.poisson + a)) + residual = abs(b - a) + else: + while residual > tol: + a = b + b = math.sqrt((1 - self.poisson) / (8 * (1 + a) * (1 + self.poisson / a))) + residual = abs(b - a) + + return math.sqrt(1 + b) + + + def solve_at_t(self, time, x): + + # dimensionless parameter tau which is a function of time and distance and shear wave speed + tau = self.cs * time/x + + # determine dimensionless parameter tau_r which represents the arrival of Rayleigh wave + tau_r = self.find_rayleigh_tau(1e-12) + + # calculate vertical displacement at surface + tolerance = 0.0000001 + if tau <= self.eta: + vert_disp = 0 + elif tau <= 1: + + # split numerator and denominator for readability + numerator = (1 - 2 * tau**2)**2 * math.sqrt(tau**2 - self.eta**2) + denominator = (1 - 2 * tau**2)**4 + 16 * tau**4 * ((tau**2 - self.eta**2) * (1 - tau**2)) + + # calculate vertical displacement + vert_disp = -(self.load * self.cs/(self.shear_modulus * x * math.pi)) * numerator / denominator + + else: + # if tau equals rayleigh wave arrival, move slightly away, as the solution is not defined at this point + if abs(tau - tau_r) < tolerance: + tau = tau_r - tolerance if tau < tau_r else tau_r + tolerance + + numerator = math.sqrt(tau**2 - self.eta**2) + denominator = (1 - 2 * tau**2)**2 - 4 * tau**2 * math.sqrt((tau**2 - self.eta**2) * (tau**2 - 1)) + + vert_disp = -(self.load * self.cs/(self.shear_modulus * x * math.pi)) * numerator / denominator + + return vert_disp, tau + + +# def LinePulseWS(nu, tau): +# pi = 4 * math.atan(1.0) +# fac = 1 / pi +# eps = 0.0001 +# t = tau +# nn = (1 - 2 * nu) / (2 * (1 - nu)) +# n = math.sqrt(nn) +# e = 1e-12 +# f = 1 +# b = (1 - nu) / 8 +# +# if nu > 0.1: +# while f > e: +# a = b +# b = (1 - nu) / (8 * (1 + a) * (nu + a)) +# f = abs(b - a) +# else: +# while f > e: +# a = b +# b = math.sqrt((1 - nu) / (8 * (1 + a) * (1 + nu / a))) +# f = abs(b - a) +# +# tr = math.sqrt(1 + b) +# +# if t <= n: +# w = 0 +# elif t <= 1: +# tt = t * t +# a = math.sqrt(tt - nn) +# b1 = (1 - 2 * tt) * (1 - 2 * tt) +# b2 = 4 * tt * math.sqrt((tt - nn) * (1 - tt)) +# b = b1 * b1 + b2 * b2 +# w = -fac * a * b1 / b +# else: +# if abs(t - tr) < eps: +# t = tr - eps if t < tr else tr + eps +# tt = t * t +# a = math.sqrt(tt - nn) +# b = (1 - 2 * tt) * (1 - 2 * tt) - 4 * tt * math.sqrt((tt - nn) * (tt - 1)) +# w = -fac * a / b +# +# return w + + +if __name__ == '__main__': + + lamb = Lamb(100e3, 0.25, 2000, -1000) + + + import matplotlib.pyplot as plt + + ws = [] + taus = [] + end_time = 1 + n_steps =10000 + + time = [end_time * i / n_steps for i in range(n_steps)] + + taus = [] + res = [] + for t in time: + + res.append(lamb.solve_at_t(t, 0.5)[0]) + taus.append(lamb.solve_at_t(t, 0.5)[1]) + + + + + plt.plot(time, res) + + # plt.ylim(-5, 5) + plt.xlim(0,0.4) + plt.ylim(-0.2,0.2) + plt.show() + + + + # w = LinePulseWS(nu, tau) + + + +# +# class LoadType: +# """ +# Load types: Heaviside or Pulse +# """ +# Heaviside = "heaviside" +# Pulse = "pulse" +# +# +# class Lamb: +# r""" +# Based on Verruijt: An Introduction to Soil Dynamics (Chapter 13: Section 13.2). +# +# The solution is found for normalised variables: tau = (c_s * t / r) and u_bar = P / (2 * pi * G * r), +# where: +# - tau: normalised time +# - u_bar: normalised displacement +# - c_s: shear wave velocity +# - t: time +# - r: radius +# - P: load +# - G: shear modulus +# +# Only vertical displacement is computed. +# In this way the solution only depends on Poisson ratio. +# The results for different radius and E are found as post-processing. +# +# Attributes: +# - load (float): load amplitude +# - load_type (Optional[str]): type of load +# - radius (List[float]): list of radius +# - shear_modulus (float): shear modulus +# - young (float): Young modulus +# - poisson (float): Poisson ratio +# - rho (float): density +# - cs (float): shear wave velocity +# - cr (float): Rayleigh wave velocity +# - eta (float): ratio shear wave / compression wave velocity +# - nb_steps (int): number of steps for time discretisation +# - steps_int (int): number of steps for numerical integration +# - tol (float): small number for the integration +# - tau (npt.NDArray[np.float64]): normalised time +# - time (npt.NDArray[np.float64]): time +# - pulse_samples (int): number of samples for pulse load +# - u (npt.NDArray[np.float64]): displacement +# - u_bar (npt.NDArray[np.float64]): normalised displacement +# """ +# +# def __init__(self, +# nb_steps: int = 1000, +# tol: float = 0.005, +# tau_max: float = 4, +# step_int: int = 1000, +# pulse_samples: int = 2): +# """ +# Pekeris wave solution for vertical displacement +# +# Args: +# - nb_steps (int): number of steps for time discretisation (default = 1000) +# - tol (float): tolerance number for the integration (default = 0.005) +# - tau_max (float): maximum value of tau (default = 4) +# - step_int (int): number of steps for numerical integration (default = 1000) +# - pulse_samples (int): number of samples for pulse load (default = 2) +# """ +# self.load: float = np.nan +# self.load_type: Optional[str] = None +# self.radius: List[float] = [] +# self.shear_modulus: float = np.nan # shear modulus +# self.young: float = np.nan # Young modulus +# self.poisson: float = np.nan # Poisson ratio +# self.rho: float = np.nan # density +# self.cs: float = np.nan # shear wave velocity +# self.cr: float = np.nan # Rayleigh wave velocity +# self.eta: float = np.nan # ratio shear wave / compression wave velocity +# self.nb_steps: int = int(nb_steps) # for the discretisation of tau +# self.steps_int: int = int(step_int) # number of steps for numerical integration +# self.tol: float = tol # small number for the integration +# self.tau: npt.NDArray[np.float64] = np.linspace(0, tau_max, self.nb_steps) # normalised time +# self.time: npt.NDArray[np.float64] = np.empty(shape=(0, 0)) # time +# self.pulse_samples: int = pulse_samples # number of samples for pulse load +# self.u: npt.NDArray[np.float64] = np.empty(shape=(0, 0)) # displacement +# self.u_bar: npt.NDArray[np.float64] = np.empty(self.tau.shape[0]) # normalised displacement +# +# def material_properties(self, nu: float, rho: float, young: float): +# r""" +# Material properties +# +# Args: +# - nu (float): Poisson ratio [-] +# - rho (float): density [kgm^-3] +# - young (float): Young modulus [Pa] +# """ +# self.poisson = nu +# self.rho = rho +# self.young = young +# +# def loading(self, p: float, load_type: str): +# r""" +# Load properties +# +# Args: +# - p (float): load amplitude +# - load_type (str): type of load +# """ +# self.load = p +# self.load_type = load_type +# +# def solution(self, radius: List[float]): +# r""" +# Compute the solution for the given radius +# +# Args: +# - radius (List[float]): list of radius +# """ +# self.radius = radius +# self.u = np.zeros((len(self.tau), len(radius))) +# self.time = np.zeros((len(self.tau), len(radius))) +# +# # compute wave speed +# self.elastic_props() +# +# # determine arrival of compression wave +# # displacements are zero before it +# self.displacement_before_compression() +# +# # displacements between arrival of compression wave and shear wave +# self.displacement_before_shear() +# +# # displacement before arrival of Rayleigh wave +# self.displacement_before_rayleigh() +# +# # displacement after arrival of Rayleigh wave +# self.displacement_after_rayleigh() +# +# return +# +# def displacement_before_compression(self): +# r""" +# Compute displacement before arrival of compression wave +# """ +# idx = np.where(self.tau <= self.eta)[0] +# self.u_bar[idx] = 0 +# +# def displacement_before_shear(self): +# r""" +# Compute displacement before arrival of shear wave +# """ +# # limits for integration +# theta_array = np.linspace(0, np.pi / 2, self.steps_int) +# +# # for each tau +# for idx, tau in enumerate(self.tau): +# # if tau within these limits: evaluate integral +# if (tau > self.eta) & (tau <= 1): +# +# # G1 integral +# integral = [] +# for theta in theta_array: +# y = np.sqrt(self.eta**2 + (tau**2 - self.eta**2) * np.sin(theta)**2) +# integral.append((1 - 2 * y**2)**2 * np.sin(theta)**2 / +# (1 - 8 * y**2 + 8 * (3 - 2 * self.eta**2) * y**4 - 16 * (1 - self.eta**2) * y**6)) +# +# # perform integration +# integral = trapezoid(np.array(integral), theta_array) +# +# # compute G1 integral +# G1_integral = (tau**2 - self.eta**2) * integral +# +# # normalised displacement +# self.u_bar[idx] = -G1_integral / np.pi**2 +# +# def displacement_before_rayleigh(self): +# r""" +# Compute displacement before arrival of Rayleigh wave +# """ +# +# # limits for integration +# theta = np.linspace(0, np.pi / 2, self.steps_int) +# +# # for each tau +# for idx, tau in enumerate(self.tau): +# # if tau within these limits: evaluate integral +# if (tau > 1) & (tau <= self.cr): +# # G1 and G2 integrals +# integral_1 = [] +# integral_2 = [] +# for t in theta: +# y = np.sqrt(self.eta**2 + (tau**2 - self.eta**2) * np.sin(t)**2) +# integral_1.append((1 - 2 * y**2)**2 * np.sin(t)**2 / +# (1 - 8 * y**2 + 8 * (3 - 2 * self.eta**2) * y**4 - 16 * (1 - self.eta**2) * y**6)) +# y = np.sqrt(1 + (tau**2 - 1) * np.sin(t)**2) +# integral_2.append(y**2 * (y**2 - self.eta**2) * np.sin(t)**2 / +# (1 - 8 * y**2 + 8 * (3 - 2 * self.eta**2) * y**4 - 16 * (1 - self.eta**2) * y**6)) +# +# # perform integration +# integral_1 = trapezoid(np.array(integral_1), theta) +# integral_2 = trapezoid(np.array(integral_2), theta) +# +# # compute G1 & G2 integrals +# G1_integral = (tau**2 - self.eta**2) * integral_1 +# G2_integral = 4 * (tau**2 - 1) * integral_2 +# +# # normalised displacement +# self.u_bar[idx] = -(G1_integral + G2_integral) / np.pi**2 +# +# def displacement_after_rayleigh(self): +# r""" +# Compute displacement after arrival of Rayleigh wave +# """ +# +# # for each tau +# for idx, tau in enumerate(self.tau): +# # if tau within these limits: evaluate integral +# if tau > self.cr: +# # G1 and G2 integrals +# integral_1_1 = [] +# integral_1_2 = [] +# integral_2_1 = [] +# integral_2_2 = [] +# +# # limits for integration +# theta_r1 = np.arcsin(np.sqrt((self.cr**2 - self.eta**2) / (tau**2 - self.eta**2))) +# theta_r1_low = np.linspace(0, theta_r1 - self.tol, self.steps_int) +# theta_r1_high = np.linspace(theta_r1 + self.tol, np.pi / 2, self.steps_int) +# +# theta_r2 = np.arcsin(np.sqrt((self.cr**2 - 1) / (tau**2 - 1))) +# theta_r2_low = np.linspace(0, theta_r2 - self.tol, self.steps_int) +# theta_r2_high = np.linspace(theta_r2 + self.tol, np.pi / 2, self.steps_int) +# +# for t in range(self.steps_int): +# y = np.sqrt(self.eta**2 + (tau**2 - self.eta**2) * np.sin(theta_r1_low[t])**2) +# integral_1_1.append( +# (1 - 2 * y**2)**2 * np.sin(theta_r1_low[t])**2 / +# (1 - 8 * y**2 + 8 * (3 - 2 * self.eta**2) * y**4 - 16 * (1 - self.eta**2) * y**6)) +# y = np.sqrt(self.eta**2 + (tau**2 - self.eta**2) * np.sin(theta_r1_high[t])**2) +# integral_1_2.append( +# (1 - 2 * y**2)**2 * np.sin(theta_r1_high[t])**2 / +# (1 - 8 * y**2 + 8 * (3 - 2 * self.eta**2) * y**4 - 16 * (1 - self.eta**2) * y**6)) +# +# y = np.sqrt(1 + (tau**2 - 1) * np.sin(theta_r2_low[t])**2) +# integral_2_1.append(y**2 * (y**2 - self.eta**2) * np.sin(theta_r2_low[t])**2 / +# (1 - 8 * y**2 + 8 * (3 - 2 * self.eta**2) * y**4 - 16 * +# (1 - self.eta**2) * y**6)) +# y = np.sqrt(1 + (tau**2 - 1) * np.sin(theta_r2_high[t])**2) +# integral_2_2.append(y**2 * (y**2 - self.eta**2) * np.sin(theta_r2_high[t])**2 / +# (1 - 8 * y**2 + 8 * (3 - 2 * self.eta**2) * y**4 - 16 * +# (1 - self.eta**2) * y**6)) +# +# # perform integration +# integral_1_1 = trapezoid(np.array(integral_1_1), theta_r1_low) +# integral_1_2 = trapezoid(np.array(integral_1_2), theta_r1_high) +# integral_2_1 = trapezoid(np.array(integral_2_1), theta_r2_low) +# integral_2_2 = trapezoid(np.array(integral_2_2), theta_r2_high) +# +# # compute G1 & G2 +# G1_integral = (tau**2 - self.eta**2) * (integral_1_1 + integral_1_2) +# G2_integral = 4 * (tau**2 - 1) * (integral_2_1 + integral_2_2) +# +# # normalised displacement +# self.u_bar[idx] = -(G1_integral + G2_integral) / np.pi**2 +# +# def elastic_props(self): +# r""" +# Compute elastic properties of the solid material +# """ +# +# # shear modulus +# self.shear_modulus = self.young / (2 * (1 + self.poisson)) +# # shear wave +# self.cs = np.sqrt(self.shear_modulus / self.rho) +# # ratio of wave velocities +# self.eta = np.sqrt((1 - 2 * self.poisson) / (2 * (1 - self.poisson))) +# # determine Rayleigh wave speed: root finder of Rayleigh wave +# dd = root(self.d_function, (1 - self.poisson) / 8, tol=1e-12) +# d = dd.x[0] +# self.cr = np.sqrt(1 + d) +# +# def results(self, plots: bool = True, output_folder: str = "./", file_name: str = "results"): +# r""" +# Post-processing of the results +# +# Args: +# - plots (bool): checks if make plots (default = True) +# - output_folder (str): folder to save the results (default = "./") +# - file_name (str): name of the file (default = "results") +# """ +# +# # if load type pulse: +# # subtract two solutions with self.pulse_samples +# if self.load_type == "pulse": +# aux = np.zeros(len(self.u_bar)) +# aux[self.pulse_samples:] = self.u_bar[:-self.pulse_samples] +# self.u_bar -= aux +# +# # scale the results for each radius +# for i, r in enumerate(self.radius): +# self.u[:, i] = self.u_bar * self.load / (self.shear_modulus * r) +# self.time[:, i] = self.tau * r / self.cs +# +# # if plots +# if plots: +# if not os.path.isdir(output_folder): +# os.mkdir(output_folder) +# if not file_name: +# file_name = "results" +# # plot normalised +# fig, ax = plt.subplots(1, 1, figsize=(5, 4)) +# ax.set_position([0.20, 0.15, 0.75, 0.8]) +# plt.rcParams.update({'font.size': 10}) +# ax.plot(self.tau, self.u_bar) +# ax.set_xlim((0, np.max(self.tau))) +# # ax.set_ylim((0.15, -0.25)) +# ax.set_xlabel(r"$\tau$") +# ax.set_ylabel(r"$\bar{u}$") +# ax.grid() +# plt.savefig(os.path.join(output_folder, f"{file_name}_normalised.png")) +# plt.close() +# +# # plot magnitude of results for all radius +# fig, ax = plt.subplots(1, 1, figsize=(5, 4)) +# ax.set_position([0.20, 0.15, 0.75, 0.8]) +# plt.rcParams.update({'font.size': 10}) +# +# for i, r in enumerate(self.radius): +# ax.plot(self.time[:, i], self.u[:, i], label=f"Radius: {r} m") +# +# ax.set_xlim((0, np.max(np.max(self.time)))) +# # ax.set_ylim((0.5, -0.5)) +# ax.grid() +# ax.set_xlabel(r"Time [s]") +# ax.set_ylabel(r"Vertical displacement [m]") +# ax.legend(loc="upper right") +# plt.savefig(os.path.join(output_folder, f"{file_name}_displacement.png")) +# plt.close() +# +# def d_function(self, d: float) -> float: +# r""" +# Function to compute the residual of the Rayleigh wave speed +# +# Args: +# - d (float): parameter to compute the residual of the Rayleigh speed +# +# Returns: +# - float: residual of the Rayleigh speed +# """ +# return d - ((1 - self.poisson) / 8) / ((1 + d) * (d + self.poisson)) +# +# +# if __name__ == "__main__": +# lmb = Pekeris() +# lmb.material_properties(0.2, 1890, 100e3) +# lmb.loading(-1000, LoadType.Pulse) +# lmb.solution([3, 4, 5, 6]) +# lmb.results(output_folder="Results", file_name="Pulse") +# +# lmb = Pekeris() +# lmb.material_properties(0.2, 2000, 100e3) +# lmb.loading(-1000, LoadType.Heaviside) +# lmb.solution([3, 4, 5, 6]) +# lmb.results(output_folder="Results", file_name="Heaviside") From 66f3cd1f1e01deccd08a05ff24aa46f759d68cf2 Mon Sep 17 00:00:00 2001 From: aronnoordam Date: Tue, 23 Jul 2024 11:01:00 +0200 Subject: [PATCH 14/65] added strip load test --- .../strip_load_semi_analytical_solution.py | 406 + .../MaterialParameters_stage_1.json | 34 + .../ProjectParameters.json | 194 + .../test_lamb_stage_1.mdpa | 21050 ++++++++++++++++ .../tests/test_dynamics.py | 32 + .../tests/test_lamb/lamb.py | 513 - 6 files changed, 21716 insertions(+), 513 deletions(-) create mode 100644 applications/GeoMechanicsApplication/tests/strip_load_semi_analytical_solution.py create mode 100644 applications/GeoMechanicsApplication/tests/test_constant_strip_load_2d/MaterialParameters_stage_1.json create mode 100644 applications/GeoMechanicsApplication/tests/test_constant_strip_load_2d/ProjectParameters.json create mode 100644 applications/GeoMechanicsApplication/tests/test_constant_strip_load_2d/test_lamb_stage_1.mdpa delete mode 100644 applications/GeoMechanicsApplication/tests/test_lamb/lamb.py diff --git a/applications/GeoMechanicsApplication/tests/strip_load_semi_analytical_solution.py b/applications/GeoMechanicsApplication/tests/strip_load_semi_analytical_solution.py new file mode 100644 index 000000000000..c35dca9e3524 --- /dev/null +++ b/applications/GeoMechanicsApplication/tests/strip_load_semi_analytical_solution.py @@ -0,0 +1,406 @@ +import math +import cmath + + +class StripLoad: + """ + Class for solving the strip load problem semi-analytically + + A line load is applied to the surface of an elastic half-space dynamically. The solution is based on the following + publication: An Introduction to Soil Dynamics , Verruijt A., 2009, Delft University of Technology, Chapter 12.2 + + Attributes: + - young (float): Young's modulus [Pa] + - poisson (float): Poisson's ratio [-] + - density (float): density [kg/m^3] + - load (float): load value [N/m] + - integral_stepsize (float): dimensionless time step size for solving integrals (default = 0.001) [-] + - shear_modulus (float): shear modulus [Pa] + - p_wave_modulus (float): P-wave modulus [Pa] + - cs (float): shear wave velocity [m/s] + - cp (float): compression wave velocity [m/s] + - eta (float): ratio of shear wave to compression wave velocity [-] + - epsilon (float): epsilon to avoid division by zero [-] + + """ + + def __init__(self, + youngs_modulus: float, + poisson_ratio: float, + density: float, + load: float, + integral_stepsize: float = 0.001): + """ + Constructor for the strip load class + + Args: + - youngs_modulus (float): Young's modulus [Pa] + - poisson_ratio (float): Poisson's ratio [-] + - density (float): density [kg/m^3] + - load (float): load value [N/m] + - integral_stepsize (float): dimensionless time step size for solving integrals (default = 0.001) [-] + """ + + self.young = youngs_modulus + self.poisson = poisson_ratio + self.density = density + self.load = load + + # dimensionless time step size for solving integrals + self.integral_stepsize = integral_stepsize + + # calculate derived elastic properties + self.shear_modulus = self.young / (2 * (1 + self.poisson)) + self.p_wave_modulus = self.young * (1 - self.poisson) / ((1 + self.poisson) * (1 - 2 * self.poisson)) + self.cs = math.sqrt(self.shear_modulus / self.density) # shear wave velocity + self.cp = math.sqrt(self.p_wave_modulus / self.density) # compression wave velocity + + self.eta = self.cs / self.cp # ratio of shear wave to compression wave velocity + + # epsilon to avoid division by zero + self.epsilon = self.integral_stepsize**2 + + def __k1(self, x_norm: float, z_norm: float, kappa: float) -> float: + """ + Imaginary part of the imaginary factor for first integral + + Args: + - x_norm (float): dimensionless x coordinate normalised with the line load length [-] + - z_norm (float): dimensionless z coordinate normalised with the line load length [-] + - kappa (float): dimensionless time parameter, normalised with line load length and shear wave velocity [-] + + Returns: + - float: imaginary factor for the first integral [-] + """ + + radius = math.sqrt(x_norm**2 + z_norm**2) + kappa_r = kappa**2 - self.eta**2 * radius**2 + + if kappa_r <= 0: + k1 = 0 + else: + + # dimensionless complex variables following from laplace and fourier transforms + a = complex(kappa * math.sqrt(kappa_r), self.eta**2 * x_norm * z_norm) + beta_p = complex(kappa * x_norm / radius**2, (z_norm / radius**2) * math.sqrt(kappa_r)) + b1 = 1 - 2 * beta_p**2 + gp = cmath.sqrt(self.eta**2 - beta_p**2) + gs = cmath.sqrt(1 - beta_p**2) + + numerator = a * b1**2 + denominator = b1**2 + 4 * beta_p**2 * gp * gs + + # only get the imaginary part + k1 = (numerator / denominator).imag / math.pi + + return k1 + + def __f1(self, x_norm: float, z_norm: float, kappa: float) -> float: + """ + Calculates the first integral + + Args: + - x_norm (float): dimensionless x coordinate normalised with the line load length [-] + - z_norm (float): dimensionless z coordinate normalised with the line load length [-] + - kappa (float): dimensionless time parameter, normalised with line load length and shear wave velocity [-] + + Returns: + - float: first integral solution [-] + + """ + + # avoid division by zero + if abs(x_norm) < self.epsilon: + x_norm = self.epsilon if x_norm >= 0 else -self.epsilon + + radius = math.sqrt(x_norm**2 + z_norm**2) + + # dimensionless time parameter + time_parameter = self.eta * radius + self.epsilon + + k1_ini = self.__k1(x_norm, z_norm, time_parameter) + + x_new = max(math.sqrt(radius**2 - z_norm**2), self.epsilon) + + # solve first integral with simpson's rule + if kappa**2 <= time_parameter**2: + first_integral = 0 + else: + first_integral = ((k1_ini / (self.eta**2 * z_norm * x_new)) * math.atan( + (z_norm * math.sqrt(kappa**2 - self.eta**2 * radius**2)) / (kappa * x_new))) + h1_1 = 0 + + # solve first integral with simpson's rule + while time_parameter**2 < kappa**2: + time_parameter += self.integral_stepsize + + pz = time_parameter**2 - self.eta**2 * z_norm**2 + pr = time_parameter**2 - self.eta**2 * radius**2 + + h1_2 = (self.__k1(x_norm, z_norm, time_parameter) - k1_ini) / (pz * math.sqrt(pr)) + + time_parameter += self.integral_stepsize + + pz = time_parameter**2 - self.eta**2 * z_norm**2 + pr = time_parameter**2 - self.eta**2 * radius**2 + + h1_3 = (self.__k1(x_norm, z_norm, time_parameter) - k1_ini) / (pz * math.sqrt(pr)) + + first_integral += (h1_1 + 4 * h1_2 + h1_3) * self.integral_stepsize / 3 + h1_1 = h1_3 + + if (kappa > self.eta * z_norm) and (x_norm < 0): + first_integral += 1 + + return first_integral + + def __k2(self, x_norm: float, z_norm: float, kappa: float) -> float: + """ + Real part of the imaginary factor for the second integral + + Args: + - x_norm (float): dimensionless x coordinate normalised with the line load length [-] + - z_norm (float): dimensionless z coordinate normalised with the line load length [-] + - kappa (float): dimensionless time parameter, normalised with line load length and shear wave velocity [-] + """ + + radius = math.sqrt(x_norm**2 + z_norm**2) + kappa_r = kappa**2 - radius**2 + + if kappa_r <= 0: + k2 = 0 + else: + # dimensionless complex variables following from laplace and fourier transforms + beta_s = complex(kappa * x_norm / radius**2, (z_norm / radius**2) * math.sqrt(kappa_r)) + b1 = 1 - 2 * beta_s**2 + gp = cmath.sqrt(self.eta**2 - beta_s**2) + gs = cmath.sqrt(1 - beta_s**2) + + numerator = 4 * beta_s * (1 - beta_s**2) * gp + denominator = b1**2 + 4 * beta_s**2 * gp * gs + + k2 = (numerator / denominator).real / math.pi + + return k2 + + def __h2(self, x_norm: float, z_norm: float, time_parameter: float, radius: float, k2_0: float) -> float: + """ + Imaginary factor for the second integral + + Args: + - x_norm (float): dimensionless x coordinate normalised with the line load length [-] + - z_norm (float): dimensionless z coordinate normalised with the line load length [-] + - time_parameter (float): dimensionless integration time parameter [-] + - radius (float): dimensionless radius [-] + - k2_0 (float): initial imaginary factor for the second integral [-] + """ + + pr = time_parameter**2 - radius**2 + return (self.__k2(x_norm, z_norm, time_parameter) - k2_0) / math.sqrt(pr) + + def __f2(self, x_norm: float, z_norm: float, kappa: float) -> float: + """ + Calculates the second integral + + Args: + - x_norm (float): dimensionless x coordinate normalised with the line load length [-] + - z_norm (float): dimensionless z coordinate normalised with the line load length [-] + - kappa (float): dimensionless time parameter, normalised with line load length and shear wave velocity [-] + + Returns: + - float: second integral solution [-] + """ + + if abs(x_norm) < self.epsilon: + x_norm = self.epsilon if x_norm >= 0 else -self.epsilon + + radius = math.sqrt(x_norm**2 + z_norm**2) + + kappa_r = kappa / radius + + time_parameter = radius + self.epsilon + + k2 = self.__k2(x_norm, z_norm, time_parameter) + + if kappa**2 <= time_parameter**2: + second_integral = 0 + else: + second_integral = k2 * math.log(kappa_r + math.sqrt(kappa_r**2 - 1)) + h2_1 = 0 + + # solve second integral with simpson's rule + while time_parameter**2 < kappa**2: + + time_parameter += self.integral_stepsize + h2_2 = self.__h2(x_norm, z_norm, time_parameter, radius, k2) + + time_parameter += self.integral_stepsize + h2_3 = self.__h2(x_norm, z_norm, time_parameter, radius, k2) + + second_integral += (h2_1 + 4 * h2_2 + h2_3) * self.integral_stepsize / 3 + h2_1 = h2_3 + + return second_integral + + def __k3(self, x_norm: float, z_norm: float, kappa: float) -> float: + """ + Factor for the third integral + + Args: + - x_norm (float): dimensionless x coordinate normalised with the line load length [-] + - z_norm (float): dimensionless z coordinate normalised with the line load length [-] + - kappa (float): dimensionless time parameter, normalised with line load length and shear wave velocity [-] + + Returns: + - float: imaginary factor for the third integral [-] + + """ + + radius = math.sqrt(x_norm**2 + z_norm**2) + + kappa_q = self.eta * abs(x_norm) + z_norm * math.sqrt(1 - self.eta**2) + + if (kappa**2 >= radius**2) or (kappa <= kappa_q) or (x_norm**2 <= self.eta**2 * radius**2): + k3 = 0 + else: + beta_q = x_norm * kappa / radius**2 - (z_norm / radius**2) * math.sqrt(radius**2 - kappa**2) + + b2 = (1 - 2 * beta_q**2)**2 + numerator = 4 * beta_q * (1 - beta_q**2) * b2 * math.sqrt(beta_q**2 - self.eta**2) + + denominator = b2**2 + 16 * beta_q**4 * (1 - beta_q**2) * (beta_q**2 - self.eta**2) + + k3 = -numerator / (math.pi * denominator * math.sqrt(radius**2 - kappa**2)) + + return k3 + + def __f3(self, x_norm: float, z_norm: float, kappa: float) -> float: + """ + Calculates the third integral + + Args: + - x_norm (float): dimensionless x coordinate normalised with the line load length [-] + - z_norm (float): dimensionless z coordinate normalised with the line load length [-] + - kappa (float): dimensionless time parameter, normalised with line load length and shear wave velocity [-] + + Returns: + - float: third integral solution [-] + + """ + + radius = math.sqrt(x_norm**2 + z_norm**2) + kappa_s = radius + kappa_q = self.eta * abs(x_norm) + z_norm * math.sqrt(1 - self.eta**2) + + if (kappa <= kappa_q) or (x_norm**2 <= self.eta**2 * radius**2): + third_integral = 0 + else: + + # kappa_s is the minimum of kappa_s and kappa + kappa_s = min(kappa, kappa_s) + + # determine integral stepsize as a function of kappa_s and kappa_q + n_steps = 1000 + stepsize = (kappa_s - kappa_q) / n_steps + + third_integral = 0 + time_parameter = kappa_q + stepsize / 2 + + # solve third integral + while time_parameter < kappa_s: + third_integral += self.__k3(x_norm, z_norm, time_parameter) * stepsize + time_parameter += stepsize + + return third_integral + + def calculate_normalised_vertical_stress(self, x_norm: float, z_norm: float, kappa: float): + """ + Calculate the normalised vertical stress + + Args: + - x_norm (float): dimensionless x coordinate normalised with the line load length [-] + - z_norm (float): dimensionless z coordinate normalised with the line load length [-] + - kappa (float): dimensionless time parameter, normalised with line load length and shear wave velocity [-] + + Returns: + - float: normalised vertical stress [-] + + """ + normalised_vertical_stress = self.__f1(x_norm + 1, z_norm, kappa) - self.__f1(x_norm - 1, z_norm, kappa) + \ + self.__f2(x_norm + 1, z_norm, kappa) - self.__f2(x_norm - 1, z_norm, kappa) + \ + self.__f3(x_norm + 1, z_norm, kappa) - self.__f3(x_norm - 1, z_norm, kappa) + return normalised_vertical_stress + + def calculate_vertical_stress(self, x: float, z: float, t: float, load_length: float, load_value: float) -> float: + """ + Calculate the vertical stress + + Args: + - x (float): x coordinate [m] + - z (float): z coordinate [m] + - t (float): time [s] + - load_length (float): length of the line load [m] + - load_value (float): value of the line load [N/m] + + Returns: + - float: vertical stress [Pa] + + """ + x_norm = x / load_length + z_norm = z / load_length + kappa = self.cs * t / load_length + + normalised_vertical_stress = self.calculate_normalised_vertical_stress(x_norm, z_norm, kappa) + vertical_stress = normalised_vertical_stress * load_value * load_length + return vertical_stress + + +if __name__ == '__main__': + + import matplotlib.pyplot as plt + porosity = 0.0 + density_solid = 1020 + + line_load_length = 1 + load_value = -1000 + + strip_load = StripLoad(2.55e3 * 36, 0.25, (1 - porosity) * density_solid, load_value) + + cs = strip_load.cs + + # dimensionless time parameter + + # end_time = 10 * line_load_length / cs + end_time = 1 + + # dimensionless x coordinate + start_x = 0 + end_x = 10 + + n_steps = 100 + + ts = [end_time * i / n_steps for i in range(n_steps)] + kappas = [cs * t / line_load_length for t in ts] + kappa = cs * end_time / line_load_length + + xs = [start_x + (end_x - start_x) * i / n_steps for i in range(n_steps)] + + # z coordinate + x = 5 * line_load_length + z = 1 * line_load_length + + all_sigma_zz = [] + + for x in xs: + + xi = x / line_load_length + zeta = z / line_load_length + + sigma_zz_normalised = strip_load.calculate_normalised_vertical_stress(xi, zeta, kappa) + sigma_zz = sigma_zz_normalised * abs(strip_load.load) + + all_sigma_zz.append(sigma_zz) + + plt.plot(xs, all_sigma_zz) + + plt.show() diff --git a/applications/GeoMechanicsApplication/tests/test_constant_strip_load_2d/MaterialParameters_stage_1.json b/applications/GeoMechanicsApplication/tests/test_constant_strip_load_2d/MaterialParameters_stage_1.json new file mode 100644 index 000000000000..fc51442f9400 --- /dev/null +++ b/applications/GeoMechanicsApplication/tests/test_constant_strip_load_2d/MaterialParameters_stage_1.json @@ -0,0 +1,34 @@ +{ + "properties": [ + { + "model_part_name": "PorousDomain.soil_block", + "properties_id": 1, + "Material": { + "Variables": { + "YOUNG_MODULUS": 91800.0, + "POISSON_RATIO": 0.25, + "DENSITY_SOLID": 1020, + "POROSITY": 0.0, + "BULK_MODULUS_SOLID": 50000000000.0, + "IGNORE_UNDRAINED": true, + "PERMEABILITY_XX": 1e-30, + "PERMEABILITY_YY": 1e-30, + "PERMEABILITY_ZZ": 1e-30, + "PERMEABILITY_XY": 0, + "PERMEABILITY_YZ": 0, + "PERMEABILITY_ZX": 0, + "RETENTION_LAW": "SaturatedBelowPhreaticLevelLaw", + "SATURATED_SATURATION": 1.0, + "RESIDUAL_SATURATION": 1e-10, + "DYNAMIC_VISCOSITY": 0.0013, + "BULK_MODULUS_FLUID": 2000000000.0, + "DENSITY_WATER": 1000 + }, + "constitutive_law": { + "name": "GeoLinearElasticPlaneStrain2DLaw" + } + }, + "Tables": {} + } + ] +} \ No newline at end of file diff --git a/applications/GeoMechanicsApplication/tests/test_constant_strip_load_2d/ProjectParameters.json b/applications/GeoMechanicsApplication/tests/test_constant_strip_load_2d/ProjectParameters.json new file mode 100644 index 000000000000..76970722da89 --- /dev/null +++ b/applications/GeoMechanicsApplication/tests/test_constant_strip_load_2d/ProjectParameters.json @@ -0,0 +1,194 @@ +{ + "problem_data": { + "problem_name": "test_lamb", + "start_time": 0.0, + "end_time": 1, + "echo_level": 1, + "parallel_type": "OpenMP", + "number_of_threads": 4 + }, + "solver_settings": { + "solver_type": "U_Pw", + "model_part_name": "PorousDomain", + "domain_size": 2, + "model_import_settings": { + "input_type": "mdpa", + "input_filename": "test_lamb_stage_1" + }, + "material_import_settings": { + "materials_filename": "MaterialParameters_stage_1.json" + }, + "time_stepping": { + "time_step": 0.01, + "max_delta_time_factor": 1000 + }, + "reduction_factor": 1.0, + "increase_factor": 1.0, + "buffer_size": 2, + "echo_level": 1, + "clear_storage": false, + "compute_reactions": false, + "move_mesh_flag": false, + "reform_dofs_at_each_step": false, + "nodal_smoothing": true, + "block_builder": true, + "rebuild_level": 0, + "prebuild_dynamics": true, + "solution_type": "dynamic", + "rayleigh_m": 0.0001, + "rayleigh_k": 0.0001, + "calculate_reactions": true, + "rotation_dofs": true, + "reset_displacements": false, + "scheme_type": "newmark", + "newmark_beta": 0.25, + "newmark_gamma": 0.5, + "newmark_theta": 0.5, + "strategy_type": "newton_raphson", + "max_iterations": 15, + "min_iterations": 6, + "number_cycles": 1, + "convergence_criterion": "displacement_criterion", + "displacement_relative_tolerance": 1e-09, + "displacement_absolute_tolerance": 1e-12, + "linear_solver_settings": { + "solver_type": "amgcl", + "scaling": false, + "tolerance": 1e-06, + "max_iteration": 1000 + }, + "problem_domain_sub_model_part_list": [ + "soil_block" + ], + "processes_sub_model_part_list": [ + "load", + "base_fixed", + "side_rollers", + "zero_water_pressure" + ], + "body_domain_sub_model_part_list": [ + "soil_block" + ] + }, + "output_processes": { + }, + "processes": { + "json_output": [ + { + "python_module": "json_output_process", + "kratos_module": "KratosMultiphysics", + "process_name": "JsonOutputProcess", + "Parameters": { + "model_part_name": "PorousDomain.json_output", + "output_file_name": "json_output.json", + "output_variables": [ + ], + "gauss_points_output_variables": [ + "CAUCHY_STRESS_VECTOR" + ], + "time_frequency": 0.9999999999 + } + } + ], + "constraints_process_list": [ + { + "python_module": "apply_vector_constraint_table_process", + "kratos_module": "KratosMultiphysics.GeoMechanicsApplication", + "process_name": "ApplyVectorConstraintTableProcess", + "Parameters": { + "active": [ + true, + true, + true + ], + "is_fixed": [ + true, + true, + true + ], + "value": [ + 0.0, + 0.0, + 0.0 + ], + "model_part_name": "PorousDomain.base_fixed", + "variable_name": "DISPLACEMENT", + "table": [ + 0, + 0, + 0 + ] + } + }, + { + "python_module": "apply_vector_constraint_table_process", + "kratos_module": "KratosMultiphysics.GeoMechanicsApplication", + "process_name": "ApplyVectorConstraintTableProcess", + "Parameters": { + "active": [ + true, + false, + true + ], + "is_fixed": [ + true, + false, + false + ], + "value": [ + 0.0, + 0.0, + 0.0 + ], + "model_part_name": "PorousDomain.side_rollers", + "variable_name": "DISPLACEMENT", + "table": [ + 0, + 0, + 0 + ] + } + } + ], + "loads_process_list": [ + { + "python_module": "apply_vector_constraint_table_process", + "kratos_module": "KratosMultiphysics.GeoMechanicsApplication", + "process_name": "ApplyVectorConstraintTableProcess", + "Parameters": { + "active": [ + false, + true, + false + ], + "value": [ + 0.0, + 0.0, + 0.0 + ], + "model_part_name": "PorousDomain.load", + "variable_name": "LINE_LOAD", + "table": [ + 0, + 1, + 0 + ] + } + }, + { + "python_module": "apply_scalar_constraint_table_process", + "kratos_module": "KratosMultiphysics.GeoMechanicsApplication", + "process_name": "ApplyScalarConstraintTableProcess", + "Parameters": { + "model_part_name": "PorousDomain.zero_water_pressure", + "variable_name": "WATER_PRESSURE", + "table": 0, + "value": 0.0, + "is_fixed": true, + "fluid_pressure_type": "Uniform" + } + } + ], + "auxiliary_process_list": [] + } +} \ No newline at end of file diff --git a/applications/GeoMechanicsApplication/tests/test_constant_strip_load_2d/test_lamb_stage_1.mdpa b/applications/GeoMechanicsApplication/tests/test_constant_strip_load_2d/test_lamb_stage_1.mdpa new file mode 100644 index 000000000000..b20f904731cc --- /dev/null +++ b/applications/GeoMechanicsApplication/tests/test_constant_strip_load_2d/test_lamb_stage_1.mdpa @@ -0,0 +1,21050 @@ + +Begin Properties 1 +End Properties + + +Begin Table 1 TIME VALUE + 0.0000 0.0000 + 0.0200 -1000.0000 + 0.1100 -1000.0000 + 0.1500 -1000.0000 +End Table + + +Begin Nodes + 1 0.0000000000 0.0000000000 0.0000000000 + 2 10.0000000000 0.0000000000 0.0000000000 + 3 10.0000000000 10.0000000000 0.0000000000 + 4 0.0000000000 10.0000000000 0.0000000000 + 5 1.0000000000 10.0000000000 0.0000000000 + 6 0.2000000000 0.0000000000 0.0000000000 + 7 0.4000000000 0.0000000000 0.0000000000 + 8 0.6000000000 0.0000000000 0.0000000000 + 9 0.8000000000 0.0000000000 0.0000000000 + 10 1.0000000000 0.0000000000 0.0000000000 + 11 1.2000000000 0.0000000000 0.0000000000 + 12 1.4000000000 0.0000000000 0.0000000000 + 13 1.6000000000 0.0000000000 0.0000000000 + 14 1.8000000000 0.0000000000 0.0000000000 + 15 2.0000000000 0.0000000000 0.0000000000 + 16 2.2000000000 0.0000000000 0.0000000000 + 17 2.4000000000 0.0000000000 0.0000000000 + 18 2.6000000000 0.0000000000 0.0000000000 + 19 2.8000000000 0.0000000000 0.0000000000 + 20 3.0000000000 0.0000000000 0.0000000000 + 21 3.2000000000 0.0000000000 0.0000000000 + 22 3.4000000000 0.0000000000 0.0000000000 + 23 3.6000000000 0.0000000000 0.0000000000 + 24 3.8000000000 0.0000000000 0.0000000000 + 25 4.0000000000 0.0000000000 0.0000000000 + 26 4.2000000000 0.0000000000 0.0000000000 + 27 4.4000000000 0.0000000000 0.0000000000 + 28 4.6000000000 0.0000000000 0.0000000000 + 29 4.8000000000 0.0000000000 0.0000000000 + 30 5.0000000000 0.0000000000 0.0000000000 + 31 5.2000000000 0.0000000000 0.0000000000 + 32 5.4000000000 0.0000000000 0.0000000000 + 33 5.6000000000 0.0000000000 0.0000000000 + 34 5.8000000000 0.0000000000 0.0000000000 + 35 6.0000000000 0.0000000000 0.0000000000 + 36 6.2000000000 0.0000000000 0.0000000000 + 37 6.4000000000 0.0000000000 0.0000000000 + 38 6.6000000000 0.0000000000 0.0000000000 + 39 6.8000000000 0.0000000000 0.0000000000 + 40 7.0000000000 0.0000000000 0.0000000000 + 41 7.2000000000 0.0000000000 0.0000000000 + 42 7.4000000000 0.0000000000 0.0000000000 + 43 7.6000000000 0.0000000000 0.0000000000 + 44 7.8000000000 0.0000000000 0.0000000000 + 45 8.0000000000 0.0000000000 0.0000000000 + 46 8.2000000000 0.0000000000 0.0000000000 + 47 8.4000000000 0.0000000000 0.0000000000 + 48 8.6000000000 0.0000000000 0.0000000000 + 49 8.8000000000 0.0000000000 0.0000000000 + 50 9.0000000000 0.0000000000 0.0000000000 + 51 9.2000000000 0.0000000000 0.0000000000 + 52 9.4000000000 0.0000000000 0.0000000000 + 53 9.6000000000 0.0000000000 0.0000000000 + 54 9.8000000000 0.0000000000 0.0000000000 + 55 10.0000000000 0.2000000000 0.0000000000 + 56 10.0000000000 0.4000000000 0.0000000000 + 57 10.0000000000 0.6000000000 0.0000000000 + 58 10.0000000000 0.8000000000 0.0000000000 + 59 10.0000000000 1.0000000000 0.0000000000 + 60 10.0000000000 1.2000000000 0.0000000000 + 61 10.0000000000 1.4000000000 0.0000000000 + 62 10.0000000000 1.6000000000 0.0000000000 + 63 10.0000000000 1.8000000000 0.0000000000 + 64 10.0000000000 2.0000000000 0.0000000000 + 65 10.0000000000 2.2000000000 0.0000000000 + 66 10.0000000000 2.4000000000 0.0000000000 + 67 10.0000000000 2.6000000000 0.0000000000 + 68 10.0000000000 2.8000000000 0.0000000000 + 69 10.0000000000 3.0000000000 0.0000000000 + 70 10.0000000000 3.2000000000 0.0000000000 + 71 10.0000000000 3.4000000000 0.0000000000 + 72 10.0000000000 3.6000000000 0.0000000000 + 73 10.0000000000 3.8000000000 0.0000000000 + 74 10.0000000000 4.0000000000 0.0000000000 + 75 10.0000000000 4.2000000000 0.0000000000 + 76 10.0000000000 4.4000000000 0.0000000000 + 77 10.0000000000 4.6000000000 0.0000000000 + 78 10.0000000000 4.8000000000 0.0000000000 + 79 10.0000000000 5.0000000000 0.0000000000 + 80 10.0000000000 5.2000000000 0.0000000000 + 81 10.0000000000 5.4000000000 0.0000000000 + 82 10.0000000000 5.6000000000 0.0000000000 + 83 10.0000000000 5.8000000000 0.0000000000 + 84 10.0000000000 6.0000000000 0.0000000000 + 85 10.0000000000 6.2000000000 0.0000000000 + 86 10.0000000000 6.4000000000 0.0000000000 + 87 10.0000000000 6.6000000000 0.0000000000 + 88 10.0000000000 6.8000000000 0.0000000000 + 89 10.0000000000 7.0000000000 0.0000000000 + 90 10.0000000000 7.2000000000 0.0000000000 + 91 10.0000000000 7.4000000000 0.0000000000 + 92 10.0000000000 7.6000000000 0.0000000000 + 93 10.0000000000 7.8000000000 0.0000000000 + 94 10.0000000000 8.0000000000 0.0000000000 + 95 10.0000000000 8.2000000000 0.0000000000 + 96 10.0000000000 8.4000000000 0.0000000000 + 97 10.0000000000 8.6000000000 0.0000000000 + 98 10.0000000000 8.8000000000 0.0000000000 + 99 10.0000000000 9.0000000000 0.0000000000 + 100 10.0000000000 9.2000000000 0.0000000000 + 101 10.0000000000 9.4000000000 0.0000000000 + 102 10.0000000000 9.6000000000 0.0000000000 + 103 10.0000000000 9.8000000000 0.0000000000 + 104 0.0000000000 9.8000000000 0.0000000000 + 105 0.0000000000 9.6000000000 0.0000000000 + 106 0.0000000000 9.4000000000 0.0000000000 + 107 0.0000000000 9.2000000000 0.0000000000 + 108 0.0000000000 9.0000000000 0.0000000000 + 109 0.0000000000 8.8000000000 0.0000000000 + 110 0.0000000000 8.6000000000 0.0000000000 + 111 0.0000000000 8.4000000000 0.0000000000 + 112 0.0000000000 8.2000000000 0.0000000000 + 113 0.0000000000 8.0000000000 0.0000000000 + 114 0.0000000000 7.8000000000 0.0000000000 + 115 0.0000000000 7.6000000000 0.0000000000 + 116 0.0000000000 7.4000000000 0.0000000000 + 117 0.0000000000 7.2000000000 0.0000000000 + 118 0.0000000000 7.0000000000 0.0000000000 + 119 0.0000000000 6.8000000000 0.0000000000 + 120 0.0000000000 6.6000000000 0.0000000000 + 121 0.0000000000 6.4000000000 0.0000000000 + 122 0.0000000000 6.2000000000 0.0000000000 + 123 0.0000000000 6.0000000000 0.0000000000 + 124 0.0000000000 5.8000000000 0.0000000000 + 125 0.0000000000 5.6000000000 0.0000000000 + 126 0.0000000000 5.4000000000 0.0000000000 + 127 0.0000000000 5.2000000000 0.0000000000 + 128 0.0000000000 5.0000000000 0.0000000000 + 129 0.0000000000 4.8000000000 0.0000000000 + 130 0.0000000000 4.6000000000 0.0000000000 + 131 0.0000000000 4.4000000000 0.0000000000 + 132 0.0000000000 4.2000000000 0.0000000000 + 133 0.0000000000 4.0000000000 0.0000000000 + 134 0.0000000000 3.8000000000 0.0000000000 + 135 0.0000000000 3.6000000000 0.0000000000 + 136 0.0000000000 3.4000000000 0.0000000000 + 137 0.0000000000 3.2000000000 0.0000000000 + 138 0.0000000000 3.0000000000 0.0000000000 + 139 0.0000000000 2.8000000000 0.0000000000 + 140 0.0000000000 2.6000000000 0.0000000000 + 141 0.0000000000 2.4000000000 0.0000000000 + 142 0.0000000000 2.2000000000 0.0000000000 + 143 0.0000000000 2.0000000000 0.0000000000 + 144 0.0000000000 1.8000000000 0.0000000000 + 145 0.0000000000 1.6000000000 0.0000000000 + 146 0.0000000000 1.4000000000 0.0000000000 + 147 0.0000000000 1.2000000000 0.0000000000 + 148 0.0000000000 1.0000000000 0.0000000000 + 149 0.0000000000 0.8000000000 0.0000000000 + 150 0.0000000000 0.6000000000 0.0000000000 + 151 0.0000000000 0.4000000000 0.0000000000 + 152 0.0000000000 0.2000000000 0.0000000000 + 153 0.2000000000 10.0000000000 0.0000000000 + 154 0.4000000000 10.0000000000 0.0000000000 + 155 0.6000000000 10.0000000000 0.0000000000 + 156 0.8000000000 10.0000000000 0.0000000000 + 157 9.8000000000 10.0000000000 0.0000000000 + 158 9.6000000000 10.0000000000 0.0000000000 + 159 9.4000000000 10.0000000000 0.0000000000 + 160 9.2000000000 10.0000000000 0.0000000000 + 161 9.0000000000 10.0000000000 0.0000000000 + 162 8.8000000000 10.0000000000 0.0000000000 + 163 8.6000000000 10.0000000000 0.0000000000 + 164 8.4000000000 10.0000000000 0.0000000000 + 165 8.2000000000 10.0000000000 0.0000000000 + 166 8.0000000000 10.0000000000 0.0000000000 + 167 7.8000000000 10.0000000000 0.0000000000 + 168 7.6000000000 10.0000000000 0.0000000000 + 169 7.4000000000 10.0000000000 0.0000000000 + 170 7.2000000000 10.0000000000 0.0000000000 + 171 7.0000000000 10.0000000000 0.0000000000 + 172 6.8000000000 10.0000000000 0.0000000000 + 173 6.6000000000 10.0000000000 0.0000000000 + 174 6.4000000000 10.0000000000 0.0000000000 + 175 6.2000000000 10.0000000000 0.0000000000 + 176 6.0000000000 10.0000000000 0.0000000000 + 177 5.8000000000 10.0000000000 0.0000000000 + 178 5.6000000000 10.0000000000 0.0000000000 + 179 5.4000000000 10.0000000000 0.0000000000 + 180 5.2000000000 10.0000000000 0.0000000000 + 181 5.0000000000 10.0000000000 0.0000000000 + 182 4.8000000000 10.0000000000 0.0000000000 + 183 4.6000000000 10.0000000000 0.0000000000 + 184 4.4000000000 10.0000000000 0.0000000000 + 185 4.2000000000 10.0000000000 0.0000000000 + 186 4.0000000000 10.0000000000 0.0000000000 + 187 3.8000000000 10.0000000000 0.0000000000 + 188 3.6000000000 10.0000000000 0.0000000000 + 189 3.4000000000 10.0000000000 0.0000000000 + 190 3.2000000000 10.0000000000 0.0000000000 + 191 3.0000000000 10.0000000000 0.0000000000 + 192 2.8000000000 10.0000000000 0.0000000000 + 193 2.6000000000 10.0000000000 0.0000000000 + 194 2.4000000000 10.0000000000 0.0000000000 + 195 2.2000000000 10.0000000000 0.0000000000 + 196 2.0000000000 10.0000000000 0.0000000000 + 197 1.8000000000 10.0000000000 0.0000000000 + 198 1.6000000000 10.0000000000 0.0000000000 + 199 1.4000000000 10.0000000000 0.0000000000 + 200 1.2000000000 10.0000000000 0.0000000000 + 201 4.9030100223 0.1594125485 0.0000000000 + 202 9.8267949192 5.1000000000 0.0000000000 + 203 0.1635401477 5.0978020075 0.0000000000 + 204 5.0902157755 9.8215613995 0.0000000000 + 205 9.8267949192 3.9000000000 0.0000000000 + 206 0.1732050808 3.9000000000 0.0000000000 + 207 3.8941028488 9.8210620439 0.0000000000 + 208 6.1000000000 0.1732050808 0.0000000000 + 209 9.8267949192 6.3000000000 0.0000000000 + 210 0.1732050808 6.3000000000 0.0000000000 + 211 3.7240245458 0.1897586974 0.0000000000 + 212 6.2986293355 9.8232885758 0.0000000000 + 213 9.8267949192 2.9000000000 0.0000000000 + 214 0.1635401477 2.9021979925 0.0000000000 + 215 2.8948098381 9.8638162461 0.0000000000 + 216 7.1080948442 0.1840555300 0.0000000000 + 217 9.8267949192 7.3000000000 0.0000000000 + 218 0.1635401477 7.2978020075 0.0000000000 + 219 2.7133294711 0.1908914688 0.0000000000 + 220 7.2691760479 9.8098364433 0.0000000000 + 221 2.0702753557 9.8099079541 0.0000000000 + 222 9.8267949192 2.1000000000 0.0000000000 + 223 7.9120814385 0.1906692950 0.0000000000 + 224 0.1732050808 2.1000000000 0.0000000000 + 225 9.8267949192 8.1000000000 0.0000000000 + 226 0.1732050808 8.1000000000 0.0000000000 + 227 1.9000000000 0.1732050808 0.0000000000 + 228 8.0938010567 9.8640303212 0.0000000000 + 229 8.7000000000 0.1732050808 0.0000000000 + 230 1.2869494300 9.8211498987 0.0000000000 + 231 0.1635401477 1.2978020075 0.0000000000 + 232 9.8267949192 1.3000000000 0.0000000000 + 233 9.8267949192 8.9000000000 0.0000000000 + 234 8.7045563780 9.8412161098 0.0000000000 + 235 0.1579068528 8.6938456210 0.0000000000 + 236 9.8267949192 4.5000000000 0.0000000000 + 237 4.5000000000 9.8307401047 0.0000000000 + 238 9.8267949192 5.7000000000 0.0000000000 + 239 5.7133825423 9.8213107698 0.0000000000 + 240 5.4994760869 0.1773342885 0.0000000000 + 241 0.1579068528 4.4938456210 0.0000000000 + 242 4.3188059701 0.1794583614 0.0000000000 + 243 0.1732050808 5.7000000000 0.0000000000 + 244 1.3145664245 0.1852002234 0.0000000000 + 245 9.3042779935 0.1775398156 0.0000000000 + 246 0.1579068528 0.6938456210 0.0000000000 + 247 0.6753136853 9.8098267687 0.0000000000 + 248 9.3026203072 9.8221739909 0.0000000000 + 249 0.1579068528 9.2938456210 0.0000000000 + 250 0.6803939473 0.1876275898 0.0000000000 + 251 9.8267949192 0.7000000000 0.0000000000 + 252 1.6969976140 9.8078823101 0.0000000000 + 253 9.8267949192 8.5000000000 0.0000000000 + 254 0.1732050808 1.7000000000 0.0000000000 + 255 9.8267949192 6.9000000000 0.0000000000 + 256 3.4973119491 9.8512557693 0.0000000000 + 257 2.4913840745 9.8206485461 0.0000000000 + 258 9.8267949192 3.3000000000 0.0000000000 + 259 9.8267949192 1.7000000000 0.0000000000 + 260 9.8267949192 9.3000000000 0.0000000000 + 261 6.5176563760 0.1906021770 0.0000000000 + 262 7.5000000000 0.1690214017 0.0000000000 + 263 8.2839251455 0.1907058323 0.0000000000 + 264 2.3000000000 0.1732050808 0.0000000000 + 265 3.3009317132 0.1638418655 0.0000000000 + 266 0.1732050808 3.5000000000 0.0000000000 + 267 0.1732050808 2.5000000000 0.0000000000 + 268 7.6901719046 9.8205266860 0.0000000000 + 269 6.6883049013 9.8406793967 0.0000000000 + 270 9.8267949192 2.5000000000 0.0000000000 + 271 0.1732050808 7.7000000000 0.0000000000 + 272 0.1732050808 6.7000000000 0.0000000000 + 273 9.8267949192 7.7000000000 0.0000000000 + 274 9.6816348762 9.8188605505 0.0000000000 + 275 9.8267949192 0.3000000000 0.0000000000 + 276 0.3000000000 9.8267949192 0.0000000000 + 277 0.3000000000 0.1732050808 0.0000000000 + 278 9.8267949192 0.9000000000 0.0000000000 + 279 9.6535898385 0.8000000000 0.0000000000 + 280 9.6535898385 0.6000000000 0.0000000000 + 281 9.4821429696 0.6969546878 0.0000000000 + 282 9.4806777930 0.8994924480 0.0000000000 + 283 9.3075215515 0.7994078560 0.0000000000 + 284 9.3072854953 0.9998167173 0.0000000000 + 285 9.1340492117 0.8998707622 0.0000000000 + 286 9.1340046685 1.0999479133 0.0000000000 + 287 8.9607869634 0.9999697792 0.0000000000 + 288 8.9607774355 1.1999862821 0.0000000000 + 289 8.7875686627 1.0999926769 0.0000000000 + 290 8.7875664594 1.2999964932 0.0000000000 + 291 8.6143603961 1.1999981950 0.0000000000 + 292 8.6143598651 1.3999991147 0.0000000000 + 293 8.4411545321 1.2999995516 0.0000000000 + 294 8.4411544015 1.4999997777 0.0000000000 + 295 8.2679492570 1.3999998882 0.0000000000 + 296 8.2679492246 1.5999999443 0.0000000000 + 297 8.0947441278 1.4999999721 0.0000000000 + 298 8.0947441197 1.6999999861 0.0000000000 + 299 7.9215390349 1.5999999930 0.0000000000 + 300 7.9215390329 1.7999999965 0.0000000000 + 301 7.7483339512 1.6999999983 0.0000000000 + 302 7.7483339507 1.8999999991 0.0000000000 + 303 7.5751288697 1.7999999996 0.0000000000 + 304 7.5751288695 1.9999999998 0.0000000000 + 305 7.4019237887 1.8999999999 0.0000000000 + 306 7.4019237887 2.0999999999 0.0000000000 + 307 7.2287187079 2.0000000000 0.0000000000 + 308 7.2287187079 2.2000000000 0.0000000000 + 309 7.0555136271 2.1000000000 0.0000000000 + 310 7.0555136271 2.3000000000 0.0000000000 + 311 6.8823085464 2.2000000000 0.0000000000 + 312 6.8823085464 2.4000000000 0.0000000000 + 313 6.7091034656 2.3000000000 0.0000000000 + 314 6.7091034656 2.5000000000 0.0000000000 + 315 6.5358983849 2.4000000000 0.0000000000 + 316 6.5358983849 2.6000000000 0.0000000000 + 317 6.3626933041 2.5000000000 0.0000000000 + 318 6.3626933041 2.7000000000 0.0000000000 + 319 6.1894882233 2.6000000000 0.0000000000 + 320 6.1894882233 2.8000000000 0.0000000000 + 321 6.0162831426 2.7000000000 0.0000000000 + 322 6.0162831426 2.9000000000 0.0000000000 + 323 5.8430780618 2.8000000000 0.0000000000 + 324 5.8430780618 3.0000000000 0.0000000000 + 325 5.6698729811 2.9000000000 0.0000000000 + 326 5.6698729811 3.1000000000 0.0000000000 + 327 5.4966679003 3.0000000000 0.0000000000 + 328 5.4966679003 3.2000000000 0.0000000000 + 329 5.6698729811 3.3000000000 0.0000000000 + 330 5.4966679003 3.4000000000 0.0000000000 + 331 5.6698729811 3.5000000000 0.0000000000 + 332 5.4966679003 3.6000000000 0.0000000000 + 333 5.6698729811 3.7000000000 0.0000000000 + 334 5.4966679003 3.8000000000 0.0000000000 + 335 5.6698729811 3.9000000000 0.0000000000 + 336 5.4966679003 4.0000000000 0.0000000000 + 337 5.6698729811 4.1000000000 0.0000000000 + 338 5.4966679003 4.2000000000 0.0000000000 + 339 5.6698729811 4.3000000000 0.0000000000 + 340 5.4966679003 4.4000000000 0.0000000000 + 341 5.6698729811 4.5000000000 0.0000000000 + 342 5.4966679003 4.6000000000 0.0000000000 + 343 5.6698729811 4.7000000000 0.0000000000 + 344 5.4966679003 4.8000000000 0.0000000000 + 345 5.6698729811 4.9000000000 0.0000000000 + 346 5.4966679003 5.0000000000 0.0000000000 + 347 5.3234628196 4.7000000000 0.0000000000 + 348 5.3234628196 3.1000000000 0.0000000000 + 349 5.6698729811 5.1000000000 0.0000000000 + 350 5.4966679003 5.2000000000 0.0000000000 + 351 5.6698729811 5.3000000000 0.0000000000 + 352 5.4966679003 5.4000000000 0.0000000000 + 353 5.6698729811 5.5000000000 0.0000000000 + 354 5.4966679003 5.6000000000 0.0000000000 + 355 5.6698729811 5.7000000000 0.0000000000 + 356 5.4966679003 5.8000000000 0.0000000000 + 357 5.3234628196 5.7000000000 0.0000000000 + 358 5.3234628196 5.9000000000 0.0000000000 + 359 5.1502577388 5.8000000000 0.0000000000 + 360 5.6698729811 5.9000000000 0.0000000000 + 361 5.1502577388 6.0000000000 0.0000000000 + 362 4.9770526581 5.9000000000 0.0000000000 + 363 5.8430780618 4.8000000000 0.0000000000 + 364 5.8430780618 5.8000000000 0.0000000000 + 365 5.8430780618 6.0000000000 0.0000000000 + 366 4.9770526581 6.1000000000 0.0000000000 + 367 4.8038475773 6.0000000000 0.0000000000 + 368 6.8823085464 2.6000000000 0.0000000000 + 369 4.8038475773 6.2000000000 0.0000000000 + 370 4.6306424965 6.1000000000 0.0000000000 + 371 6.0162831426 5.9000000000 0.0000000000 + 372 6.0162831426 6.1000000000 0.0000000000 + 373 4.6306424965 6.3000000000 0.0000000000 + 374 4.4574374158 6.2000000000 0.0000000000 + 375 4.4574374158 6.4000000000 0.0000000000 + 376 4.2842323350 6.3000000000 0.0000000000 + 377 6.1894882233 6.0000000000 0.0000000000 + 378 6.1894882233 6.2000000000 0.0000000000 + 379 4.2842323350 6.1000000000 0.0000000000 + 380 4.1110272543 6.2000000000 0.0000000000 + 381 4.1110272543 6.0000000000 0.0000000000 + 382 3.9378221735 6.1000000000 0.0000000000 + 383 3.9378221735 5.9000000000 0.0000000000 + 384 3.9378221735 6.3000000000 0.0000000000 + 385 5.3234628196 3.9000000000 0.0000000000 + 386 3.7646170928 6.0000000000 0.0000000000 + 387 3.7646170928 5.8000000000 0.0000000000 + 388 4.6306424965 6.5000000000 0.0000000000 + 389 6.3626933041 6.1000000000 0.0000000000 + 390 6.3626933041 6.3000000000 0.0000000000 + 391 3.5914120120 5.9000000000 0.0000000000 + 392 3.5914120120 5.7000000000 0.0000000000 + 393 6.5358983849 6.2000000000 0.0000000000 + 394 6.5358983849 6.4000000000 0.0000000000 + 395 3.4182069312 5.8000000000 0.0000000000 + 396 3.4182069312 5.6000000000 0.0000000000 + 397 6.7091034656 6.3000000000 0.0000000000 + 398 6.7091034656 6.5000000000 0.0000000000 + 399 6.5358983849 6.6000000000 0.0000000000 + 400 6.7091034656 6.7000000000 0.0000000000 + 401 6.5358983849 6.8000000000 0.0000000000 + 402 6.7091034656 6.9000000000 0.0000000000 + 403 3.2450018505 5.7000000000 0.0000000000 + 404 3.2450018505 5.5000000000 0.0000000000 + 405 3.2450018505 5.9000000000 0.0000000000 + 406 6.5358983849 7.0000000000 0.0000000000 + 407 6.8823085464 6.6000000000 0.0000000000 + 408 6.7091034656 6.1000000000 0.0000000000 + 409 7.5751288694 2.2000000000 0.0000000000 + 410 5.3234628196 2.9000000000 0.0000000000 + 411 5.1502577388 3.0000000000 0.0000000000 + 412 6.7091034656 7.1000000000 0.0000000000 + 413 3.0717967697 5.8000000000 0.0000000000 + 414 3.0717967697 6.0000000000 0.0000000000 + 415 5.1502577388 2.8000000000 0.0000000000 + 416 4.9770526581 2.9000000000 0.0000000000 + 417 6.5358983849 7.2000000000 0.0000000000 + 418 2.8985916890 5.9000000000 0.0000000000 + 419 2.8985916890 6.1000000000 0.0000000000 + 420 4.9770526581 2.7000000000 0.0000000000 + 421 4.8038475773 2.8000000000 0.0000000000 + 422 6.7091034656 7.3000000000 0.0000000000 + 423 5.8430780618 4.0000000000 0.0000000000 + 424 6.5358983849 7.4000000000 0.0000000000 + 425 4.8038475773 2.6000000000 0.0000000000 + 426 4.6306424965 2.7000000000 0.0000000000 + 427 2.7253866082 6.0000000000 0.0000000000 + 428 2.7253866082 6.2000000000 0.0000000000 + 429 3.4182069312 5.4000000000 0.0000000000 + 430 3.2450018505 5.3000000000 0.0000000000 + 431 3.4182069312 5.2000000000 0.0000000000 + 432 3.2450018505 5.1000000000 0.0000000000 + 433 4.6306424965 2.5000000000 0.0000000000 + 434 4.4574374158 2.6000000000 0.0000000000 + 435 4.4574374158 2.8000000000 0.0000000000 + 436 4.2842323350 2.7000000000 0.0000000000 + 437 6.7091034656 7.5000000000 0.0000000000 + 438 6.8823085464 7.4000000000 0.0000000000 + 439 4.2842323350 2.5000000000 0.0000000000 + 440 4.1110272543 2.6000000000 0.0000000000 + 441 4.1110272543 2.8000000000 0.0000000000 + 442 3.9378221735 2.7000000000 0.0000000000 + 443 3.9378221735 2.5000000000 0.0000000000 + 444 3.7646170928 2.6000000000 0.0000000000 + 445 3.7646170928 2.8000000000 0.0000000000 + 446 3.5914120120 2.7000000000 0.0000000000 + 447 3.5914120120 2.5000000000 0.0000000000 + 448 3.4182069312 2.6000000000 0.0000000000 + 449 3.4182069312 2.8000000000 0.0000000000 + 450 3.2450018505 2.7000000000 0.0000000000 + 451 3.2450018505 2.9000000000 0.0000000000 + 452 3.0717967697 2.8000000000 0.0000000000 + 453 3.0717967697 2.6000000000 0.0000000000 + 454 2.8985916890 2.7000000000 0.0000000000 + 455 2.8985916890 2.9000000000 0.0000000000 + 456 2.7253866082 2.8000000000 0.0000000000 + 457 2.7253866082 3.0000000000 0.0000000000 + 458 2.7253866082 2.6000000000 0.0000000000 + 459 6.5358983849 7.6000000000 0.0000000000 + 460 2.5521815275 6.1000000000 0.0000000000 + 461 2.5521815275 6.3000000000 0.0000000000 + 462 2.5521815275 2.7000000000 0.0000000000 + 463 2.5521815275 2.5000000000 0.0000000000 + 464 4.8038475773 2.4000000000 0.0000000000 + 465 6.8823085464 7.6000000000 0.0000000000 + 466 7.0555136271 7.5000000000 0.0000000000 + 467 3.4182069312 5.0000000000 0.0000000000 + 468 6.1894882233 2.4000000000 0.0000000000 + 469 7.0555136271 7.7000000000 0.0000000000 + 470 7.2287187079 7.6000000000 0.0000000000 + 471 2.7253866082 6.4000000000 0.0000000000 + 472 2.5521815275 6.5000000000 0.0000000000 + 473 2.7253866082 6.6000000000 0.0000000000 + 474 2.5521815275 6.7000000000 0.0000000000 + 475 2.7253866082 6.8000000000 0.0000000000 + 476 2.5521815275 6.9000000000 0.0000000000 + 477 2.7253866082 7.0000000000 0.0000000000 + 478 2.5521815275 7.1000000000 0.0000000000 + 479 2.7253866082 7.2000000000 0.0000000000 + 480 2.5521815275 7.3000000000 0.0000000000 + 481 2.7253866082 7.4000000000 0.0000000000 + 482 2.5521815275 7.5000000000 0.0000000000 + 483 2.7253866082 7.6000000000 0.0000000000 + 484 2.5521815275 7.7000000000 0.0000000000 + 485 6.3626933041 7.5000000000 0.0000000000 + 486 6.3626933041 7.7000000000 0.0000000000 + 487 6.1894882233 7.6000000000 0.0000000000 + 488 2.5521815275 5.9000000000 0.0000000000 + 489 2.3789764467 7.0000000000 0.0000000000 + 490 2.3789764467 6.0000000000 0.0000000000 + 491 2.3789764467 5.8000000000 0.0000000000 + 492 2.8985916890 7.5000000000 0.0000000000 + 493 2.8985916890 7.7000000000 0.0000000000 + 494 3.0717967697 7.6000000000 0.0000000000 + 495 2.3789764467 2.6000000000 0.0000000000 + 496 2.3789764467 2.4000000000 0.0000000000 + 497 3.0717967697 7.8000000000 0.0000000000 + 498 3.2450018505 7.7000000000 0.0000000000 + 499 7.2287187079 7.8000000000 0.0000000000 + 500 7.4019237886 7.7000000000 0.0000000000 + 501 6.1894882233 7.8000000000 0.0000000000 + 502 6.0162831426 7.7000000000 0.0000000000 + 503 3.2450018505 7.9000000000 0.0000000000 + 504 3.4182069312 7.8000000000 0.0000000000 + 505 7.4019237886 7.9000000000 0.0000000000 + 506 7.5751288694 7.8000000000 0.0000000000 + 507 7.5751288694 7.6000000000 0.0000000000 + 508 7.7483339502 7.7000000000 0.0000000000 + 509 7.7483339502 7.5000000000 0.0000000000 + 510 6.0162831426 7.9000000000 0.0000000000 + 511 5.8430780618 7.8000000000 0.0000000000 + 512 7.7483339502 7.9000000000 0.0000000000 + 513 2.2057713659 5.9000000000 0.0000000000 + 514 2.2057713659 5.7000000000 0.0000000000 + 515 2.2057713659 2.5000000000 0.0000000000 + 516 2.2057713659 2.3000000000 0.0000000000 + 517 2.3789764467 2.2000000000 0.0000000000 + 518 2.2057713659 2.1000000000 0.0000000000 + 519 6.7091034656 2.1000000000 0.0000000000 + 520 8.0947441134 1.8999999971 0.0000000000 + 521 2.3789764467 7.6000000000 0.0000000000 + 522 2.3789764467 7.8000000000 0.0000000000 + 523 2.2057713659 7.7000000000 0.0000000000 + 524 2.2057713659 7.9000000000 0.0000000000 + 525 3.2450018505 4.9000000000 0.0000000000 + 526 3.4182069312 4.8000000000 0.0000000000 + 527 2.2057713659 2.7000000000 0.0000000000 + 528 5.8430780618 8.0000000000 0.0000000000 + 529 5.6698729811 7.9000000000 0.0000000000 + 530 2.3789764467 2.0000000000 0.0000000000 + 531 7.2287187079 8.0000000000 0.0000000000 + 532 3.4182069312 8.0000000000 0.0000000000 + 533 3.5914120120 7.9000000000 0.0000000000 + 534 7.9215390309 7.8000000000 0.0000000000 + 535 7.9215390309 8.0000000000 0.0000000000 + 536 2.0325662852 7.8000000000 0.0000000000 + 537 2.0325662852 8.0000000000 0.0000000000 + 538 2.0325662852 5.8000000000 0.0000000000 + 539 2.0325662852 5.6000000000 0.0000000000 + 540 2.0325662852 2.6000000000 0.0000000000 + 541 2.0325662852 2.8000000000 0.0000000000 + 542 5.6698729811 8.1000000000 0.0000000000 + 543 5.4966679003 8.0000000000 0.0000000000 + 544 6.0162831426 8.1000000000 0.0000000000 + 545 2.2057713659 8.1000000000 0.0000000000 + 546 2.2057713659 1.9000000000 0.0000000000 + 547 2.0325662852 2.0000000000 0.0000000000 + 548 3.5914120120 8.1000000000 0.0000000000 + 549 6.3626933041 2.9000000000 0.0000000000 + 550 3.2450018505 4.7000000000 0.0000000000 + 551 3.4182069312 4.6000000000 0.0000000000 + 552 7.2287187079 1.8000000000 0.0000000000 + 553 2.0325662852 1.8000000000 0.0000000000 + 554 3.5914120120 4.9000000000 0.0000000000 + 555 8.0947441117 7.9000000000 0.0000000000 + 556 8.0947441117 8.1000000000 0.0000000000 + 557 3.4182069312 8.2000000000 0.0000000000 + 558 2.3789764467 1.8000000000 0.0000000000 + 559 2.0325662852 8.2000000000 0.0000000000 + 560 3.7646170928 8.0000000000 0.0000000000 + 561 3.7646170928 8.2000000000 0.0000000000 + 562 5.4966679003 8.2000000000 0.0000000000 + 563 1.8593612044 7.9000000000 0.0000000000 + 564 1.8593612044 2.7000000000 0.0000000000 + 565 1.8593612044 2.9000000000 0.0000000000 + 566 1.8593612044 1.9000000000 0.0000000000 + 567 5.8430780618 7.6000000000 0.0000000000 + 568 1.8593612044 5.7000000000 0.0000000000 + 569 1.8593612044 5.5000000000 0.0000000000 + 570 1.8593612044 5.9000000000 0.0000000000 + 571 1.8593612044 1.7000000000 0.0000000000 + 572 2.2057713659 8.3000000000 0.0000000000 + 573 3.2450018505 4.5000000000 0.0000000000 + 574 3.0717967697 4.6000000000 0.0000000000 + 575 3.4182069312 4.4000000000 0.0000000000 + 576 4.1110272543 5.8000000000 0.0000000000 + 577 1.8593612044 7.7000000000 0.0000000000 + 578 3.7646170928 7.8000000000 0.0000000000 + 579 5.1502577388 6.2000000000 0.0000000000 + 580 3.9378221735 7.9000000000 0.0000000000 + 581 7.9215390309 8.2000000000 0.0000000000 + 582 8.0947441117 8.3000000000 0.0000000000 + 583 8.6143594605 1.5999998154 0.0000000000 + 584 8.2679491924 8.2000000000 0.0000000000 + 585 7.9215390309 8.4000000000 0.0000000000 + 586 8.2679491924 8.4000000000 0.0000000000 + 587 1.6861561237 7.8000000000 0.0000000000 + 588 1.6861561237 7.6000000000 0.0000000000 + 589 1.6861561237 5.8000000000 0.0000000000 + 590 1.6861561237 6.0000000000 0.0000000000 + 591 1.6861561237 1.8000000000 0.0000000000 + 592 1.6861561237 2.8000000000 0.0000000000 + 593 1.6861561237 3.0000000000 0.0000000000 + 594 1.8593612044 3.1000000000 0.0000000000 + 595 1.6861561237 3.2000000000 0.0000000000 + 596 1.8593612044 3.3000000000 0.0000000000 + 597 1.6861561237 3.4000000000 0.0000000000 + 598 1.8593612044 3.5000000000 0.0000000000 + 599 1.6861561237 3.6000000000 0.0000000000 + 600 1.8593612044 3.7000000000 0.0000000000 + 601 1.6861561237 3.8000000000 0.0000000000 + 602 1.8593612044 3.9000000000 0.0000000000 + 603 1.6861561237 4.0000000000 0.0000000000 + 604 1.8593612044 4.1000000000 0.0000000000 + 605 1.6861561237 4.2000000000 0.0000000000 + 606 1.6861561237 1.6000000000 0.0000000000 + 607 2.0325662852 8.4000000000 0.0000000000 + 608 3.0717967697 4.4000000000 0.0000000000 + 609 6.1894882233 5.8000000000 0.0000000000 + 610 4.9770526581 5.7000000000 0.0000000000 + 611 1.8593612044 1.5000000000 0.0000000000 + 612 7.7483339510 1.4999999985 0.0000000000 + 613 5.3234628196 8.1000000000 0.0000000000 + 614 5.3234628196 8.3000000000 0.0000000000 + 615 5.3234628196 7.9000000000 0.0000000000 + 616 5.4966679003 8.4000000000 0.0000000000 + 617 5.3234628196 8.5000000000 0.0000000000 + 618 8.4411542732 8.3000000000 0.0000000000 + 619 8.4411542732 8.5000000000 0.0000000000 + 620 2.2057713659 8.5000000000 0.0000000000 + 621 5.1502577388 8.4000000000 0.0000000000 + 622 6.0162831426 6.3000000000 0.0000000000 + 623 2.0325662852 5.4000000000 0.0000000000 + 624 3.2450018505 7.5000000000 0.0000000000 + 625 4.4574374158 6.6000000000 0.0000000000 + 626 4.6306424965 6.7000000000 0.0000000000 + 627 1.5129510429 5.9000000000 0.0000000000 + 628 1.5129510429 6.1000000000 0.0000000000 + 629 1.5129510429 4.1000000000 0.0000000000 + 630 1.5129510429 4.3000000000 0.0000000000 + 631 1.5129510429 3.1000000000 0.0000000000 + 632 5.1502577388 8.6000000000 0.0000000000 + 633 1.5129510429 7.7000000000 0.0000000000 + 634 1.5129510429 7.9000000000 0.0000000000 + 635 1.5129510429 7.5000000000 0.0000000000 + 636 1.5129510429 1.7000000000 0.0000000000 + 637 1.5129510429 1.5000000000 0.0000000000 + 638 2.0325662852 3.8000000000 0.0000000000 + 639 5.4966679003 8.6000000000 0.0000000000 + 640 2.0325662852 8.6000000000 0.0000000000 + 641 4.9770526581 8.5000000000 0.0000000000 + 642 1.3397459622 6.0000000000 0.0000000000 + 643 1.3397459622 5.8000000000 0.0000000000 + 644 1.3397459622 6.2000000000 0.0000000000 + 645 1.3397459622 4.2000000000 0.0000000000 + 646 1.3397459622 4.4000000000 0.0000000000 + 647 4.9770526581 8.7000000000 0.0000000000 + 648 2.5521815275 1.9000000000 0.0000000000 + 649 2.5521815275 1.7000000000 0.0000000000 + 650 2.7253866082 1.8000000000 0.0000000000 + 651 2.7253866082 1.6000000000 0.0000000000 + 652 2.8985916890 1.7000000000 0.0000000000 + 653 2.8985916890 1.5000000000 0.0000000000 + 654 3.0717967697 1.6000000000 0.0000000000 + 655 2.7253866082 1.4000000000 0.0000000000 + 656 3.0717967697 1.4000000000 0.0000000000 + 657 3.2450018505 1.5000000000 0.0000000000 + 658 3.2450018505 1.3000000000 0.0000000000 + 659 3.4182069312 1.4000000000 0.0000000000 + 660 4.9770526581 3.1000000000 0.0000000000 + 661 3.9378221735 7.7000000000 0.0000000000 + 662 4.1110272543 7.8000000000 0.0000000000 + 663 8.6143593539 8.4000000000 0.0000000000 + 664 8.6143593539 8.2000000000 0.0000000000 + 665 8.6143593539 8.6000000000 0.0000000000 + 666 8.4411542732 8.7000000000 0.0000000000 + 667 2.2057713659 8.7000000000 0.0000000000 + 668 1.3397459622 7.8000000000 0.0000000000 + 669 1.3397459622 8.0000000000 0.0000000000 + 670 1.3397459622 1.6000000000 0.0000000000 + 671 1.3397459622 1.8000000000 0.0000000000 + 672 1.3397459622 1.4000000000 0.0000000000 + 673 1.5129510429 6.3000000000 0.0000000000 + 674 1.3397459622 6.4000000000 0.0000000000 + 675 2.3789764467 8.6000000000 0.0000000000 + 676 2.8985916890 6.7000000000 0.0000000000 + 677 4.8038475773 8.6000000000 0.0000000000 + 678 1.8593612044 4.3000000000 0.0000000000 + 679 8.6143593539 8.8000000000 0.0000000000 + 680 1.5129510429 6.5000000000 0.0000000000 + 681 1.3397459622 6.6000000000 0.0000000000 + 682 8.2679492463 1.1999999066 0.0000000000 + 683 2.3789764467 8.8000000000 0.0000000000 + 684 2.5521815275 8.7000000000 0.0000000000 + 685 2.0325662852 8.8000000000 0.0000000000 + 686 1.8593612044 8.7000000000 0.0000000000 + 687 4.8038475773 8.8000000000 0.0000000000 + 688 4.6306424965 8.7000000000 0.0000000000 + 689 3.4182069312 1.2000000000 0.0000000000 + 690 3.5914120120 1.3000000000 0.0000000000 + 691 3.5914120120 1.5000000000 0.0000000000 + 692 3.7646170928 1.4000000000 0.0000000000 + 693 3.7646170928 1.2000000000 0.0000000000 + 694 3.9378221735 1.3000000000 0.0000000000 + 695 3.9378221735 1.5000000000 0.0000000000 + 696 4.1110272543 1.4000000000 0.0000000000 + 697 4.1110272543 1.2000000000 0.0000000000 + 698 4.2842323350 1.3000000000 0.0000000000 + 699 3.0717967697 5.2000000000 0.0000000000 + 700 2.8985916890 4.5000000000 0.0000000000 + 701 2.8985916890 4.3000000000 0.0000000000 + 702 8.7875644347 8.3000000000 0.0000000000 + 703 8.7875644347 8.1000000000 0.0000000000 + 704 3.2450018505 1.1000000000 0.0000000000 + 705 4.2842323350 1.5000000000 0.0000000000 + 706 4.4574374158 1.4000000000 0.0000000000 + 707 4.4574374158 1.2000000000 0.0000000000 + 708 4.6306424965 1.3000000000 0.0000000000 + 709 4.4574374158 6.8000000000 0.0000000000 + 710 4.6306424965 6.9000000000 0.0000000000 + 711 1.8593612044 5.3000000000 0.0000000000 + 712 2.0325662852 5.2000000000 0.0000000000 + 713 4.8038475773 6.8000000000 0.0000000000 + 714 4.8038475773 7.0000000000 0.0000000000 + 715 4.9770526581 6.9000000000 0.0000000000 + 716 6.3626933041 6.9000000000 0.0000000000 + 717 1.1665408814 5.9000000000 0.0000000000 + 718 1.1665408814 5.7000000000 0.0000000000 + 719 1.1665408814 7.9000000000 0.0000000000 + 720 1.1665408814 8.1000000000 0.0000000000 + 721 1.1665408814 6.5000000000 0.0000000000 + 722 1.1665408814 6.7000000000 0.0000000000 + 723 1.1665408814 4.3000000000 0.0000000000 + 724 1.1665408814 4.1000000000 0.0000000000 + 725 1.1665408814 4.5000000000 0.0000000000 + 726 1.1665408814 1.5000000000 0.0000000000 + 727 1.1665408814 1.3000000000 0.0000000000 + 728 1.3397459622 1.2000000000 0.0000000000 + 729 1.1665408814 1.1000000000 0.0000000000 + 730 2.5521815275 8.9000000000 0.0000000000 + 731 2.7253866082 8.8000000000 0.0000000000 + 732 8.4411542732 8.9000000000 0.0000000000 + 733 4.9770526581 8.9000000000 0.0000000000 + 734 4.6306424965 8.9000000000 0.0000000000 + 735 4.4574374158 8.8000000000 0.0000000000 + 736 4.6306424965 1.1000000000 0.0000000000 + 737 4.8038475773 1.2000000000 0.0000000000 + 738 4.8038475773 1.4000000000 0.0000000000 + 739 4.9770526581 1.3000000000 0.0000000000 + 740 4.9770526581 1.5000000000 0.0000000000 + 741 5.1502577388 1.4000000000 0.0000000000 + 742 5.1502577388 1.6000000000 0.0000000000 + 743 5.3234628196 1.5000000000 0.0000000000 + 744 5.3234628196 1.3000000000 0.0000000000 + 745 5.4966679003 1.4000000000 0.0000000000 + 746 5.3234628196 1.7000000000 0.0000000000 + 747 5.4966679003 1.2000000000 0.0000000000 + 748 5.6698729811 1.3000000000 0.0000000000 + 749 5.6698729811 1.1000000000 0.0000000000 + 750 5.8430780618 1.2000000000 0.0000000000 + 751 5.8430780618 1.4000000000 0.0000000000 + 752 6.0162831426 1.3000000000 0.0000000000 + 753 6.0162831426 1.1000000000 0.0000000000 + 754 6.1894882233 1.2000000000 0.0000000000 + 755 1.8593612044 8.9000000000 0.0000000000 + 756 1.6861561237 8.8000000000 0.0000000000 + 757 6.0162831426 1.5000000000 0.0000000000 + 758 4.8038475773 8.4000000000 0.0000000000 + 759 4.4574374158 9.0000000000 0.0000000000 + 760 4.2842323350 8.9000000000 0.0000000000 + 761 1.3397459622 1.0000000000 0.0000000000 + 762 1.6861561237 9.0000000000 0.0000000000 + 763 1.5129510429 8.9000000000 0.0000000000 + 764 0.9933358006 4.2000000000 0.0000000000 + 765 0.9933358006 4.0000000000 0.0000000000 + 766 5.4966679003 1.0000000000 0.0000000000 + 767 6.1894882233 1.0000000000 0.0000000000 + 768 6.3626933041 1.1000000000 0.0000000000 + 769 8.6143593539 9.0000000000 0.0000000000 + 770 8.7875644347 8.9000000000 0.0000000000 + 771 4.8038475773 1.0000000000 0.0000000000 + 772 8.9607711729 1.3999971292 0.0000000000 + 773 8.0947441117 7.7000000000 0.0000000000 + 774 6.3626933041 1.3000000000 0.0000000000 + 775 6.5358983849 1.2000000000 0.0000000000 + 776 6.5358983849 1.0000000000 0.0000000000 + 777 6.7091034656 1.1000000000 0.0000000000 + 778 5.1502577388 2.6000000000 0.0000000000 + 779 6.3626933041 7.9000000000 0.0000000000 + 780 5.8430780618 3.6000000000 0.0000000000 + 781 3.5914120120 4.5000000000 0.0000000000 + 782 3.5914120120 4.3000000000 0.0000000000 + 783 3.7646170928 4.4000000000 0.0000000000 + 784 3.7646170928 4.2000000000 0.0000000000 + 785 3.9378221735 4.3000000000 0.0000000000 + 786 3.9378221735 4.1000000000 0.0000000000 + 787 4.1110272543 4.2000000000 0.0000000000 + 788 4.1110272543 4.4000000000 0.0000000000 + 789 4.1110272543 4.0000000000 0.0000000000 + 790 3.5914120120 4.1000000000 0.0000000000 + 791 4.2842323350 4.3000000000 0.0000000000 + 792 4.2842323350 4.5000000000 0.0000000000 + 793 4.4574374158 4.4000000000 0.0000000000 + 794 4.4574374158 4.6000000000 0.0000000000 + 795 6.8823085464 7.0000000000 0.0000000000 + 796 5.8430780618 5.2000000000 0.0000000000 + 797 1.5129510429 6.7000000000 0.0000000000 + 798 5.8430780618 4.4000000000 0.0000000000 + 799 2.8985916890 3.1000000000 0.0000000000 + 800 2.7253866082 3.2000000000 0.0000000000 + 801 2.8985916890 3.3000000000 0.0000000000 + 802 3.4182069312 3.0000000000 0.0000000000 + 803 2.7253866082 8.6000000000 0.0000000000 + 804 2.8985916890 8.7000000000 0.0000000000 + 805 2.8985916890 8.9000000000 0.0000000000 + 806 3.0717967697 8.8000000000 0.0000000000 + 807 3.0717967697 9.0000000000 0.0000000000 + 808 3.2450018505 8.9000000000 0.0000000000 + 809 3.0717967697 1.8000000000 0.0000000000 + 810 5.3234628196 4.3000000000 0.0000000000 + 811 7.2287187079 2.4000000000 0.0000000000 + 812 1.6861561237 6.6000000000 0.0000000000 + 813 1.6861561237 6.8000000000 0.0000000000 + 814 1.6861561237 2.0000000000 0.0000000000 + 815 4.2842323350 4.7000000000 0.0000000000 + 816 4.4574374158 4.8000000000 0.0000000000 + 817 4.2842323350 4.9000000000 0.0000000000 + 818 4.4574374158 5.0000000000 0.0000000000 + 819 7.5751288694 7.4000000000 0.0000000000 + 820 7.7483339502 7.3000000000 0.0000000000 + 821 7.5751288694 7.2000000000 0.0000000000 + 822 7.7483339502 7.1000000000 0.0000000000 + 823 7.9215390309 7.2000000000 0.0000000000 + 824 7.9215390309 7.0000000000 0.0000000000 + 825 8.0947441117 7.1000000000 0.0000000000 + 826 8.0947441117 6.9000000000 0.0000000000 + 827 8.2679491924 7.0000000000 0.0000000000 + 828 8.2679491924 6.8000000000 0.0000000000 + 829 8.0947441117 6.7000000000 0.0000000000 + 830 8.2679491924 6.6000000000 0.0000000000 + 831 8.0947441117 6.5000000000 0.0000000000 + 832 8.2679491924 6.4000000000 0.0000000000 + 833 8.0947441117 6.3000000000 0.0000000000 + 834 8.2679491924 6.2000000000 0.0000000000 + 835 8.0947441117 6.1000000000 0.0000000000 + 836 8.2679491924 6.0000000000 0.0000000000 + 837 8.0947441117 5.9000000000 0.0000000000 + 838 8.2679491924 5.8000000000 0.0000000000 + 839 8.0947441117 5.7000000000 0.0000000000 + 840 8.2679491924 5.6000000000 0.0000000000 + 841 8.0947441117 5.5000000000 0.0000000000 + 842 8.2679491924 5.4000000000 0.0000000000 + 843 8.0947441117 5.3000000000 0.0000000000 + 844 8.2679491924 5.2000000000 0.0000000000 + 845 8.0947441117 5.1000000000 0.0000000000 + 846 8.2679491924 5.0000000000 0.0000000000 + 847 8.0947441117 4.9000000000 0.0000000000 + 848 7.9215390309 5.0000000000 0.0000000000 + 849 7.9215390309 4.8000000000 0.0000000000 + 850 8.0947441117 4.7000000000 0.0000000000 + 851 7.9215390309 4.6000000000 0.0000000000 + 852 8.0947441117 4.5000000000 0.0000000000 + 853 7.9215390309 4.4000000000 0.0000000000 + 854 8.0947441117 4.3000000000 0.0000000000 + 855 7.9215390309 4.2000000000 0.0000000000 + 856 8.0947441117 4.1000000000 0.0000000000 + 857 7.7483339502 4.5000000000 0.0000000000 + 858 7.9215390309 4.0000000000 0.0000000000 + 859 8.0947441117 3.9000000000 0.0000000000 + 860 8.2679491924 4.2000000000 0.0000000000 + 861 7.9215390309 3.8000000000 0.0000000000 + 862 8.0947441117 3.7000000000 0.0000000000 + 863 7.7483339502 3.9000000000 0.0000000000 + 864 7.7483339502 3.7000000000 0.0000000000 + 865 7.5751288694 3.8000000000 0.0000000000 + 866 8.4411542732 5.3000000000 0.0000000000 + 867 8.4411542732 5.9000000000 0.0000000000 + 868 8.4411542732 6.5000000000 0.0000000000 + 869 7.9215390309 5.6000000000 0.0000000000 + 870 7.5751288694 3.6000000000 0.0000000000 + 871 7.4019237886 3.7000000000 0.0000000000 + 872 7.9215390309 6.2000000000 0.0000000000 + 873 7.4019237886 3.5000000000 0.0000000000 + 874 7.2287187079 3.6000000000 0.0000000000 + 875 7.2287187079 3.8000000000 0.0000000000 + 876 7.5751288694 3.4000000000 0.0000000000 + 877 7.0555136271 3.7000000000 0.0000000000 + 878 7.0555136271 3.9000000000 0.0000000000 + 879 6.8823085464 3.8000000000 0.0000000000 + 880 6.8823085464 4.0000000000 0.0000000000 + 881 7.0555136271 3.5000000000 0.0000000000 + 882 8.4411542732 6.9000000000 0.0000000000 + 883 8.4411542732 7.1000000000 0.0000000000 + 884 8.6143593539 7.0000000000 0.0000000000 + 885 8.6143593539 7.2000000000 0.0000000000 + 886 8.7875644347 7.1000000000 0.0000000000 + 887 8.7875644347 7.3000000000 0.0000000000 + 888 8.7875644347 6.9000000000 0.0000000000 + 889 7.5751288694 7.0000000000 0.0000000000 + 890 4.4574374158 1.6000000000 0.0000000000 + 891 4.2842323350 1.7000000000 0.0000000000 + 892 6.7091034656 3.9000000000 0.0000000000 + 893 6.7091034656 4.1000000000 0.0000000000 + 894 6.8823085464 4.2000000000 0.0000000000 + 895 6.7091034656 4.3000000000 0.0000000000 + 896 6.8823085464 4.4000000000 0.0000000000 + 897 6.7091034656 4.5000000000 0.0000000000 + 898 6.8823085464 4.6000000000 0.0000000000 + 899 6.7091034656 4.7000000000 0.0000000000 + 900 6.8823085464 4.8000000000 0.0000000000 + 901 6.7091034656 4.9000000000 0.0000000000 + 902 6.8823085464 5.0000000000 0.0000000000 + 903 6.8823085464 6.2000000000 0.0000000000 + 904 6.8823085464 6.0000000000 0.0000000000 + 905 7.0555136271 6.1000000000 0.0000000000 + 906 7.0555136271 5.9000000000 0.0000000000 + 907 2.0325662852 9.0000000000 0.0000000000 + 908 4.9770526581 7.1000000000 0.0000000000 + 909 5.1502577388 7.0000000000 0.0000000000 + 910 4.8038475773 7.2000000000 0.0000000000 + 911 8.2679491924 3.8000000000 0.0000000000 + 912 8.2679491924 3.6000000000 0.0000000000 + 913 8.4411542732 3.7000000000 0.0000000000 + 914 8.4411542732 3.5000000000 0.0000000000 + 915 8.6143593539 3.6000000000 0.0000000000 + 916 8.6143593539 3.4000000000 0.0000000000 + 917 8.4411542732 3.3000000000 0.0000000000 + 918 8.6143593539 3.2000000000 0.0000000000 + 919 8.4411542732 3.1000000000 0.0000000000 + 920 8.6143593539 3.0000000000 0.0000000000 + 921 8.4411542732 2.9000000000 0.0000000000 + 922 8.6143593539 2.8000000000 0.0000000000 + 923 8.7875644347 3.5000000000 0.0000000000 + 924 8.7875644347 3.7000000000 0.0000000000 + 925 8.7875644347 2.9000000000 0.0000000000 + 926 8.7875644347 2.7000000000 0.0000000000 + 927 8.9607695155 3.6000000000 0.0000000000 + 928 8.9607695155 3.8000000000 0.0000000000 + 929 8.6143593539 2.6000000000 0.0000000000 + 930 8.7875644347 2.5000000000 0.0000000000 + 931 8.2679491924 3.0000000000 0.0000000000 + 932 3.9378221735 3.9000000000 0.0000000000 + 933 4.1110272543 3.8000000000 0.0000000000 + 934 5.3234628196 5.1000000000 0.0000000000 + 935 4.4574374158 4.2000000000 0.0000000000 + 936 3.2450018505 6.1000000000 0.0000000000 + 937 3.7646170928 5.6000000000 0.0000000000 + 938 7.4019237886 3.3000000000 0.0000000000 + 939 7.5751288694 3.2000000000 0.0000000000 + 940 8.2679491924 4.6000000000 0.0000000000 + 941 5.8430780618 2.6000000000 0.0000000000 + 942 2.2057713659 5.3000000000 0.0000000000 + 943 2.2057713659 5.1000000000 0.0000000000 + 944 1.1665408814 7.7000000000 0.0000000000 + 945 2.7253866082 3.4000000000 0.0000000000 + 946 2.8985916890 3.5000000000 0.0000000000 + 947 6.7091034656 3.7000000000 0.0000000000 + 948 7.0555136271 4.9000000000 0.0000000000 + 949 6.7091034656 5.1000000000 0.0000000000 + 950 4.4574374158 7.0000000000 0.0000000000 + 951 4.2842323350 6.9000000000 0.0000000000 + 952 8.6143602323 0.9999984786 0.0000000000 + 953 8.2679491924 2.8000000000 0.0000000000 + 954 1.5129510429 3.5000000000 0.0000000000 + 955 4.1110272543 8.0000000000 0.0000000000 + 956 4.2842323350 7.9000000000 0.0000000000 + 957 1.8593612044 5.1000000000 0.0000000000 + 958 1.6861561237 5.2000000000 0.0000000000 + 959 7.0555136271 5.1000000000 0.0000000000 + 960 3.9378221735 3.7000000000 0.0000000000 + 961 4.1110272543 3.6000000000 0.0000000000 + 962 4.2842323350 3.7000000000 0.0000000000 + 963 2.7253866082 3.6000000000 0.0000000000 + 964 2.7253866082 4.4000000000 0.0000000000 + 965 3.4182069312 1.0000000000 0.0000000000 + 966 8.9607695155 2.6000000000 0.0000000000 + 967 8.9607695155 2.4000000000 0.0000000000 + 968 8.9607695155 7.0000000000 0.0000000000 + 969 8.9607695155 6.8000000000 0.0000000000 + 970 8.9607695155 8.2000000000 0.0000000000 + 971 8.9607695155 8.0000000000 0.0000000000 + 972 4.4574374158 1.0000000000 0.0000000000 + 973 4.6306424965 9.1000000000 0.0000000000 + 974 1.1665408814 0.9000000000 0.0000000000 + 975 0.9933358006 1.0000000000 0.0000000000 + 976 5.6698729811 0.9000000000 0.0000000000 + 977 8.7875644347 9.1000000000 0.0000000000 + 978 8.9607695155 9.0000000000 0.0000000000 + 979 0.9933358006 7.8000000000 0.0000000000 + 980 0.9933358006 7.6000000000 0.0000000000 + 981 0.9933358006 5.8000000000 0.0000000000 + 982 0.9933358006 5.6000000000 0.0000000000 + 983 0.9933358006 6.6000000000 0.0000000000 + 984 0.9933358006 6.8000000000 0.0000000000 + 985 0.9933358006 1.4000000000 0.0000000000 + 986 0.9933358006 1.6000000000 0.0000000000 + 987 6.7091034656 0.9000000000 0.0000000000 + 988 6.8823085464 1.0000000000 0.0000000000 + 989 4.2842323350 9.1000000000 0.0000000000 + 990 4.1110272543 9.0000000000 0.0000000000 + 991 3.2450018505 0.9000000000 0.0000000000 + 992 8.4411542732 9.1000000000 0.0000000000 + 993 8.2679491924 9.0000000000 0.0000000000 + 994 2.8985916890 9.1000000000 0.0000000000 + 995 3.2450018505 9.1000000000 0.0000000000 + 996 1.5129510429 9.1000000000 0.0000000000 + 997 1.3397459622 9.0000000000 0.0000000000 + 998 6.5358983849 1.4000000000 0.0000000000 + 999 4.9770526581 1.7000000000 0.0000000000 + 1000 8.6143593539 2.4000000000 0.0000000000 + 1001 7.4019237886 3.1000000000 0.0000000000 + 1002 7.5751288694 3.0000000000 0.0000000000 + 1003 7.2287187079 6.0000000000 0.0000000000 + 1004 7.2287187079 6.2000000000 0.0000000000 + 1005 7.2287187079 5.8000000000 0.0000000000 + 1006 1.3397459622 8.8000000000 0.0000000000 + 1007 1.1665408814 8.9000000000 0.0000000000 + 1008 1.1665408814 9.1000000000 0.0000000000 + 1009 0.9933358006 9.0000000000 0.0000000000 + 1010 0.9933358006 8.8000000000 0.0000000000 + 1011 4.6306424965 4.5000000000 0.0000000000 + 1012 2.5521815275 7.9000000000 0.0000000000 + 1013 2.3789764467 6.4000000000 0.0000000000 + 1014 4.6306424965 4.9000000000 0.0000000000 + 1015 5.1502577388 7.2000000000 0.0000000000 + 1016 5.3234628196 7.1000000000 0.0000000000 + 1017 5.3234628196 6.9000000000 0.0000000000 + 1018 5.4966679003 7.0000000000 0.0000000000 + 1019 5.4966679003 6.8000000000 0.0000000000 + 1020 4.2842323350 5.1000000000 0.0000000000 + 1021 4.4574374158 5.2000000000 0.0000000000 + 1022 6.5358983849 4.6000000000 0.0000000000 + 1023 6.5358983849 5.0000000000 0.0000000000 + 1024 1.8593612044 7.5000000000 0.0000000000 + 1025 4.2842323350 8.7000000000 0.0000000000 + 1026 4.2842323350 3.5000000000 0.0000000000 + 1027 4.4574374158 3.6000000000 0.0000000000 + 1028 7.0555136271 4.3000000000 0.0000000000 + 1029 2.5521815275 5.7000000000 0.0000000000 + 1030 6.5358983849 4.2000000000 0.0000000000 + 1031 6.5358983849 3.8000000000 0.0000000000 + 1032 6.5358983849 3.6000000000 0.0000000000 + 1033 2.7253866082 4.6000000000 0.0000000000 + 1034 4.2842323350 7.7000000000 0.0000000000 + 1035 4.4574374158 7.8000000000 0.0000000000 + 1036 6.8823085464 5.8000000000 0.0000000000 + 1037 2.5521815275 4.5000000000 0.0000000000 + 1038 2.5521815275 4.3000000000 0.0000000000 + 1039 3.9378221735 3.5000000000 0.0000000000 + 1040 3.7646170928 3.6000000000 0.0000000000 + 1041 9.1339745962 3.7000000000 0.0000000000 + 1042 9.1339745962 3.9000000000 0.0000000000 + 1043 8.9607695155 4.0000000000 0.0000000000 + 1044 9.1339745962 3.5000000000 0.0000000000 + 1045 9.1339745962 4.1000000000 0.0000000000 + 1046 8.9607695155 4.2000000000 0.0000000000 + 1047 9.1339745962 4.3000000000 0.0000000000 + 1048 8.9607695155 4.4000000000 0.0000000000 + 1049 9.1339745962 4.5000000000 0.0000000000 + 1050 8.9607695155 4.6000000000 0.0000000000 + 1051 9.1339745962 4.7000000000 0.0000000000 + 1052 8.9607695155 4.8000000000 0.0000000000 + 1053 9.1339745962 4.9000000000 0.0000000000 + 1054 8.9607695155 9.2000000000 0.0000000000 + 1055 9.1339745962 9.1000000000 0.0000000000 + 1056 9.1339745962 8.9000000000 0.0000000000 + 1057 0.8201307199 8.9000000000 0.0000000000 + 1058 0.8201307199 8.7000000000 0.0000000000 + 1059 0.8201307199 9.1000000000 0.0000000000 + 1060 0.8201307199 4.1000000000 0.0000000000 + 1061 0.8201307199 3.9000000000 0.0000000000 + 1062 0.8201307199 4.3000000000 0.0000000000 + 1063 0.8201307199 1.5000000000 0.0000000000 + 1064 0.8201307199 1.7000000000 0.0000000000 + 1065 1.3397459622 0.8000000000 0.0000000000 + 1066 1.5129510429 0.9000000000 0.0000000000 + 1067 0.9933358006 0.8000000000 0.0000000000 + 1068 0.8201307199 0.9000000000 0.0000000000 + 1069 6.8823085464 1.2000000000 0.0000000000 + 1070 7.0555136271 1.1000000000 0.0000000000 + 1071 7.0555136271 0.9000000000 0.0000000000 + 1072 7.2287187079 1.0000000000 0.0000000000 + 1073 4.4574374158 1.8000000000 0.0000000000 + 1074 1.1665408814 6.9000000000 0.0000000000 + 1075 3.0717967697 8.0000000000 0.0000000000 + 1076 1.6861561237 8.6000000000 0.0000000000 + 1077 3.4182069312 2.4000000000 0.0000000000 + 1078 3.5914120120 2.3000000000 0.0000000000 + 1079 3.4182069312 9.0000000000 0.0000000000 + 1080 2.0325662852 3.2000000000 0.0000000000 + 1081 5.6698729811 6.9000000000 0.0000000000 + 1082 7.7483339502 4.9000000000 0.0000000000 + 1083 2.3789764467 5.2000000000 0.0000000000 + 1084 6.5358983849 5.2000000000 0.0000000000 + 1085 1.6861561237 5.0000000000 0.0000000000 + 1086 1.5129510429 5.1000000000 0.0000000000 + 1087 9.1339745962 2.5000000000 0.0000000000 + 1088 9.1339745962 2.7000000000 0.0000000000 + 1089 9.1339745962 2.3000000000 0.0000000000 + 1090 8.9607695155 2.2000000000 0.0000000000 + 1091 9.1339745962 2.1000000000 0.0000000000 + 1092 9.1339745962 6.9000000000 0.0000000000 + 1093 9.1339745962 6.7000000000 0.0000000000 + 1094 9.1339745962 7.1000000000 0.0000000000 + 1095 9.1339745962 8.1000000000 0.0000000000 + 1096 9.1339745962 7.9000000000 0.0000000000 + 1097 3.4182069312 0.8000000000 0.0000000000 + 1098 7.2287187079 0.8000000000 0.0000000000 + 1099 7.4019237886 0.9000000000 0.0000000000 + 1100 8.9607848594 0.7999734236 0.0000000000 + 1101 5.4966679003 0.8000000000 0.0000000000 + 1102 5.6710869813 0.6985691166 0.0000000000 + 1103 1.6861561237 9.2000000000 0.0000000000 + 1104 4.1110272543 9.2000000000 0.0000000000 + 1105 6.5358983849 0.8000000000 0.0000000000 + 1106 8.2679491924 9.2000000000 0.0000000000 + 1107 8.0947441117 9.1000000000 0.0000000000 + 1108 3.4182069312 9.2000000000 0.0000000000 + 1109 6.7091034656 0.7000000000 0.0000000000 + 1110 1.5129510429 0.7000000000 0.0000000000 + 1111 1.6861561237 0.8000000000 0.0000000000 + 1112 7.2287187079 1.2000000000 0.0000000000 + 1113 3.4182069312 8.8000000000 0.0000000000 + 1114 4.2842323350 1.9000000000 0.0000000000 + 1115 0.9933358006 7.0000000000 0.0000000000 + 1116 0.8201307199 6.9000000000 0.0000000000 + 1117 0.8201307199 7.1000000000 0.0000000000 + 1118 8.9607695155 6.6000000000 0.0000000000 + 1119 9.1339745962 6.5000000000 0.0000000000 + 1120 8.9607695155 6.4000000000 0.0000000000 + 1121 9.1339745962 6.3000000000 0.0000000000 + 1122 8.7875644347 7.9000000000 0.0000000000 + 1123 5.1502577388 8.0000000000 0.0000000000 + 1124 0.9933358006 6.0000000000 0.0000000000 + 1125 0.8201307199 5.9000000000 0.0000000000 + 1126 0.8201307199 6.1000000000 0.0000000000 + 1127 8.9607695155 6.2000000000 0.0000000000 + 1128 9.1339745962 6.1000000000 0.0000000000 + 1129 8.9607695155 6.0000000000 0.0000000000 + 1130 9.1339745962 5.9000000000 0.0000000000 + 1131 8.9607695155 5.8000000000 0.0000000000 + 1132 9.1339745962 5.7000000000 0.0000000000 + 1133 8.9607695155 5.6000000000 0.0000000000 + 1134 9.1339745962 5.5000000000 0.0000000000 + 1135 6.1894882233 7.4000000000 0.0000000000 + 1136 3.7646170928 7.6000000000 0.0000000000 + 1137 3.9378221735 7.5000000000 0.0000000000 + 1138 3.7646170928 7.4000000000 0.0000000000 + 1139 4.6306424965 5.9000000000 0.0000000000 + 1140 3.0717967697 1.0000000000 0.0000000000 + 1141 3.0717967697 0.8000000000 0.0000000000 + 1142 2.8985916890 0.9000000000 0.0000000000 + 1143 2.7253866082 2.0000000000 0.0000000000 + 1144 3.0717967697 3.4000000000 0.0000000000 + 1145 3.0717967697 3.6000000000 0.0000000000 + 1146 1.6861561237 2.6000000000 0.0000000000 + 1147 1.5129510429 2.7000000000 0.0000000000 + 1148 1.5129510429 2.5000000000 0.0000000000 + 1149 1.3397459622 2.6000000000 0.0000000000 + 1150 1.3397459622 2.4000000000 0.0000000000 + 1151 1.1665408814 2.5000000000 0.0000000000 + 1152 1.1665408814 2.7000000000 0.0000000000 + 1153 0.9933358006 2.6000000000 0.0000000000 + 1154 0.9933358006 2.8000000000 0.0000000000 + 1155 0.9933358006 2.4000000000 0.0000000000 + 1156 0.8201307199 2.7000000000 0.0000000000 + 1157 0.8201307199 2.9000000000 0.0000000000 + 1158 0.9933358006 3.0000000000 0.0000000000 + 1159 0.8201307199 3.1000000000 0.0000000000 + 1160 0.9933358006 3.2000000000 0.0000000000 + 1161 0.8201307199 3.3000000000 0.0000000000 + 1162 7.7483339502 5.1000000000 0.0000000000 + 1163 1.8593612044 6.7000000000 0.0000000000 + 1164 1.8593612044 6.9000000000 0.0000000000 + 1165 6.0162831426 3.1000000000 0.0000000000 + 1166 8.6143593539 7.4000000000 0.0000000000 + 1167 7.7483339502 3.3000000000 0.0000000000 + 1168 1.8593612044 6.1000000000 0.0000000000 + 1169 5.6698729811 6.1000000000 0.0000000000 + 1170 5.1502577388 7.8000000000 0.0000000000 + 1171 7.5751288694 4.0000000000 0.0000000000 + 1172 2.8985916890 7.1000000000 0.0000000000 + 1173 5.3234628196 3.5000000000 0.0000000000 + 1174 0.9933358006 3.8000000000 0.0000000000 + 1175 5.3234628196 7.7000000000 0.0000000000 + 1176 7.4019237886 8.1000000000 0.0000000000 + 1177 7.2287187079 8.2000000000 0.0000000000 + 1178 7.0555136271 8.1000000000 0.0000000000 + 1179 7.0555136271 8.3000000000 0.0000000000 + 1180 7.2287187079 8.4000000000 0.0000000000 + 1181 7.0555136271 8.5000000000 0.0000000000 + 1182 7.2287187079 8.6000000000 0.0000000000 + 1183 7.0555136271 8.7000000000 0.0000000000 + 1184 7.2287187079 8.8000000000 0.0000000000 + 1185 6.8823085464 8.6000000000 0.0000000000 + 1186 6.8823085464 8.8000000000 0.0000000000 + 1187 6.7091034656 8.7000000000 0.0000000000 + 1188 6.7091034656 8.9000000000 0.0000000000 + 1189 6.5358983849 8.8000000000 0.0000000000 + 1190 6.5358983849 9.0000000000 0.0000000000 + 1191 6.3626933041 8.9000000000 0.0000000000 + 1192 6.8823085464 9.0000000000 0.0000000000 + 1193 6.3626933041 9.1000000000 0.0000000000 + 1194 6.1894882233 9.0000000000 0.0000000000 + 1195 6.5358983849 8.6000000000 0.0000000000 + 1196 6.1894882233 8.8000000000 0.0000000000 + 1197 6.1894882233 9.2000000000 0.0000000000 + 1198 6.0162831426 9.1000000000 0.0000000000 + 1199 6.5358983849 9.2000000000 0.0000000000 + 1200 7.4019237886 8.7000000000 0.0000000000 + 1201 7.4019237886 8.9000000000 0.0000000000 + 1202 2.5521815275 3.5000000000 0.0000000000 + 1203 7.5751288694 8.8000000000 0.0000000000 + 1204 7.5751288694 9.0000000000 0.0000000000 + 1205 7.4019237886 9.1000000000 0.0000000000 + 1206 7.5751288694 9.2000000000 0.0000000000 + 1207 5.8430780618 1.6000000000 0.0000000000 + 1208 6.0162831426 1.7000000000 0.0000000000 + 1209 5.8430780618 1.8000000000 0.0000000000 + 1210 8.9607695155 5.0000000000 0.0000000000 + 1211 9.1339745962 8.3000000000 0.0000000000 + 1212 2.5521815275 3.7000000000 0.0000000000 + 1213 4.2842323350 8.1000000000 0.0000000000 + 1214 7.4019237886 5.9000000000 0.0000000000 + 1215 7.4019237886 5.7000000000 0.0000000000 + 1216 7.9215390309 6.6000000000 0.0000000000 + 1217 3.0717967697 4.2000000000 0.0000000000 + 1218 4.4574374158 3.4000000000 0.0000000000 + 1219 4.6306424965 3.5000000000 0.0000000000 + 1220 4.6306424965 3.7000000000 0.0000000000 + 1221 2.3789764467 1.6000000000 0.0000000000 + 1222 6.8823085464 8.2000000000 0.0000000000 + 1223 1.8593612044 4.9000000000 0.0000000000 + 1224 9.3072023254 1.1999607718 0.0000000000 + 1225 5.6698729811 8.5000000000 0.0000000000 + 1226 9.3071796770 3.6000000000 0.0000000000 + 1227 9.3071796770 4.8000000000 0.0000000000 + 1228 9.3071796770 4.2000000000 0.0000000000 + 1229 9.3071796770 3.4000000000 0.0000000000 + 1230 9.3071796770 5.0000000000 0.0000000000 + 1231 9.3071796770 6.6000000000 0.0000000000 + 1232 9.3071796770 6.0000000000 0.0000000000 + 1233 0.8201307199 7.7000000000 0.0000000000 + 1234 0.8201307199 7.9000000000 0.0000000000 + 1235 3.2450018505 9.3000000000 0.0000000000 + 1236 6.0162831426 9.3000000000 0.0000000000 + 1237 5.8430780618 9.2000000000 0.0000000000 + 1238 0.6469256391 9.0000000000 0.0000000000 + 1239 0.6469256391 7.0000000000 0.0000000000 + 1240 0.6469256391 6.0000000000 0.0000000000 + 1241 0.6469256391 4.2000000000 0.0000000000 + 1242 0.6469256391 3.2000000000 0.0000000000 + 1243 8.4411542732 9.3000000000 0.0000000000 + 1244 0.6469256391 9.2000000000 0.0000000000 + 1245 0.8201307199 9.3000000000 0.0000000000 + 1246 0.6469256391 7.2000000000 0.0000000000 + 1247 0.6469256391 6.2000000000 0.0000000000 + 1248 0.6469256391 4.4000000000 0.0000000000 + 1249 0.6469256391 3.4000000000 0.0000000000 + 1250 0.6469256391 6.8000000000 0.0000000000 + 1251 0.6469256391 5.8000000000 0.0000000000 + 1252 4.2853465765 9.2980700771 0.0000000000 + 1253 1.5129510429 9.3000000000 0.0000000000 + 1254 2.8985916890 0.7000000000 0.0000000000 + 1255 2.7253866082 0.8000000000 0.0000000000 + 1256 8.0947441117 9.3000000000 0.0000000000 + 1257 9.1339745962 9.3000000000 0.0000000000 + 1258 0.8189777438 0.7019970131 0.0000000000 + 1259 7.4019237886 9.3000000000 0.0000000000 + 1260 7.4019237886 0.7000000000 0.0000000000 + 1261 7.5751288694 0.8000000000 0.0000000000 + 1262 7.5751288694 1.0000000000 0.0000000000 + 1263 7.7483339502 0.9000000000 0.0000000000 + 1264 7.7483339502 0.7000000000 0.0000000000 + 1265 7.9215390309 0.8000000000 0.0000000000 + 1266 6.0162831426 1.9000000000 0.0000000000 + 1267 5.8430780618 2.0000000000 0.0000000000 + 1268 6.1894882233 1.8000000000 0.0000000000 + 1269 8.9607695155 2.0000000000 0.0000000000 + 1270 9.1339745962 1.9000000000 0.0000000000 + 1271 7.4019237886 2.9000000000 0.0000000000 + 1272 7.2287187079 3.0000000000 0.0000000000 + 1273 7.5751288694 2.8000000000 0.0000000000 + 1274 4.8038475773 3.6000000000 0.0000000000 + 1275 4.8038475773 3.8000000000 0.0000000000 + 1276 1.1665408814 7.1000000000 0.0000000000 + 1277 8.0947441117 2.9000000000 0.0000000000 + 1278 8.0947441117 2.7000000000 0.0000000000 + 1279 4.6306424965 2.3000000000 0.0000000000 + 1280 4.8038475773 2.2000000000 0.0000000000 + 1281 3.0717967697 8.6000000000 0.0000000000 + 1282 5.3234628196 0.9000000000 0.0000000000 + 1283 5.3234628196 0.7000000000 0.0000000000 + 1284 0.9933358006 8.6000000000 0.0000000000 + 1285 0.8201307199 8.5000000000 0.0000000000 + 1286 6.3626933041 3.7000000000 0.0000000000 + 1287 6.3626933041 3.5000000000 0.0000000000 + 1288 6.5358983849 3.4000000000 0.0000000000 + 1289 1.6861561237 7.0000000000 0.0000000000 + 1290 6.3626933041 5.1000000000 0.0000000000 + 1291 3.4182069312 2.2000000000 0.0000000000 + 1292 3.5914120120 2.1000000000 0.0000000000 + 1293 4.1110272543 5.0000000000 0.0000000000 + 1294 4.1110272543 5.2000000000 0.0000000000 + 1295 7.4019237886 7.1000000000 0.0000000000 + 1296 7.4019237886 6.9000000000 0.0000000000 + 1297 1.5129510429 8.1000000000 0.0000000000 + 1298 5.3234628196 6.7000000000 0.0000000000 + 1299 5.4966679003 6.6000000000 0.0000000000 + 1300 2.5521815275 3.1000000000 0.0000000000 + 1301 3.9378221735 9.1000000000 0.0000000000 + 1302 3.9378221735 8.9000000000 0.0000000000 + 1303 3.9378221735 9.3000000000 0.0000000000 + 1304 8.0947441117 8.9000000000 0.0000000000 + 1305 9.1339745962 3.3000000000 0.0000000000 + 1306 9.3071796770 3.2000000000 0.0000000000 + 1307 8.7875644347 4.1000000000 0.0000000000 + 1308 5.4966679003 7.2000000000 0.0000000000 + 1309 1.6861561237 1.0000000000 0.0000000000 + 1310 1.8593612044 0.9000000000 0.0000000000 + 1311 1.8593612044 0.7000000000 0.0000000000 + 1312 2.0325662852 0.8000000000 0.0000000000 + 1313 2.0325662852 1.0000000000 0.0000000000 + 1314 2.2057713659 0.9000000000 0.0000000000 + 1315 2.2057713659 0.7000000000 0.0000000000 + 1316 8.7875644347 4.7000000000 0.0000000000 + 1317 8.2679491924 7.8000000000 0.0000000000 + 1318 2.3789764467 5.0000000000 0.0000000000 + 1319 2.5521815275 5.1000000000 0.0000000000 + 1320 1.3397459622 5.6000000000 0.0000000000 + 1321 4.2842323350 7.1000000000 0.0000000000 + 1322 4.1110272543 7.0000000000 0.0000000000 + 1323 4.1110272543 6.8000000000 0.0000000000 + 1324 3.9378221735 6.9000000000 0.0000000000 + 1325 7.5751288694 5.0000000000 0.0000000000 + 1326 4.4574374158 7.6000000000 0.0000000000 + 1327 4.6306424965 7.7000000000 0.0000000000 + 1328 4.6306424965 7.9000000000 0.0000000000 + 1329 4.2842323350 3.3000000000 0.0000000000 + 1330 7.5751288694 5.2000000000 0.0000000000 + 1331 2.8985916890 4.1000000000 0.0000000000 + 1332 6.3626933041 5.3000000000 0.0000000000 + 1333 1.5129510429 4.9000000000 0.0000000000 + 1334 1.3397459622 5.0000000000 0.0000000000 + 1335 6.7091034656 5.3000000000 0.0000000000 + 1336 2.2057713659 1.1000000000 0.0000000000 + 1337 7.2287187079 5.6000000000 0.0000000000 + 1338 3.2450018505 3.5000000000 0.0000000000 + 1339 3.2450018505 3.7000000000 0.0000000000 + 1340 3.7646170928 3.4000000000 0.0000000000 + 1341 2.3789764467 4.4000000000 0.0000000000 + 1342 2.3789764467 4.2000000000 0.0000000000 + 1343 9.3071796770 2.2000000000 0.0000000000 + 1344 5.8430780618 9.0000000000 0.0000000000 + 1345 5.6698729811 9.1000000000 0.0000000000 + 1346 5.6698729811 9.3000000000 0.0000000000 + 1347 5.4966679003 9.2000000000 0.0000000000 + 1348 5.4966679003 9.4000000000 0.0000000000 + 1349 5.3234628196 9.3000000000 0.0000000000 + 1350 9.3071796770 2.6000000000 0.0000000000 + 1351 9.3071796770 7.0000000000 0.0000000000 + 1352 9.3071796770 7.2000000000 0.0000000000 + 1353 9.3071796770 8.2000000000 0.0000000000 + 1354 9.3071796770 8.4000000000 0.0000000000 + 1355 9.3071796770 9.0000000000 0.0000000000 + 1356 9.3071796770 5.6000000000 0.0000000000 + 1357 0.9966575376 0.6083294594 0.0000000000 + 1358 8.9607695155 9.4000000000 0.0000000000 + 1359 0.6469256391 7.8000000000 0.0000000000 + 1360 0.6469256391 8.0000000000 0.0000000000 + 1361 0.6469256391 8.6000000000 0.0000000000 + 1362 0.6467334765 0.8003328355 0.0000000000 + 1363 0.6468936120 1.0000554726 0.0000000000 + 1364 0.6469256391 2.8000000000 0.0000000000 + 1365 0.6469256391 2.6000000000 0.0000000000 + 1366 0.6469256391 1.6000000000 0.0000000000 + 1367 0.6469256391 1.8000000000 0.0000000000 + 1368 0.8201307199 1.9000000000 0.0000000000 + 1369 0.6469256391 2.0000000000 0.0000000000 + 1370 3.0717967697 0.6000000000 0.0000000000 + 1371 0.6455484733 0.6023853212 0.0000000000 + 1372 0.6469256391 9.4000000000 0.0000000000 + 1373 7.9215390309 0.6000000000 0.0000000000 + 1374 8.0947441117 0.7000000000 0.0000000000 + 1375 7.2287187079 0.6000000000 0.0000000000 + 1376 7.5751288694 9.4000000000 0.0000000000 + 1377 9.3092879032 0.5963484451 0.0000000000 + 1378 1.6861561237 9.4000000000 0.0000000000 + 1379 6.1894882233 9.4000000000 0.0000000000 + 1380 6.0162831426 9.5000000000 0.0000000000 + 1381 2.7253866082 0.6000000000 0.0000000000 + 1382 6.5358983849 0.6000000000 0.0000000000 + 1383 6.7091034656 0.5000000000 0.0000000000 + 1384 3.4182069312 9.4000000000 0.0000000000 + 1385 3.2450018505 9.5000000000 0.0000000000 + 1386 7.7483339502 1.1000000000 0.0000000000 + 1387 6.1894882233 2.0000000000 0.0000000000 + 1388 6.3626933041 1.9000000000 0.0000000000 + 1389 9.3071796770 5.4000000000 0.0000000000 + 1390 8.9607695155 1.8000000000 0.0000000000 + 1391 9.1339745962 1.7000000000 0.0000000000 + 1392 9.3071796770 1.8000000000 0.0000000000 + 1393 8.7875644347 1.9000000000 0.0000000000 + 1394 9.3071796770 1.6000000000 0.0000000000 + 1395 8.7875644347 5.7000000000 0.0000000000 + 1396 8.7875644347 5.5000000000 0.0000000000 + 1397 4.6306424965 3.3000000000 0.0000000000 + 1398 1.3404832722 0.6012770585 0.0000000000 + 1399 1.5130739279 0.5002128431 0.0000000000 + 1400 5.1502577388 0.8000000000 0.0000000000 + 1401 5.1502577388 0.6000000000 0.0000000000 + 1402 4.9770526581 0.7000000000 0.0000000000 + 1403 1.8593612044 9.3000000000 0.0000000000 + 1404 4.9770526581 3.7000000000 0.0000000000 + 1405 4.9770526581 3.9000000000 0.0000000000 + 1406 3.0717967697 9.4000000000 0.0000000000 + 1407 2.3789764467 1.0000000000 0.0000000000 + 1408 8.7875644347 7.5000000000 0.0000000000 + 1409 6.3626933041 3.3000000000 0.0000000000 + 1410 6.5358983849 3.2000000000 0.0000000000 + 1411 2.0325662852 6.8000000000 0.0000000000 + 1412 8.7875644347 6.1000000000 0.0000000000 + 1413 1.8593612044 7.1000000000 0.0000000000 + 1414 0.6469256391 8.4000000000 0.0000000000 + 1415 8.0947441117 3.1000000000 0.0000000000 + 1416 4.9770526581 2.3000000000 0.0000000000 + 1417 4.9770526581 2.1000000000 0.0000000000 + 1418 5.1502577388 2.2000000000 0.0000000000 + 1419 1.6861561237 2.4000000000 0.0000000000 + 1420 2.0325662852 6.6000000000 0.0000000000 + 1421 1.8593612044 8.3000000000 0.0000000000 + 1422 7.2287187079 2.8000000000 0.0000000000 + 1423 7.0555136271 2.9000000000 0.0000000000 + 1424 3.4182069312 2.0000000000 0.0000000000 + 1425 3.5914120120 1.9000000000 0.0000000000 + 1426 3.7646170928 2.0000000000 0.0000000000 + 1427 3.2450018505 2.1000000000 0.0000000000 + 1428 2.5521815275 5.3000000000 0.0000000000 + 1429 0.6469256391 7.6000000000 0.0000000000 + 1430 3.9378221735 5.1000000000 0.0000000000 + 1431 3.9378221735 4.9000000000 0.0000000000 + 1432 7.5751288694 8.6000000000 0.0000000000 + 1433 2.7253866082 2.4000000000 0.0000000000 + 1434 8.0947441117 7.3000000000 0.0000000000 + 1435 3.9378221735 3.3000000000 0.0000000000 + 1436 8.0947441117 3.5000000000 0.0000000000 + 1437 7.2287187079 9.2000000000 0.0000000000 + 1438 7.2287187079 9.4000000000 0.0000000000 + 1439 4.9770526581 6.7000000000 0.0000000000 + 1440 4.1110272543 1.8000000000 0.0000000000 + 1441 4.1110272543 2.0000000000 0.0000000000 + 1442 8.2679491924 7.6000000000 0.0000000000 + 1443 7.0555136271 3.1000000000 0.0000000000 + 1444 3.5914120120 6.1000000000 0.0000000000 + 1445 2.3789764467 8.2000000000 0.0000000000 + 1446 0.8201307199 8.1000000000 0.0000000000 + 1447 7.0555136271 7.3000000000 0.0000000000 + 1448 7.0555136271 9.3000000000 0.0000000000 + 1449 7.0555136271 9.5000000000 0.0000000000 + 1450 6.8823085464 9.4000000000 0.0000000000 + 1451 4.8038475773 2.0000000000 0.0000000000 + 1452 3.5914120120 5.3000000000 0.0000000000 + 1453 5.1502577388 7.6000000000 0.0000000000 + 1454 6.7091034656 3.3000000000 0.0000000000 + 1455 2.2057713659 7.5000000000 0.0000000000 + 1456 2.2057713659 4.9000000000 0.0000000000 + 1457 7.2287187079 4.0000000000 0.0000000000 + 1458 6.8823085464 3.0000000000 0.0000000000 + 1459 2.3789764467 3.6000000000 0.0000000000 + 1460 6.3626933041 4.9000000000 0.0000000000 + 1461 6.3626933041 3.9000000000 0.0000000000 + 1462 4.8038475773 4.0000000000 0.0000000000 + 1463 4.9770526581 4.1000000000 0.0000000000 + 1464 1.1665408814 7.5000000000 0.0000000000 + 1465 4.1110272543 8.2000000000 0.0000000000 + 1466 4.2842323350 8.3000000000 0.0000000000 + 1467 4.1110272543 8.4000000000 0.0000000000 + 1468 4.4574374158 8.2000000000 0.0000000000 + 1469 6.0162831426 0.9000000000 0.0000000000 + 1470 2.2057713659 2.9000000000 0.0000000000 + 1471 8.2679491924 2.6000000000 0.0000000000 + 1472 8.0947441117 2.5000000000 0.0000000000 + 1473 7.9215390309 2.6000000000 0.0000000000 + 1474 7.9215390309 2.4000000000 0.0000000000 + 1475 8.0947441117 2.3000000000 0.0000000000 + 1476 7.7483339502 2.5000000000 0.0000000000 + 1477 8.4411542732 3.9000000000 0.0000000000 + 1478 9.3071796770 8.8000000000 0.0000000000 + 1479 3.9378221735 6.7000000000 0.0000000000 + 1480 3.7646170928 6.8000000000 0.0000000000 + 1481 3.7646170928 7.0000000000 0.0000000000 + 1482 3.5914120120 6.9000000000 0.0000000000 + 1483 3.5914120120 6.7000000000 0.0000000000 + 1484 3.4182069312 6.8000000000 0.0000000000 + 1485 3.4182069312 7.0000000000 0.0000000000 + 1486 3.4182069312 6.6000000000 0.0000000000 + 1487 9.1339745962 8.5000000000 0.0000000000 + 1488 2.3789764467 3.4000000000 0.0000000000 + 1489 2.3789764467 9.0000000000 0.0000000000 + 1490 2.5521815275 9.1000000000 0.0000000000 + 1491 2.3789764467 9.2000000000 0.0000000000 + 1492 2.5521815275 9.3000000000 0.0000000000 + 1493 2.3789764467 9.4000000000 0.0000000000 + 1494 2.2057713659 6.1000000000 0.0000000000 + 1495 1.5129510429 4.5000000000 0.0000000000 + 1496 7.7483339502 8.7000000000 0.0000000000 + 1497 7.5751288694 6.8000000000 0.0000000000 + 1498 7.4019237886 6.7000000000 0.0000000000 + 1499 7.2287187079 6.8000000000 0.0000000000 + 1500 7.2287187079 6.6000000000 0.0000000000 + 1501 7.4019237886 6.5000000000 0.0000000000 + 1502 3.5914120120 0.9000000000 0.0000000000 + 1503 3.5929037033 0.7025836852 0.0000000000 + 1504 3.7648657080 0.8004306142 0.0000000000 + 1505 3.7663988352 0.6030860684 0.0000000000 + 1506 3.9381605664 0.7005861138 0.0000000000 + 1507 3.9381755294 0.5006120304 0.0000000000 + 1508 4.1111425457 0.6001996907 0.0000000000 + 1509 8.6143593539 7.6000000000 0.0000000000 + 1510 7.7483339502 8.3000000000 0.0000000000 + 1511 2.8985916890 5.7000000000 0.0000000000 + 1512 7.5751288694 4.8000000000 0.0000000000 + 1513 2.5521815275 4.1000000000 0.0000000000 + 1514 9.3071796770 2.8000000000 0.0000000000 + 1515 3.2450018505 6.9000000000 0.0000000000 + 1516 3.2450018505 7.1000000000 0.0000000000 + 1517 3.4182069312 7.2000000000 0.0000000000 + 1518 6.1894882233 5.0000000000 0.0000000000 + 1519 6.1894882233 4.8000000000 0.0000000000 + 1520 6.8823085464 7.8000000000 0.0000000000 + 1521 3.5914120120 6.5000000000 0.0000000000 + 1522 0.9933358006 3.4000000000 0.0000000000 + 1523 1.1665408814 3.3000000000 0.0000000000 + 1524 1.3397459622 5.2000000000 0.0000000000 + 1525 1.1665408814 5.1000000000 0.0000000000 + 1526 1.1665408814 4.9000000000 0.0000000000 + 1527 0.9933358006 5.0000000000 0.0000000000 + 1528 0.9933358006 4.8000000000 0.0000000000 + 1529 0.8201307199 4.9000000000 0.0000000000 + 1530 0.8201307199 5.1000000000 0.0000000000 + 1531 0.6469256391 5.0000000000 0.0000000000 + 1532 0.6469256391 5.2000000000 0.0000000000 + 1533 0.6469256391 4.8000000000 0.0000000000 + 1534 5.6698729811 1.9000000000 0.0000000000 + 1535 5.6698729811 2.1000000000 0.0000000000 + 1536 5.8430780618 2.2000000000 0.0000000000 + 1537 5.6698729811 2.3000000000 0.0000000000 + 1538 4.9770526581 3.5000000000 0.0000000000 + 1539 9.1339745962 7.3000000000 0.0000000000 + 1540 9.3071796770 7.4000000000 0.0000000000 + 1541 4.4574374158 7.2000000000 0.0000000000 + 1542 4.2842323350 7.3000000000 0.0000000000 + 1543 9.1339745962 2.9000000000 0.0000000000 + 1544 6.3626933041 0.7000000000 0.0000000000 + 1545 7.5751288694 5.8000000000 0.0000000000 + 1546 7.5751288694 6.0000000000 0.0000000000 + 1547 4.1111028683 0.8001309674 0.0000000000 + 1548 4.2842641526 0.7000551097 0.0000000000 + 1549 7.5751288694 1.2000000000 0.0000000000 + 1550 4.2842323350 2.1000000000 0.0000000000 + 1551 9.1339745962 7.5000000000 0.0000000000 + 1552 9.3071796770 7.6000000000 0.0000000000 + 1553 6.1894882233 3.8000000000 0.0000000000 + 1554 6.1894882233 4.0000000000 0.0000000000 + 1555 3.4180441186 0.6063105984 0.0000000000 + 1556 6.1894882233 3.4000000000 0.0000000000 + 1557 7.5751288694 5.6000000000 0.0000000000 + 1558 2.3789764467 1.2000000000 0.0000000000 + 1559 5.4966679003 2.0000000000 0.0000000000 + 1560 0.6469256391 1.4000000000 0.0000000000 + 1561 2.3789764467 3.8000000000 0.0000000000 + 1562 3.7646170928 3.2000000000 0.0000000000 + 1563 3.5914120120 3.3000000000 0.0000000000 + 1564 2.2057713659 1.3000000000 0.0000000000 + 1565 5.4966679003 9.0000000000 0.0000000000 + 1566 9.4803847577 3.5000000000 0.0000000000 + 1567 2.5521815275 1.1000000000 0.0000000000 + 1568 1.1665408814 3.5000000000 0.0000000000 + 1569 9.4803847577 2.7000000000 0.0000000000 + 1570 9.4803847577 2.9000000000 0.0000000000 + 1571 9.4803847577 3.7000000000 0.0000000000 + 1572 9.4803847577 4.9000000000 0.0000000000 + 1573 9.4803847577 4.7000000000 0.0000000000 + 1574 9.4803847577 2.5000000000 0.0000000000 + 1575 9.4803847577 5.1000000000 0.0000000000 + 1576 9.4803847577 7.1000000000 0.0000000000 + 1577 9.4803847577 7.5000000000 0.0000000000 + 1578 9.4803847577 5.5000000000 0.0000000000 + 1579 9.4803847577 8.3000000000 0.0000000000 + 1580 9.4803847577 5.7000000000 0.0000000000 + 1581 9.4803847577 7.7000000000 0.0000000000 + 1582 9.4803847577 8.5000000000 0.0000000000 + 1583 9.4803847577 6.9000000000 0.0000000000 + 1584 9.4803847577 8.1000000000 0.0000000000 + 1585 7.7521455239 0.4978325486 0.0000000000 + 1586 6.3653432170 0.5045897838 0.0000000000 + 1587 6.1899298755 0.6007649640 0.0000000000 + 1588 1.8593612044 9.5000000000 0.0000000000 + 1589 5.3267668924 9.4942771779 0.0000000000 + 1590 5.1508084176 9.3990461963 0.0000000000 + 1591 0.8178671999 9.4960794683 0.0000000000 + 1592 0.9929585473 9.3993465781 0.0000000000 + 1593 0.9951238352 9.6284003212 0.0000000000 + 1594 1.1665408814 9.5000000000 0.0000000000 + 1595 1.5163701974 9.4940778507 0.0000000000 + 1596 8.0947441117 0.5000000000 0.0000000000 + 1597 8.2679491924 0.6000000000 0.0000000000 + 1598 8.2679491924 0.8000000000 0.0000000000 + 1599 8.4411542732 0.7000000000 0.0000000000 + 1600 8.4384256801 0.5047260619 0.0000000000 + 1601 8.6139045884 0.6007876770 0.0000000000 + 1602 0.4775544099 6.9000000000 0.0000000000 + 1603 0.4737205584 5.9000000000 0.0000000000 + 1604 0.4775170450 0.9000647180 0.0000000000 + 1605 0.4754971746 8.4969228105 0.0000000000 + 1606 0.4754971746 9.0969228105 0.0000000000 + 1607 0.4737205584 7.9000000000 0.0000000000 + 1608 0.4754971746 4.2969228105 0.0000000000 + 1609 0.4775544099 3.3000000000 0.0000000000 + 1610 0.4754971746 4.8969228105 0.0000000000 + 1611 0.4737205584 1.5000000000 0.0000000000 + 1612 0.4737205584 2.7000000000 0.0000000000 + 1613 0.4737205584 1.9000000000 0.0000000000 + 1614 0.4778505126 8.8994871351 0.0000000000 + 1615 0.4778505126 8.2994871351 0.0000000000 + 1616 0.4778505126 4.0994871351 0.0000000000 + 1617 0.4778505126 4.6994871351 0.0000000000 + 1618 0.4761361498 3.1030771895 0.0000000000 + 1619 0.4761245845 1.0969428422 0.0000000000 + 1620 5.3234628196 0.5000000000 0.0000000000 + 1621 9.1339745962 9.5003482892 0.0000000000 + 1622 9.3071796770 9.4000580482 0.0000000000 + 1623 2.5550392729 9.4950502397 0.0000000000 + 1624 8.9619990275 9.5979690995 0.0000000000 + 1625 8.7898419476 9.4960716781 0.0000000000 + 1626 0.4758804355 3.5000000000 0.0000000000 + 1627 0.4737205584 2.1000000000 0.0000000000 + 1628 0.6469256391 2.2000000000 0.0000000000 + 1629 0.4737205584 2.3000000000 0.0000000000 + 1630 0.4758804355 6.7000000000 0.0000000000 + 1631 0.6472856186 6.6000000000 0.0000000000 + 1632 0.4758210087 6.5000000000 0.0000000000 + 1633 0.4737205584 5.7000000000 0.0000000000 + 1634 0.6469256391 5.6000000000 0.0000000000 + 1635 0.4737205584 5.5000000000 0.0000000000 + 1636 6.3626933041 2.1000000000 0.0000000000 + 1637 5.1502577388 2.0000000000 0.0000000000 + 1638 9.1339745962 5.3000000000 0.0000000000 + 1639 8.6143593539 5.6000000000 0.0000000000 + 1640 4.1110272543 2.2000000000 0.0000000000 + 1641 7.9215390309 2.2000000000 0.0000000000 + 1642 0.9933358006 7.4000000000 0.0000000000 + 1643 7.7483339502 2.9000000000 0.0000000000 + 1644 6.8823085464 0.6000000000 0.0000000000 + 1645 3.7646170928 1.8000000000 0.0000000000 + 1646 2.0325662852 9.4000000000 0.0000000000 + 1647 0.6472856186 3.6000000000 0.0000000000 + 1648 0.4758210087 3.7000000000 0.0000000000 + 1649 0.8201307199 6.3000000000 0.0000000000 + 1650 5.1502577388 1.0000000000 0.0000000000 + 1651 7.7483339502 9.3000000000 0.0000000000 + 1652 7.7512620515 9.4949283796 0.0000000000 + 1653 6.3626933041 1.7000000000 0.0000000000 + 1654 6.5358983849 1.8000000000 0.0000000000 + 1655 3.9378221735 3.1000000000 0.0000000000 + 1656 3.4182069312 1.8000000000 0.0000000000 + 1657 7.9215390309 9.0000000000 0.0000000000 + 1658 0.9933358006 8.4000000000 0.0000000000 + 1659 1.1665408814 8.5000000000 0.0000000000 + 1660 2.2057713659 6.7000000000 0.0000000000 + 1661 3.0717967697 3.8000000000 0.0000000000 + 1662 3.2450018505 3.9000000000 0.0000000000 + 1663 3.4182069312 3.8000000000 0.0000000000 + 1664 1.6861561237 7.2000000000 0.0000000000 + 1665 7.7483339502 5.3000000000 0.0000000000 + 1666 3.5914120120 7.5000000000 0.0000000000 + 1667 4.4574374158 8.4000000000 0.0000000000 + 1668 3.7646170928 9.2000000000 0.0000000000 + 1669 3.7646170928 9.4000000000 0.0000000000 + 1670 3.9445382726 9.4871437691 0.0000000000 + 1671 5.3234628196 6.5000000000 0.0000000000 + 1672 2.8985916890 1.1000000000 0.0000000000 + 1673 3.9378221735 5.3000000000 0.0000000000 + 1674 4.1110272543 5.4000000000 0.0000000000 + 1675 7.7483339502 5.9000000000 0.0000000000 + 1676 5.3234628196 7.5000000000 0.0000000000 + 1677 3.2450018505 3.3000000000 0.0000000000 + 1678 1.5129510429 7.1000000000 0.0000000000 + 1679 8.7875644347 6.5000000000 0.0000000000 + 1680 3.7646170928 4.6000000000 0.0000000000 + 1681 5.4966679003 7.6000000000 0.0000000000 + 1682 5.4966679003 6.4000000000 0.0000000000 + 1683 5.6698729811 6.5000000000 0.0000000000 + 1684 4.1110272543 6.6000000000 0.0000000000 + 1685 2.2057713659 3.5000000000 0.0000000000 + 1686 4.6306424965 1.7000000000 0.0000000000 + 1687 3.5914120120 8.9000000000 0.0000000000 + 1688 3.5914120120 8.7000000000 0.0000000000 + 1689 3.4182069312 8.6000000000 0.0000000000 + 1690 3.5914120120 8.5000000000 0.0000000000 + 1691 3.7646170928 8.6000000000 0.0000000000 + 1692 7.4019237886 4.9000000000 0.0000000000 + 1693 7.4019237886 4.7000000000 0.0000000000 + 1694 4.8038475773 4.2000000000 0.0000000000 + 1695 4.9770526581 4.3000000000 0.0000000000 + 1696 2.5521815275 4.7000000000 0.0000000000 + 1697 2.7253866082 4.8000000000 0.0000000000 + 1698 2.7253866082 5.2000000000 0.0000000000 + 1699 2.7253866082 5.4000000000 0.0000000000 + 1700 3.9378221735 7.3000000000 0.0000000000 + 1701 3.4182069312 6.4000000000 0.0000000000 + 1702 3.2450018505 6.5000000000 0.0000000000 + 1703 4.6306424965 7.5000000000 0.0000000000 + 1704 4.8038475773 7.6000000000 0.0000000000 + 1705 0.8201307199 4.5000000000 0.0000000000 + 1706 2.7253866082 3.8000000000 0.0000000000 + 1707 2.7258628991 9.3991750399 0.0000000000 + 1708 4.9770526581 7.9000000000 0.0000000000 + 1709 4.9770526581 8.1000000000 0.0000000000 + 1710 1.1665408814 5.3000000000 0.0000000000 + 1711 2.5521815275 0.7000000000 0.0000000000 + 1712 2.5550392729 0.5049497603 0.0000000000 + 1713 2.0325662852 4.2000000000 0.0000000000 + 1714 2.0325662852 4.4000000000 0.0000000000 + 1715 1.8593612044 4.5000000000 0.0000000000 + 1716 2.0325662852 4.6000000000 0.0000000000 + 1717 0.8201307199 5.3000000000 0.0000000000 + 1718 5.6698729811 8.7000000000 0.0000000000 + 1719 5.8430780618 8.6000000000 0.0000000000 + 1720 5.8430780618 8.4000000000 0.0000000000 + 1721 6.0162831426 8.5000000000 0.0000000000 + 1722 9.4803847577 1.7000000000 0.0000000000 + 1723 9.4803847577 1.5000000000 0.0000000000 + 1724 9.4803847577 1.9000000000 0.0000000000 + 1725 5.1503495186 9.1998410327 0.0000000000 + 1726 4.9771597345 9.2998145382 0.0000000000 + 1727 4.9794929932 9.4957732155 0.0000000000 + 1728 4.8042721459 9.3992646256 0.0000000000 + 1729 4.8007777928 9.6288095985 0.0000000000 + 1730 4.6307705492 9.4910580673 0.0000000000 + 1731 9.6535898385 3.6000000000 0.0000000000 + 1732 9.6535898385 4.8000000000 0.0000000000 + 1733 9.4803847577 8.9000000000 0.0000000000 + 1734 9.4803847577 9.1000000000 0.0000000000 + 1735 7.4019237886 0.5000000000 0.0000000000 + 1736 5.1525884481 0.4040369069 0.0000000000 + 1737 4.2808658381 0.5059158772 0.0000000000 + 1738 4.4568816359 0.6009951645 0.0000000000 + 1739 5.6666557654 9.4944276190 0.0000000000 + 1740 4.4390338346 0.3699877844 0.0000000000 + 1741 4.6274826030 0.4951638248 0.0000000000 + 1742 4.6300232176 0.6993598315 0.0000000000 + 1743 6.8793132436 0.4051880165 0.0000000000 + 1744 4.6409776185 0.3054346676 0.0000000000 + 1745 0.3167981340 8.9932472785 0.0000000000 + 1746 0.3167981340 8.3932472785 0.0000000000 + 1747 0.3167981340 4.1932472785 0.0000000000 + 1748 0.3167981340 4.7932472785 0.0000000000 + 1749 0.3168552794 3.2066672440 0.0000000000 + 1750 0.3168471244 0.9933468810 0.0000000000 + 1751 3.7849528894 9.6266239841 0.0000000000 + 1752 6.8887114457 9.5984827557 0.0000000000 + 1753 6.7136249392 9.4937640618 0.0000000000 + 1754 2.7210558767 9.5924688279 0.0000000000 + 1755 3.0724068917 9.5987143852 0.0000000000 + 1756 3.2526705266 9.6882773885 0.0000000000 + 1757 7.0736866381 9.6997470649 0.0000000000 + 1758 7.5834841675 9.6272160250 0.0000000000 + 1759 2.3857855943 9.6273488222 0.0000000000 + 1760 4.8040644843 0.4137701557 0.0000000000 + 1761 7.2188275398 0.3728138282 0.0000000000 + 1762 6.1979521340 9.6337464444 0.0000000000 + 1763 6.3626933041 9.5000000000 0.0000000000 + 1764 6.0143174480 9.6869608098 0.0000000000 + 1765 6.7040466694 0.3048769414 0.0000000000 + 1766 6.1945645096 0.3720050329 0.0000000000 + 1767 6.0162831426 0.5000000000 0.0000000000 + 1768 8.6092396311 0.3716884719 0.0000000000 + 1769 8.7875644347 0.5000000000 0.0000000000 + 1770 0.6469256391 9.6000000000 0.0000000000 + 1771 0.4775544099 9.5000000000 0.0000000000 + 1772 2.0363683929 9.5986374484 0.0000000000 + 1773 3.7554192997 0.4071702188 0.0000000000 + 1774 3.9214411049 0.3010772592 0.0000000000 + 1775 3.5657387826 0.3292137128 0.0000000000 + 1776 2.7267111217 0.4042566319 0.0000000000 + 1777 1.3335512292 0.4018089433 0.0000000000 + 1778 1.5055839715 0.3034724820 0.0000000000 + 1779 1.1558827676 0.3237580528 0.0000000000 + 1780 1.6808964916 0.4049767911 0.0000000000 + 1781 9.3064197820 9.6051013759 0.0000000000 + 1782 9.4802581086 9.5008599040 0.0000000000 + 1783 9.4874204854 9.7021702042 0.0000000000 + 1784 9.6603592633 9.6020138396 0.0000000000 + 1785 6.8898566526 0.1941028632 0.0000000000 + 1786 1.6887897230 0.1916346654 0.0000000000 + 1787 5.3209445976 0.3027403591 0.0000000000 + 1788 5.4981511882 0.3933465568 0.0000000000 + 1789 5.6869642509 0.2914779051 0.0000000000 + 1790 0.4772425373 9.7001298190 0.0000000000 + 1791 0.3087406797 9.6018314548 0.0000000000 + 1792 5.6768353850 0.4908576763 0.0000000000 + 1793 9.1274774526 9.6991326956 0.0000000000 + 1794 5.1317873717 0.1923961444 0.0000000000 + 1795 8.9283104054 9.8121435543 0.0000000000 + 1796 5.8516891647 0.3912384115 0.0000000000 + 1797 1.8748597818 9.6967236433 0.0000000000 + 1798 7.7483339503 1.2999999998 0.0000000000 + 1799 7.9215390309 1.2000000000 0.0000000000 + 1800 7.5751288696 1.3999999997 0.0000000000 + 1801 7.5751288698 1.5999999993 0.0000000000 + 1802 7.4019237887 1.4999999998 0.0000000000 + 1803 8.6142837061 0.8001310259 0.0000000000 + 1804 6.1894882233 2.2000000000 0.0000000000 + 1805 5.8430780618 2.4000000000 0.0000000000 + 1806 5.6698729811 2.5000000000 0.0000000000 + 1807 5.4966679003 2.4000000000 0.0000000000 + 1808 5.4966679003 2.6000000000 0.0000000000 + 1809 7.9215390344 1.3999999939 0.0000000000 + 1810 9.1339748725 1.4999995215 0.0000000000 + 1811 6.3626933041 2.3000000000 0.0000000000 + 1812 8.7875644525 1.6999999692 0.0000000000 + 1813 8.6143593747 1.7999999641 0.0000000000 + 1814 8.6143593574 1.9999999940 0.0000000000 + 1815 8.4411542772 1.8999999930 0.0000000000 + 1816 8.4411542744 2.0999999978 0.0000000000 + 1817 9.4803847577 5.3000000000 0.0000000000 + 1818 9.6535898385 5.4000000000 0.0000000000 + 1819 5.3234628196 2.1000000000 0.0000000000 + 1820 7.9239235240 0.4027670757 0.0000000000 + 1821 8.0971039020 0.3029202628 0.0000000000 + 1822 8.2679491924 0.4000000000 0.0000000000 + 1823 3.7646170928 8.4000000000 0.0000000000 + 1824 0.4737205584 2.5000000000 0.0000000000 + 1825 6.3626933041 3.1000000000 0.0000000000 + 1826 5.3234628196 2.5000000000 0.0000000000 + 1827 8.6143593539 5.4000000000 0.0000000000 + 1828 8.7875644347 5.3000000000 0.0000000000 + 1829 8.6143593539 5.2000000000 0.0000000000 + 1830 8.4411542732 5.1000000000 0.0000000000 + 1831 8.4411542732 4.9000000000 0.0000000000 + 1832 8.6143593539 5.0000000000 0.0000000000 + 1833 4.2842323350 2.3000000000 0.0000000000 + 1834 0.4803154545 4.4963244681 0.0000000000 + 1835 6.5358983849 3.0000000000 0.0000000000 + 1836 6.5358983849 2.8000000000 0.0000000000 + 1837 3.5914120120 8.3000000000 0.0000000000 + 1838 7.9220270478 9.3991547299 0.0000000000 + 1839 7.9179609991 9.5923707321 0.0000000000 + 1840 8.0907434615 9.4925502580 0.0000000000 + 1841 8.2672824174 9.3987583763 0.0000000000 + 1842 8.4410431440 9.4997930627 0.0000000000 + 1843 8.2682047632 9.5974097307 0.0000000000 + 1844 8.4502241453 9.6882087550 0.0000000000 + 1845 6.8823085464 2.8000000000 0.0000000000 + 1846 0.6469256391 2.4000000000 0.0000000000 + 1847 0.8201307199 2.3000000000 0.0000000000 + 1848 7.9216203671 9.1998591217 0.0000000000 + 1849 8.6143593539 5.8000000000 0.0000000000 + 1850 6.0162831426 4.9000000000 0.0000000000 + 1851 5.1502577388 3.8000000000 0.0000000000 + 1852 0.6473357108 3.8000000000 0.0000000000 + 1853 3.5962326428 9.5008681192 0.0000000000 + 1854 5.1502577388 4.2000000000 0.0000000000 + 1855 5.1502577388 4.4000000000 0.0000000000 + 1856 4.9770526581 4.5000000000 0.0000000000 + 1857 3.4182069312 8.4000000000 0.0000000000 + 1858 3.2450018505 8.3000000000 0.0000000000 + 1859 8.0947441120 2.0999999995 0.0000000000 + 1860 0.4760022000 3.8999777495 0.0000000000 + 1861 0.8201307199 7.3000000000 0.0000000000 + 1862 0.4797022191 0.6973866229 0.0000000000 + 1863 0.4762645904 0.4968848012 0.0000000000 + 1864 0.6552086445 0.4041582236 0.0000000000 + 1865 0.4820609524 0.2995666719 0.0000000000 + 1866 0.8435829889 0.3262813507 0.0000000000 + 1867 0.3095119237 0.3926329892 0.0000000000 + 1868 2.2057713659 9.5000000000 0.0000000000 + 1869 0.4758932818 8.0999777495 0.0000000000 + 1870 2.0325662852 9.2000000000 0.0000000000 + 1871 1.1665408814 8.3000000000 0.0000000000 + 1872 1.3397459622 8.4000000000 0.0000000000 + 1873 0.8201641283 3.7000000000 0.0000000000 + 1874 6.5358983849 0.4000000000 0.0000000000 + 1875 7.0555136271 0.5000000000 0.0000000000 + 1876 7.7483339502 2.7000000000 0.0000000000 + 1877 7.5751288694 2.6000000000 0.0000000000 + 1878 7.4019237886 2.7000000000 0.0000000000 + 1879 7.2287187079 2.6000000000 0.0000000000 + 1880 8.7874785898 0.7001486878 0.0000000000 + 1881 8.9607577653 0.6000203519 0.0000000000 + 1882 8.9628401513 0.4035932305 0.0000000000 + 1883 9.1346691149 0.4999936712 0.0000000000 + 1884 9.1303033233 0.3031738716 0.0000000000 + 1885 8.9383042454 0.1938191557 0.0000000000 + 1886 9.3076967595 0.3899843400 0.0000000000 + 1887 9.4845952242 0.2852012853 0.0000000000 + 1888 9.4857627862 0.4858046170 0.0000000000 + 1889 5.1502577388 4.6000000000 0.0000000000 + 1890 4.9770526581 4.7000000000 0.0000000000 + 1891 5.1502577388 4.8000000000 0.0000000000 + 1892 4.9770526581 4.9000000000 0.0000000000 + 1893 3.9378221735 8.5000000000 0.0000000000 + 1894 1.6852999992 0.6008649390 0.0000000000 + 1895 1.8566281571 0.4990640754 0.0000000000 + 1896 1.5129510429 7.3000000000 0.0000000000 + 1897 5.1502577388 5.0000000000 0.0000000000 + 1898 4.9770526581 5.1000000000 0.0000000000 + 1899 5.1502577388 5.2000000000 0.0000000000 + 1900 4.9770526581 5.3000000000 0.0000000000 + 1901 5.1502577388 5.4000000000 0.0000000000 + 1902 4.8038475773 5.2000000000 0.0000000000 + 1903 4.8038475773 5.4000000000 0.0000000000 + 1904 1.8593612044 1.1000000000 0.0000000000 + 1905 1.6861561237 1.2000000000 0.0000000000 + 1906 3.7646170928 1.6000000000 0.0000000000 + 1907 0.6473357108 6.4000000000 0.0000000000 + 1908 0.4758206037 6.3000000000 0.0000000000 + 1909 7.9215390309 2.8000000000 0.0000000000 + 1910 3.9378221735 2.1000000000 0.0000000000 + 1911 9.1339745962 5.1000000000 0.0000000000 + 1912 8.7875644353 2.0999999990 0.0000000000 + 1913 8.4411542732 5.7000000000 0.0000000000 + 1914 8.6143593539 6.0000000000 0.0000000000 + 1915 8.4411542732 6.1000000000 0.0000000000 + 1916 0.4803154545 8.6963244681 0.0000000000 + 1917 8.4411542732 7.7000000000 0.0000000000 + 1918 8.4411542732 7.9000000000 0.0000000000 + 1919 0.4737205584 7.7000000000 0.0000000000 + 1920 0.4737205584 7.5000000000 0.0000000000 + 1921 8.7875644347 7.7000000000 0.0000000000 + 1922 1.8593612044 7.3000000000 0.0000000000 + 1923 2.0325662852 7.2000000000 0.0000000000 + 1924 1.1665408814 7.3000000000 0.0000000000 + 1925 3.9378221735 2.3000000000 0.0000000000 + 1926 3.7646170928 2.2000000000 0.0000000000 + 1927 7.7483339502 6.1000000000 0.0000000000 + 1928 7.5751288694 6.2000000000 0.0000000000 + 1929 6.5358983849 1.6000000000 0.0000000000 + 1930 6.7091034656 1.7000000000 0.0000000000 + 1931 6.7091034656 1.9000000000 0.0000000000 + 1932 6.8823085464 1.8000000000 0.0000000000 + 1933 6.8823085464 1.6000000000 0.0000000000 + 1934 6.8823085464 2.0000000000 0.0000000000 + 1935 7.0555136271 1.7000000000 0.0000000000 + 1936 7.0555136271 1.5000000000 0.0000000000 + 1937 6.8823085464 1.4000000000 0.0000000000 + 1938 1.3397459622 4.8000000000 0.0000000000 + 1939 2.2057713659 6.9000000000 0.0000000000 + 1940 1.1665408814 3.1000000000 0.0000000000 + 1941 1.3397459622 3.2000000000 0.0000000000 + 1942 8.7875644347 4.5000000000 0.0000000000 + 1943 8.6143593539 4.6000000000 0.0000000000 + 1944 8.6143593539 4.4000000000 0.0000000000 + 1945 8.9607695155 8.8000000000 0.0000000000 + 1946 9.1339745962 7.7000000000 0.0000000000 + 1947 8.9607695155 3.4000000000 0.0000000000 + 1948 8.9607695155 3.2000000000 0.0000000000 + 1949 3.2450018505 7.3000000000 0.0000000000 + 1950 4.4576231227 9.1996783462 0.0000000000 + 1951 5.3234628196 6.3000000000 0.0000000000 + 1952 7.0555136271 6.7000000000 0.0000000000 + 1953 7.0555136271 6.5000000000 0.0000000000 + 1954 2.2057713659 9.3000000000 0.0000000000 + 1955 7.7483339502 2.3000000000 0.0000000000 + 1956 7.7483339503 2.0999999998 0.0000000000 + 1957 6.7091034656 1.5000000000 0.0000000000 + 1958 7.9215390309 3.0000000000 0.0000000000 + 1959 7.9215390309 3.2000000000 0.0000000000 + 1960 8.0947441117 3.3000000000 0.0000000000 + 1961 8.0947441117 8.5000000000 0.0000000000 + 1962 7.9215390309 8.6000000000 0.0000000000 + 1963 4.6305392834 0.8998933053 0.0000000000 + 1964 3.2450018505 8.5000000000 0.0000000000 + 1965 0.8201307199 2.5000000000 0.0000000000 + 1966 0.9933358006 2.2000000000 0.0000000000 + 1967 0.6469256391 7.4000000000 0.0000000000 + 1968 9.3071796770 2.4000000000 0.0000000000 + 1969 9.4803847577 2.3000000000 0.0000000000 + 1970 9.4803847577 2.1000000000 0.0000000000 + 1971 7.4019237886 8.3000000000 0.0000000000 + 1972 8.4411418116 0.9000215841 0.0000000000 + 1973 8.2679471245 1.0000035818 0.0000000000 + 1974 8.0947437670 0.9000005970 0.0000000000 + 1975 0.9933358006 6.4000000000 0.0000000000 + 1976 6.3626933041 1.5000000000 0.0000000000 + 1977 3.5914120120 7.3000000000 0.0000000000 + 1978 5.6698729811 6.3000000000 0.0000000000 + 1979 6.7091034656 9.1000000000 0.0000000000 + 1980 6.7098570445 9.2989606770 0.0000000000 + 1981 3.5914120120 7.7000000000 0.0000000000 + 1982 2.3794527376 0.6008249601 0.0000000000 + 1983 2.3870844824 0.3718909759 0.0000000000 + 1984 2.2057713659 0.5000000000 0.0000000000 + 1985 5.3234781162 9.0999735055 0.0000000000 + 1986 5.3234653690 8.8999955842 0.0000000000 + 1987 3.0717967697 7.0000000000 0.0000000000 + 1988 4.6306424965 1.9000000000 0.0000000000 + 1989 0.6479760854 8.1999108141 0.0000000000 + 1990 0.6480625837 3.9999108141 0.0000000000 + 1991 9.4804550081 1.0998783228 0.0000000000 + 1992 9.4804002409 1.2999731824 0.0000000000 + 1993 1.5129510429 3.7000000000 0.0000000000 + 1994 1.3397459622 3.6000000000 0.0000000000 + 1995 1.3397459622 3.8000000000 0.0000000000 + 1996 8.7875438356 0.9000356787 0.0000000000 + 1997 7.0555136271 6.9000000000 0.0000000000 + 1998 3.7646170928 5.2000000000 0.0000000000 + 1999 7.7483475062 9.0999765203 0.0000000000 + 2000 0.4796178343 5.0964099456 0.0000000000 + 2001 7.4019237886 2.5000000000 0.0000000000 + 2002 6.0162831426 2.3000000000 0.0000000000 + 2003 5.1502577388 6.6000000000 0.0000000000 + 2004 7.7483339502 4.3000000000 0.0000000000 + 2005 7.5751288694 4.4000000000 0.0000000000 + 2006 6.0162831426 8.9000000000 0.0000000000 + 2007 7.7483339502 8.5000000000 0.0000000000 + 2008 7.7483339502 3.5000000000 0.0000000000 + 2009 3.2450018505 1.7000000000 0.0000000000 + 2010 8.0947441117 7.5000000000 0.0000000000 + 2011 8.2679491924 7.4000000000 0.0000000000 + 2012 7.9215390309 7.6000000000 0.0000000000 + 2013 0.8201307199 5.7000000000 0.0000000000 + 2014 0.8203057943 8.2999851357 0.0000000000 + 2015 6.1894882233 8.0000000000 0.0000000000 + 2016 6.3626933041 8.1000000000 0.0000000000 + 2017 6.5358983849 8.0000000000 0.0000000000 + 2018 6.5358983849 8.2000000000 0.0000000000 + 2019 6.3626933041 8.3000000000 0.0000000000 + 2020 6.1894882233 8.2000000000 0.0000000000 + 2021 2.0325662852 4.0000000000 0.0000000000 + 2022 1.1665408814 6.3000000000 0.0000000000 + 2023 7.2287187079 4.8000000000 0.0000000000 + 2024 7.2287187079 4.6000000000 0.0000000000 + 2025 2.5521815275 5.5000000000 0.0000000000 + 2026 9.3071796770 6.8000000000 0.0000000000 + 2027 9.4803847577 6.7000000000 0.0000000000 + 2028 9.4803847577 6.5000000000 0.0000000000 + 2029 9.6535898385 6.6000000000 0.0000000000 + 2030 9.3071796770 6.4000000000 0.0000000000 + 2031 9.4803847577 6.3000000000 0.0000000000 + 2032 3.9378221735 5.5000000000 0.0000000000 + 2033 8.7875644347 4.3000000000 0.0000000000 + 2034 8.6143593539 4.2000000000 0.0000000000 + 2035 2.5521815275 0.9000000000 0.0000000000 + 2036 8.7875644347 5.9000000000 0.0000000000 + 2037 0.8201307199 4.7000000000 0.0000000000 + 2038 9.3071796770 7.8000000000 0.0000000000 + 2039 9.4803847577 7.9000000000 0.0000000000 + 2040 7.0555136271 9.1000000000 0.0000000000 + 2041 7.2287187079 7.4000000000 0.0000000000 + 2042 7.2287187079 7.2000000000 0.0000000000 + 2043 5.3234628196 1.1000000000 0.0000000000 + 2044 8.7875644347 8.5000000000 0.0000000000 + 2045 2.0325662852 2.2000000000 0.0000000000 + 2046 1.8593612044 2.1000000000 0.0000000000 + 2047 1.6861561237 2.2000000000 0.0000000000 + 2048 1.5129510429 2.1000000000 0.0000000000 + 2049 2.5521815275 8.5000000000 0.0000000000 + 2050 2.7253866082 8.4000000000 0.0000000000 + 2051 7.9215390309 3.6000000000 0.0000000000 + 2052 5.8272763074 9.6291098426 0.0000000000 + 2053 8.2679491924 7.2000000000 0.0000000000 + 2054 1.6861561237 8.0000000000 0.0000000000 + 2055 2.2057713659 6.5000000000 0.0000000000 + 2056 2.0325662852 6.4000000000 0.0000000000 + 2057 8.6147204179 9.3993107901 0.0000000000 + 2058 4.2842323350 2.9000000000 0.0000000000 + 2059 4.4574374158 3.0000000000 0.0000000000 + 2060 4.1110272543 3.0000000000 0.0000000000 + 2061 8.6143593539 3.8000000000 0.0000000000 + 2062 8.7875644347 6.3000000000 0.0000000000 + 2063 8.6143593539 6.4000000000 0.0000000000 + 2064 8.6143593539 6.6000000000 0.0000000000 + 2065 0.4737205584 1.7000000000 0.0000000000 + 2066 0.8201307199 2.1000000000 0.0000000000 + 2067 0.9933358006 2.0000000000 0.0000000000 + 2068 1.1665408814 2.1000000000 0.0000000000 + 2069 0.9933358006 1.8000000000 0.0000000000 + 2070 1.0940039805 9.8249424488 0.0000000000 + 2071 9.8267949192 7.9000000000 0.0000000000 + 2072 9.8267949192 9.1000000000 0.0000000000 + 2073 7.9059523920 9.8014677290 0.0000000000 + 2074 2.3789764467 6.8000000000 0.0000000000 + 2075 1.6861561237 8.2000000000 0.0000000000 + 2076 1.5129510429 8.3000000000 0.0000000000 + 2077 1.6861561237 8.4000000000 0.0000000000 + 2078 1.8593612044 8.5000000000 0.0000000000 + 2079 2.3789764467 6.2000000000 0.0000000000 + 2080 6.1894882233 3.0000000000 0.0000000000 + 2081 6.1894882233 3.2000000000 0.0000000000 + 2082 6.0162831426 3.3000000000 0.0000000000 + 2083 3.2450018505 2.3000000000 0.0000000000 + 2084 3.0717967697 2.2000000000 0.0000000000 + 2085 3.0717967697 2.0000000000 0.0000000000 + 2086 3.5914120120 9.1000000000 0.0000000000 + 2087 2.3789764467 8.0000000000 0.0000000000 + 2088 4.1110272543 1.6000000000 0.0000000000 + 2089 7.9215390309 6.4000000000 0.0000000000 + 2090 7.7483339502 6.5000000000 0.0000000000 + 2091 7.7483339502 6.3000000000 0.0000000000 + 2092 8.6143593539 6.8000000000 0.0000000000 + 2093 0.1732050808 7.9000000000 0.0000000000 + 2094 5.2806267952 9.8190032310 0.0000000000 + 2095 4.9770526581 2.5000000000 0.0000000000 + 2096 7.4019237886 7.5000000000 0.0000000000 + 2097 8.4411542732 6.7000000000 0.0000000000 + 2098 2.2057713659 9.1000000000 0.0000000000 + 2099 8.7875651543 1.4999987536 0.0000000000 + 2100 2.7253866082 7.8000000000 0.0000000000 + 2101 2.7253866082 8.0000000000 0.0000000000 + 2102 2.5521815275 8.1000000000 0.0000000000 + 2103 2.7253866082 8.2000000000 0.0000000000 + 2104 7.5751288694 8.0000000000 0.0000000000 + 2105 2.8985916890 8.5000000000 0.0000000000 + 2106 7.9215390309 5.4000000000 0.0000000000 + 2107 7.2287187079 3.2000000000 0.0000000000 + 2108 6.8823085464 0.8000000000 0.0000000000 + 2109 4.4574374158 2.0000000000 0.0000000000 + 2110 0.4761361498 7.0969228105 0.0000000000 + 2111 0.3168552794 6.9933327560 0.0000000000 + 2112 0.4797243301 7.2964099456 0.0000000000 + 2113 0.4802661041 9.2964099456 0.0000000000 + 2114 3.0717967697 8.4000000000 0.0000000000 + 2115 3.0717967697 8.2000000000 0.0000000000 + 2116 2.8985916890 8.3000000000 0.0000000000 + 2117 9.4803847577 7.3000000000 0.0000000000 + 2118 3.4182069312 7.4000000000 0.0000000000 + 2119 3.0717967697 7.4000000000 0.0000000000 + 2120 1.1665408814 6.1000000000 0.0000000000 + 2121 9.3071796770 4.0000000000 0.0000000000 + 2122 9.4803847577 4.1000000000 0.0000000000 + 2123 9.4803847577 4.3000000000 0.0000000000 + 2124 9.6535898385 4.2000000000 0.0000000000 + 2125 9.3071796770 4.4000000000 0.0000000000 + 2126 9.3071796770 4.6000000000 0.0000000000 + 2127 0.1684806235 5.2998130959 0.0000000000 + 2128 7.5000000000 9.8267949192 0.0000000000 + 2129 5.6698729811 2.7000000000 0.0000000000 + 2130 5.3234628196 5.3000000000 0.0000000000 + 2131 4.8038475773 6.6000000000 0.0000000000 + 2132 6.8823085464 6.4000000000 0.0000000000 + 2133 2.8985916890 6.3000000000 0.0000000000 + 2134 3.0717967697 6.2000000000 0.0000000000 + 2135 3.5914120120 4.7000000000 0.0000000000 + 2136 3.7646170928 4.8000000000 0.0000000000 + 2137 1.6861561237 6.2000000000 0.0000000000 + 2138 4.9770526581 8.3000000000 0.0000000000 + 2139 4.8038475773 8.2000000000 0.0000000000 + 2140 3.0717967697 9.2000000000 0.0000000000 + 2141 7.4019237886 6.1000000000 0.0000000000 + 2142 7.4019237886 6.3000000000 0.0000000000 + 2143 6.7091034656 8.5000000000 0.0000000000 + 2144 6.3626933041 8.7000000000 0.0000000000 + 2145 5.1502577388 4.0000000000 0.0000000000 + 2146 4.9770526581 6.5000000000 0.0000000000 + 2147 9.8267949192 2.3000000000 0.0000000000 + 2148 6.3626933041 7.3000000000 0.0000000000 + 2149 6.1894882233 7.2000000000 0.0000000000 + 2150 6.0162831426 7.3000000000 0.0000000000 + 2151 6.0162831426 7.1000000000 0.0000000000 + 2152 5.8430780618 7.2000000000 0.0000000000 + 2153 5.8430780618 7.4000000000 0.0000000000 + 2154 6.1894882233 7.0000000000 0.0000000000 + 2155 6.0162831426 6.9000000000 0.0000000000 + 2156 6.1894882233 6.8000000000 0.0000000000 + 2157 6.0162831426 6.7000000000 0.0000000000 + 2158 6.1894882233 6.6000000000 0.0000000000 + 2159 6.3626933041 6.7000000000 0.0000000000 + 2160 5.1502577388 1.2000000000 0.0000000000 + 2161 4.9770526581 1.1000000000 0.0000000000 + 2162 1.5129510429 8.7000000000 0.0000000000 + 2163 7.9215390309 5.2000000000 0.0000000000 + 2164 8.7875644347 3.1000000000 0.0000000000 + 2165 7.0555136271 0.7000000000 0.0000000000 + 2166 6.5358983849 5.4000000000 0.0000000000 + 2167 6.3626933041 5.5000000000 0.0000000000 + 2168 6.1894882233 5.4000000000 0.0000000000 + 2169 6.5358983849 5.6000000000 0.0000000000 + 2170 6.7091034656 5.5000000000 0.0000000000 + 2171 6.8823085464 5.4000000000 0.0000000000 + 2172 6.1894882233 5.2000000000 0.0000000000 + 2173 6.0162831426 5.3000000000 0.0000000000 + 2174 6.0162831426 5.5000000000 0.0000000000 + 2175 3.7000000000 9.8267949192 0.0000000000 + 2176 2.7077273126 9.8015323412 0.0000000000 + 2177 5.4973245836 9.5912880829 0.0000000000 + 2178 3.0717967697 5.4000000000 0.0000000000 + 2179 3.0717967697 5.0000000000 0.0000000000 + 2180 5.1502577388 8.2000000000 0.0000000000 + 2181 2.8985916890 1.9000000000 0.0000000000 + 2182 9.8267949192 1.5000000000 0.0000000000 + 2183 9.8267949192 5.9000000000 0.0000000000 + 2184 9.8267949192 6.1000000000 0.0000000000 + 2185 9.6535898385 6.0000000000 0.0000000000 + 2186 9.8267949192 7.1000000000 0.0000000000 + 2187 0.1732050808 1.9000000000 0.0000000000 + 2188 6.8972189133 9.8094827291 0.0000000000 + 2189 4.0990171415 9.8290382044 0.0000000000 + 2190 4.2998361902 9.8278263310 0.0000000000 + 2191 4.1964861896 9.6702895753 0.0000000000 + 2192 4.3964556014 9.6725917756 0.0000000000 + 2193 6.3626933041 5.9000000000 0.0000000000 + 2194 2.2057713659 7.1000000000 0.0000000000 + 2195 2.3789764467 7.2000000000 0.0000000000 + 2196 2.3789764467 7.4000000000 0.0000000000 + 2197 2.5521815275 1.5000000000 0.0000000000 + 2198 0.8201641283 6.5000000000 0.0000000000 + 2199 4.1021657962 0.1930705159 0.0000000000 + 2200 9.8267949192 3.1000000000 0.0000000000 + 2201 9.6535898385 3.2000000000 0.0000000000 + 2202 6.1894882233 1.4000000000 0.0000000000 + 2203 1.3397459622 2.8000000000 0.0000000000 + 2204 2.0325662852 7.0000000000 0.0000000000 + 2205 7.5751288694 4.2000000000 0.0000000000 + 2206 7.4019237886 4.3000000000 0.0000000000 + 2207 3.7646170928 6.6000000000 0.0000000000 + 2208 4.2842323350 5.9000000000 0.0000000000 + 2209 4.2842323350 5.7000000000 0.0000000000 + 2210 4.4574374158 5.8000000000 0.0000000000 + 2211 4.4574374158 5.6000000000 0.0000000000 + 2212 4.6306424965 5.7000000000 0.0000000000 + 2213 6.3626933041 7.1000000000 0.0000000000 + 2214 1.1665408814 0.7000000000 0.0000000000 + 2215 2.8988124412 0.5007094386 0.0000000000 + 2216 3.0690292865 0.4049753870 0.0000000000 + 2217 2.8966131817 0.3056949275 0.0000000000 + 2218 3.0752243963 0.1976569176 0.0000000000 + 2219 9.8267949192 2.7000000000 0.0000000000 + 2220 0.1732050808 5.9000000000 0.0000000000 + 2221 5.3234628196 4.1000000000 0.0000000000 + 2222 0.1684806235 7.4998130959 0.0000000000 + 2223 0.1684806235 1.4998130959 0.0000000000 + 2224 1.4761931627 9.8155832188 0.0000000000 + 2225 2.5521815275 2.1000000000 0.0000000000 + 2226 2.7253866082 2.2000000000 0.0000000000 + 2227 1.1665408814 2.9000000000 0.0000000000 + 2228 1.3397459622 3.0000000000 0.0000000000 + 2229 1.8593612044 2.3000000000 0.0000000000 + 2230 3.5914120120 1.7000000000 0.0000000000 + 2231 3.9378221735 1.9000000000 0.0000000000 + 2232 3.7646585286 1.0000717690 0.0000000000 + 2233 7.4019237886 8.5000000000 0.0000000000 + 2234 8.9607695155 5.4000000000 0.0000000000 + 2235 6.7091034656 3.1000000000 0.0000000000 + 2236 6.3000000000 0.1732050808 0.0000000000 + 2237 7.3000000000 0.1732050808 0.0000000000 + 2238 4.6306424965 2.9000000000 0.0000000000 + 2239 2.2057713659 5.5000000000 0.0000000000 + 2240 3.0717967697 4.8000000000 0.0000000000 + 2241 3.9378221735 4.5000000000 0.0000000000 + 2242 3.7646170928 3.8000000000 0.0000000000 + 2243 3.7646170928 4.0000000000 0.0000000000 + 2244 4.1110272543 3.4000000000 0.0000000000 + 2245 4.4574374158 3.8000000000 0.0000000000 + 2246 6.5358983849 6.0000000000 0.0000000000 + 2247 3.0717967697 3.0000000000 0.0000000000 + 2248 3.2450018505 3.1000000000 0.0000000000 + 2249 1.1665408814 1.7000000000 0.0000000000 + 2250 5.3234628196 5.5000000000 0.0000000000 + 2251 7.0555136271 3.3000000000 0.0000000000 + 2252 2.4963978516 0.1763545573 0.0000000000 + 2253 4.9770526581 6.3000000000 0.0000000000 + 2254 2.0325662852 3.0000000000 0.0000000000 + 2255 2.2057713659 3.1000000000 0.0000000000 + 2256 4.6306424965 7.1000000000 0.0000000000 + 2257 5.1502577388 6.8000000000 0.0000000000 + 2258 0.1732050808 3.7000000000 0.0000000000 + 2259 0.1684806235 2.7001869041 0.0000000000 + 2260 0.1732050808 2.3000000000 0.0000000000 + 2261 2.3000000000 9.8267949192 0.0000000000 + 2262 7.0555136271 8.9000000000 0.0000000000 + 2263 2.1000000000 0.1690289518 0.0000000000 + 2264 2.0132666741 0.3631403438 0.0000000000 + 2265 8.2679492001 1.7999999868 0.0000000000 + 2266 6.8823085464 6.8000000000 0.0000000000 + 2267 4.2842323350 3.9000000000 0.0000000000 + 2268 7.4019237886 7.3000000000 0.0000000000 + 2269 1.3397459622 6.8000000000 0.0000000000 + 2270 7.2287187079 3.4000000000 0.0000000000 + 2271 6.8823085464 3.4000000000 0.0000000000 + 2272 4.4574374158 8.0000000000 0.0000000000 + 2273 4.6306424965 3.9000000000 0.0000000000 + 2274 2.0325662852 1.2000000000 0.0000000000 + 2275 7.6967280610 0.1723669114 0.0000000000 + 2276 7.5892054255 0.3631202053 0.0000000000 + 2277 8.4411543231 1.6999999136 0.0000000000 + 2278 5.3234628196 3.7000000000 0.0000000000 + 2279 5.8430780618 3.8000000000 0.0000000000 + 2280 6.0162831426 3.7000000000 0.0000000000 + 2281 4.8038475773 5.8000000000 0.0000000000 + 2282 3.0717967697 2.4000000000 0.0000000000 + 2283 2.5521815275 2.9000000000 0.0000000000 + 2284 3.2450018505 8.1000000000 0.0000000000 + 2285 5.8430780618 1.0000000000 0.0000000000 + 2286 1.5129510429 6.9000000000 0.0000000000 + 2287 3.2450018505 6.7000000000 0.0000000000 + 2288 3.0717967697 6.6000000000 0.0000000000 + 2289 2.8985916890 4.9000000000 0.0000000000 + 2290 2.8985916890 4.7000000000 0.0000000000 + 2291 2.8985916890 7.9000000000 0.0000000000 + 2292 4.2842323350 5.3000000000 0.0000000000 + 2293 5.8430780618 4.2000000000 0.0000000000 + 2294 6.0162831426 4.3000000000 0.0000000000 + 2295 6.0162831426 4.5000000000 0.0000000000 + 2296 6.1894882233 4.4000000000 0.0000000000 + 2297 6.1894882233 4.6000000000 0.0000000000 + 2298 6.3626933041 4.5000000000 0.0000000000 + 2299 5.3234628196 4.5000000000 0.0000000000 + 2300 5.3234628196 4.9000000000 0.0000000000 + 2301 5.3234628196 6.1000000000 0.0000000000 + 2302 6.7091034656 7.7000000000 0.0000000000 + 2303 3.2450018505 4.3000000000 0.0000000000 + 2304 3.4182069312 4.2000000000 0.0000000000 + 2305 4.1110272543 7.6000000000 0.0000000000 + 2306 2.7253866082 4.2000000000 0.0000000000 + 2307 4.2842323350 6.7000000000 0.0000000000 + 2308 2.0325662852 5.0000000000 0.0000000000 + 2309 4.2842323350 4.1000000000 0.0000000000 + 2310 4.1110272543 4.6000000000 0.0000000000 + 2311 4.6306424965 4.7000000000 0.0000000000 + 2312 4.1110272543 4.8000000000 0.0000000000 + 2313 7.9215390309 6.8000000000 0.0000000000 + 2314 7.7483339502 6.9000000000 0.0000000000 + 2315 8.2679491924 4.0000000000 0.0000000000 + 2316 8.4411542732 6.3000000000 0.0000000000 + 2317 4.9770526581 7.3000000000 0.0000000000 + 2318 8.7875644348 2.2999999998 0.0000000000 + 2319 2.3789764467 5.4000000000 0.0000000000 + 2320 6.8823085464 5.2000000000 0.0000000000 + 2321 0.8201962845 6.7000000000 0.0000000000 + 2322 5.3234628196 7.3000000000 0.0000000000 + 2323 5.1502577388 7.4000000000 0.0000000000 + 2324 4.4574374158 5.4000000000 0.0000000000 + 2325 1.3397459622 7.0000000000 0.0000000000 + 2326 5.4966679003 7.4000000000 0.0000000000 + 2327 3.9378221735 4.7000000000 0.0000000000 + 2328 7.9215390309 3.4000000000 0.0000000000 + 2329 3.9378221735 5.7000000000 0.0000000000 + 2330 3.4182069312 6.0000000000 0.0000000000 + 2331 3.5914120120 5.5000000000 0.0000000000 + 2332 3.7646170928 5.4000000000 0.0000000000 + 2333 4.8038475773 3.0000000000 0.0000000000 + 2334 4.8038475773 3.2000000000 0.0000000000 + 2335 6.0162831426 7.5000000000 0.0000000000 + 2336 5.1502577388 1.8000000000 0.0000000000 + 2337 4.9770526581 1.9000000000 0.0000000000 + 2338 7.7483339502 4.1000000000 0.0000000000 + 2339 7.2287187079 5.0000000000 0.0000000000 + 2340 7.2287187079 5.2000000000 0.0000000000 + 2341 1.6861561237 4.8000000000 0.0000000000 + 2342 8.6143593539 6.2000000000 0.0000000000 + 2343 9.8257762236 0.4949699214 0.0000000000 + 2344 9.8267949192 8.7000000000 0.0000000000 + 2345 4.4574374158 6.0000000000 0.0000000000 + 2346 3.5914120120 2.9000000000 0.0000000000 + 2347 3.5914120120 5.1000000000 0.0000000000 + 2348 8.2679491924 4.4000000000 0.0000000000 + 2349 5.1502577388 3.6000000000 0.0000000000 + 2350 5.1502577388 3.4000000000 0.0000000000 + 2351 3.7646170928 5.0000000000 0.0000000000 + 2352 2.7253866082 5.6000000000 0.0000000000 + 2353 2.3789764467 5.6000000000 0.0000000000 + 2354 1.6861561237 5.4000000000 0.0000000000 + 2355 3.0717967697 1.2000000000 0.0000000000 + 2356 1.6861561237 4.4000000000 0.0000000000 + 2357 8.5021366061 0.1761485655 0.0000000000 + 2358 6.1894882233 6.4000000000 0.0000000000 + 2359 7.4019237886 3.9000000000 0.0000000000 + 2360 6.0162831426 2.1000000000 0.0000000000 + 2361 6.5358983849 4.8000000000 0.0000000000 + 2362 6.3626933041 4.7000000000 0.0000000000 + 2363 6.0162831426 4.7000000000 0.0000000000 + 2364 8.4411522238 1.1000035496 0.0000000000 + 2365 4.8038475773 6.4000000000 0.0000000000 + 2366 5.3234628196 2.7000000000 0.0000000000 + 2367 7.7483339502 3.1000000000 0.0000000000 + 2368 2.8985916890 3.7000000000 0.0000000000 + 2369 9.4803847577 8.7000000000 0.0000000000 + 2370 0.9000000000 9.8267949192 0.0000000000 + 2371 5.8430780618 4.6000000000 0.0000000000 + 2372 2.8985916890 1.3000000000 0.0000000000 + 2373 6.7091034656 5.9000000000 0.0000000000 + 2374 5.4966679003 2.8000000000 0.0000000000 + 2375 6.5358983849 4.0000000000 0.0000000000 + 2376 3.2450018505 1.9000000000 0.0000000000 + 2377 9.8267949192 8.3000000000 0.0000000000 + 2378 1.8593612044 9.1000000000 0.0000000000 + 2379 0.9933649797 8.1999975226 0.0000000000 + 2380 0.1732050808 6.5000000000 0.0000000000 + 2381 0.1710089845 5.4999918912 0.0000000000 + 2382 7.7483339502 4.7000000000 0.0000000000 + 2383 6.3626933041 4.1000000000 0.0000000000 + 2384 7.4019237886 5.5000000000 0.0000000000 + 2385 4.9770526581 0.9000000000 0.0000000000 + 2386 8.9607695155 7.8000000000 0.0000000000 + 2387 3.9378221735 8.1000000000 0.0000000000 + 2388 9.4803847577 3.9000000000 0.0000000000 + 2389 9.3071796770 3.8000000000 0.0000000000 + 2390 8.0947437186 1.1000006809 0.0000000000 + 2391 4.7001296321 9.8272675957 0.0000000000 + 2392 4.8970266857 9.8255695253 0.0000000000 + 2393 6.3626933041 6.5000000000 0.0000000000 + 2394 2.0325662852 6.0000000000 0.0000000000 + 2395 7.0555136271 1.3000000000 0.0000000000 + 2396 7.5751288694 8.2000000000 0.0000000000 + 2397 9.8267949192 1.9000000000 0.0000000000 + 2398 2.7253866082 5.8000000000 0.0000000000 + 2399 7.0555136271 4.1000000000 0.0000000000 + 2400 7.0555136271 5.7000000000 0.0000000000 + 2401 3.9378221735 7.1000000000 0.0000000000 + 2402 4.1110272543 6.4000000000 0.0000000000 + 2403 4.6306424965 1.5000000000 0.0000000000 + 2404 4.8038475773 1.6000000000 0.0000000000 + 2405 7.2287187079 4.2000000000 0.0000000000 + 2406 1.8593612044 8.1000000000 0.0000000000 + 2407 2.2057713659 8.9000000000 0.0000000000 + 2408 1.5129510429 1.9000000000 0.0000000000 + 2409 9.8267949192 7.5000000000 0.0000000000 + 2410 6.4942545031 9.8438023659 0.0000000000 + 2411 5.4978844093 9.7948329807 0.0000000000 + 2412 3.2450018505 2.5000000000 0.0000000000 + 2413 0.9933406638 7.9999995871 0.0000000000 + 2414 1.6861561237 5.6000000000 0.0000000000 + 2415 6.7091034656 1.3000000000 0.0000000000 + 2416 3.5914120120 3.5000000000 0.0000000000 + 2417 2.0325662852 7.6000000000 0.0000000000 + 2418 2.3789764467 8.4000000000 0.0000000000 + 2419 0.1732050808 6.1000000000 0.0000000000 + 2420 4.2842323350 6.5000000000 0.0000000000 + 2421 5.8786365666 0.1870481200 0.0000000000 + 2422 5.4966679003 7.8000000000 0.0000000000 + 2423 5.6698729811 7.7000000000 0.0000000000 + 2424 4.6306424965 5.1000000000 0.0000000000 + 2425 7.0555136271 7.9000000000 0.0000000000 + 2426 6.8823085464 3.2000000000 0.0000000000 + 2427 2.8985916890 8.1000000000 0.0000000000 + 2428 2.2057713659 7.3000000000 0.0000000000 + 2429 6.0162831426 2.5000000000 0.0000000000 + 2430 3.0717967697 5.6000000000 0.0000000000 + 2431 3.4182069312 1.6000000000 0.0000000000 + 2432 2.5521815275 3.3000000000 0.0000000000 + 2433 3.0717967697 3.2000000000 0.0000000000 + 2434 5.6698729811 1.5000000000 0.0000000000 + 2435 3.2450018505 8.7000000000 0.0000000000 + 2436 6.5358983849 7.8000000000 0.0000000000 + 2437 5.8430780618 8.2000000000 0.0000000000 + 2438 6.0162831426 6.5000000000 0.0000000000 + 2439 4.6306424965 8.5000000000 0.0000000000 + 2440 4.4574374158 8.6000000000 0.0000000000 + 2441 4.2842323350 8.5000000000 0.0000000000 + 2442 4.8038475773 9.0000000000 0.0000000000 + 2443 4.1110272543 8.8000000000 0.0000000000 + 2444 8.7875644347 6.7000000000 0.0000000000 + 2445 6.3626933041 9.3000000000 0.0000000000 + 2446 2.3789764467 4.0000000000 0.0000000000 + 2447 6.8823085464 7.2000000000 0.0000000000 + 2448 9.8267949192 1.1000000000 0.0000000000 + 2449 7.0555136271 6.3000000000 0.0000000000 + 2450 7.0555136271 5.3000000000 0.0000000000 + 2451 2.3789764467 2.8000000000 0.0000000000 + 2452 2.3789764467 3.0000000000 0.0000000000 + 2453 6.1894882233 1.6000000000 0.0000000000 + 2454 2.0325662852 3.4000000000 0.0000000000 + 2455 2.0325662852 3.6000000000 0.0000000000 + 2456 2.2057713659 3.7000000000 0.0000000000 + 2457 4.8038475773 5.6000000000 0.0000000000 + 2458 5.4966679003 1.6000000000 0.0000000000 + 2459 3.9378221735 1.7000000000 0.0000000000 + 2460 6.8823085464 8.4000000000 0.0000000000 + 2461 3.4182069312 7.6000000000 0.0000000000 + 2462 3.7646170928 6.4000000000 0.0000000000 + 2463 2.3789764467 4.6000000000 0.0000000000 + 2464 1.5129510429 2.9000000000 0.0000000000 + 2465 2.5521815275 2.3000000000 0.0000000000 + 2466 5.8430780618 5.6000000000 0.0000000000 + 2467 1.5129510429 3.3000000000 0.0000000000 + 2468 1.3397459622 8.2000000000 0.0000000000 + 2469 6.5358983849 2.0000000000 0.0000000000 + 2470 2.8985916890 2.5000000000 0.0000000000 + 2471 1.3397459622 7.6000000000 0.0000000000 + 2472 5.6698729811 6.7000000000 0.0000000000 + 2473 4.9798079701 0.5070047507 0.0000000000 + 2474 8.4411542732 2.7000000000 0.0000000000 + 2475 2.5521815275 3.9000000000 0.0000000000 + 2476 4.8038475773 3.4000000000 0.0000000000 + 2477 6.0162831426 5.1000000000 0.0000000000 + 2478 8.2679491924 8.6000000000 0.0000000000 + 2479 8.0947441117 8.7000000000 0.0000000000 + 2480 0.9933358006 1.2000000000 0.0000000000 + 2481 8.9607699606 1.5999992289 0.0000000000 + 2482 1.3397459622 7.2000000000 0.0000000000 + 2483 7.0555136271 2.5000000000 0.0000000000 + 2484 2.8985916890 7.3000000000 0.0000000000 + 2485 1.6861561237 7.4000000000 0.0000000000 + 2486 9.1339850253 1.2999819363 0.0000000000 + 2487 9.3071796770 8.0000000000 0.0000000000 + 2488 7.2287187079 1.6000000000 0.0000000000 + 2489 7.2287187079 7.0000000000 0.0000000000 + 2490 2.2057713659 1.7000000000 0.0000000000 + 2491 8.2679491924 8.0000000000 0.0000000000 + 2492 1.6861561237 6.4000000000 0.0000000000 + 2493 0.9933358006 4.4000000000 0.0000000000 + 2494 8.9607695155 8.4000000000 0.0000000000 + 2495 2.7253866082 9.0000000000 0.0000000000 + 2496 2.7254659900 9.1998625067 0.0000000000 + 2497 7.4019237886 4.1000000000 0.0000000000 + 2498 5.3234628196 3.3000000000 0.0000000000 + 2499 8.9607695155 2.8000000000 0.0000000000 + 2500 2.8985916890 3.9000000000 0.0000000000 + 2501 7.4019237887 2.3000000000 0.0000000000 + 2502 5.8430780618 0.8000000000 0.0000000000 + 2503 4.6306424965 2.1000000000 0.0000000000 + 2504 6.7091034656 2.7000000000 0.0000000000 + 2505 5.4966679003 6.0000000000 0.0000000000 + 2506 4.2842323350 1.1000000000 0.0000000000 + 2507 4.1110398566 1.0000218279 0.0000000000 + 2508 7.9215390309 7.4000000000 0.0000000000 + 2509 4.6306424965 4.1000000000 0.0000000000 + 2510 9.3071796770 6.2000000000 0.0000000000 + 2511 4.1029461764 0.4060193061 0.0000000000 + 2512 5.1502577388 6.4000000000 0.0000000000 + 2513 4.9770526581 3.3000000000 0.0000000000 + 2514 4.9770526581 7.7000000000 0.0000000000 + 2515 3.5914120120 7.1000000000 0.0000000000 + 2516 1.5129510429 5.7000000000 0.0000000000 + 2517 4.9770526581 5.5000000000 0.0000000000 + 2518 4.4574374158 4.0000000000 0.0000000000 + 2519 3.9378221735 6.5000000000 0.0000000000 + 2520 1.8593612044 6.5000000000 0.0000000000 + 2521 0.8201307199 7.5000000000 0.0000000000 + 2522 9.1345117343 0.6992690850 0.0000000000 + 2523 5.8430780618 5.0000000000 0.0000000000 + 2524 5.8430780618 5.4000000000 0.0000000000 + 2525 5.6698729811 7.5000000000 0.0000000000 + 2526 1.1665408814 4.7000000000 0.0000000000 + 2527 3.2449947869 0.7002737834 0.0000000000 + 2528 3.0717967697 7.2000000000 0.0000000000 + 2529 1.5129510429 5.5000000000 0.0000000000 + 2530 0.6473282377 3.0005128649 0.0000000000 + 2531 5.8430780618 6.8000000000 0.0000000000 + 2532 9.3071796770 5.8000000000 0.0000000000 + 2533 4.6306424965 8.1000000000 0.0000000000 + 2534 3.7646170928 2.4000000000 0.0000000000 + 2535 6.8823085464 3.6000000000 0.0000000000 + 2536 6.7091034656 3.5000000000 0.0000000000 + 2537 1.5129510429 5.3000000000 0.0000000000 + 2538 1.3397459622 5.4000000000 0.0000000000 + 2539 5.8399082335 9.4039229103 0.0000000000 + 2540 4.6306424965 4.3000000000 0.0000000000 + 2541 9.3071796770 8.6000000000 0.0000000000 + 2542 0.4758027953 6.1000000000 0.0000000000 + 2543 1.3397459622 9.2000000000 0.0000000000 + 2544 9.1339745962 8.7000000000 0.0000000000 + 2545 1.1665408814 8.7000000000 0.0000000000 + 2546 3.7646170928 9.0000000000 0.0000000000 + 2547 3.5922154505 9.3001446865 0.0000000000 + 2548 6.5358983849 4.4000000000 0.0000000000 + 2549 1.5129510429 2.3000000000 0.0000000000 + 2550 3.0717967697 4.0000000000 0.0000000000 + 2551 8.4411542732 2.5000000000 0.0000000000 + 2552 8.4411542734 2.2999999996 0.0000000000 + 2553 8.7880041975 9.2992304114 0.0000000000 + 2554 0.9933358006 6.2000000000 0.0000000000 + 2555 4.8038475773 5.0000000000 0.0000000000 + 2556 7.7483339502 6.7000000000 0.0000000000 + 2557 8.6143593539 8.0000000000 0.0000000000 + 2558 7.0555136271 7.1000000000 0.0000000000 + 2559 4.6306424965 3.1000000000 0.0000000000 + 2560 3.9378221735 8.3000000000 0.0000000000 + 2561 8.9607695155 7.2000000000 0.0000000000 + 2562 1.1665408814 3.9000000000 0.0000000000 + 2563 1.1665408814 3.7000000000 0.0000000000 + 2564 7.9215389080 1.0000002130 0.0000000000 + 2565 2.5521815275 8.3000000000 0.0000000000 + 2566 5.8430780618 6.2000000000 0.0000000000 + 2567 3.9378221735 2.9000000000 0.0000000000 + 2568 8.2679491924 3.4000000000 0.0000000000 + 2569 1.3397459622 2.2000000000 0.0000000000 + 2570 1.1665408814 2.3000000000 0.0000000000 + 2571 7.7483339502 8.1000000000 0.0000000000 + 2572 3.5914189180 1.1000119615 0.0000000000 + 2573 2.3789764467 3.2000000000 0.0000000000 + 2574 9.6536503861 0.9998951285 0.0000000000 + 2575 4.4573833387 0.8000131634 0.0000000000 + 2576 4.2842433278 0.9000368447 0.0000000000 + 2577 1.3397459622 4.0000000000 0.0000000000 + 2578 1.5129510429 3.9000000000 0.0000000000 + 2579 2.8985916890 5.5000000000 0.0000000000 + 2580 4.8038475773 4.6000000000 0.0000000000 + 2581 8.2679491949 1.9999999957 0.0000000000 + 2582 7.5751288694 2.4000000000 0.0000000000 + 2583 2.8985916890 6.9000000000 0.0000000000 + 2584 4.8038475773 4.4000000000 0.0000000000 + 2585 6.8824341429 9.1998267795 0.0000000000 + 2586 4.4574374158 3.2000000000 0.0000000000 + 2587 9.3071796770 3.0000000000 0.0000000000 + 2588 4.1110272543 3.2000000000 0.0000000000 + 2589 2.0325662852 6.2000000000 0.0000000000 + 2590 7.7483339502 5.5000000000 0.0000000000 + 2591 1.8593612044 2.5000000000 0.0000000000 + 2592 7.0555136271 4.5000000000 0.0000000000 + 2593 2.5521815275 4.9000000000 0.0000000000 + 2594 3.7646170928 6.2000000000 0.0000000000 + 2595 9.4803847577 4.5000000000 0.0000000000 + 2596 2.3790558285 0.8001374933 0.0000000000 + 2597 3.2412897402 0.5072000532 0.0000000000 + 2598 1.3397459622 2.0000000000 0.0000000000 + 2599 5.8430780618 7.0000000000 0.0000000000 + 2600 4.2842323350 5.5000000000 0.0000000000 + 2601 8.2679491924 8.8000000000 0.0000000000 + 2602 2.8985916890 5.1000000000 0.0000000000 + 2603 2.7253866082 5.0000000000 0.0000000000 + 2604 2.8985916890 6.5000000000 0.0000000000 + 2605 6.0162831426 4.1000000000 0.0000000000 + 2606 8.2679491925 2.3999999999 0.0000000000 + 2607 6.3626933041 0.9000000000 0.0000000000 + 2608 9.3071796770 2.0000000000 0.0000000000 + 2609 3.4159972743 9.5847099775 0.0000000000 + 2610 4.1110272543 5.6000000000 0.0000000000 + 2611 7.0555136271 2.7000000000 0.0000000000 + 2612 8.4411542732 4.3000000000 0.0000000000 + 2613 8.4411542732 4.1000000000 0.0000000000 + 2614 2.8985916890 5.3000000000 0.0000000000 + 2615 6.7091034656 7.9000000000 0.0000000000 + 2616 6.8823085464 8.0000000000 0.0000000000 + 2617 9.3071796770 9.2000096747 0.0000000000 + 2618 8.7875644347 3.9000000000 0.0000000000 + 2619 8.6143593539 4.0000000000 0.0000000000 + 2620 2.3789764467 4.8000000000 0.0000000000 + 2621 6.1894882233 8.4000000000 0.0000000000 + 2622 7.0555136271 4.7000000000 0.0000000000 + 2623 2.8985916890 2.3000000000 0.0000000000 + 2624 2.0325662852 2.4000000000 0.0000000000 + 2625 8.7875644347 3.3000000000 0.0000000000 + 2626 1.3397459622 3.4000000000 0.0000000000 + 2627 0.9933358006 7.2000000000 0.0000000000 + 2628 1.3397459622 7.4000000000 0.0000000000 + 2629 2.3789764467 6.6000000000 0.0000000000 + 2630 8.4411542732 7.3000000000 0.0000000000 + 2631 3.7646170928 7.2000000000 0.0000000000 + 2632 0.8201962845 3.5000000000 0.0000000000 + 2633 4.6306424965 8.3000000000 0.0000000000 + 2634 5.6698729811 7.1000000000 0.0000000000 + 2635 4.2842323350 7.5000000000 0.0000000000 + 2636 7.4019237886 1.1000000000 0.0000000000 + 2637 2.2057713659 6.3000000000 0.0000000000 + 2638 3.0717967697 6.8000000000 0.0000000000 + 2639 8.2679491924 3.2000000000 0.0000000000 + 2640 5.4982778490 0.5971288916 0.0000000000 + 2641 2.0325662852 4.8000000000 0.0000000000 + 2642 5.6698729811 7.3000000000 0.0000000000 + 2643 1.1664780058 9.2998910963 0.0000000000 + 2644 6.0162831426 3.9000000000 0.0000000000 + 2645 7.5751288694 4.6000000000 0.0000000000 + 2646 3.5914120120 6.3000000000 0.0000000000 + 2647 1.1665408814 1.9000000000 0.0000000000 + 2648 3.9379416169 0.9002068820 0.0000000000 + 2649 9.4803636495 9.3001546045 0.0000000000 + 2650 4.1110272543 7.4000000000 0.0000000000 + 2651 8.7875644347 8.7000000000 0.0000000000 + 2652 6.1894882233 3.6000000000 0.0000000000 + 2653 7.9215390309 5.8000000000 0.0000000000 + 2654 5.1502577388 5.6000000000 0.0000000000 + 2655 4.6306424965 5.3000000000 0.0000000000 + 2656 5.6698729811 8.3000000000 0.0000000000 + 2657 2.0325662852 1.6000000000 0.0000000000 + 2658 2.0325662852 7.4000000000 0.0000000000 + 2659 4.8037271620 0.7998755228 0.0000000000 + 2660 4.8038475773 4.8000000000 0.0000000000 + 2661 0.6469256391 8.8000000000 0.0000000000 + 2662 7.7483362095 8.8999960867 0.0000000000 + 2663 4.6306424965 7.3000000000 0.0000000000 + 2664 5.4966679003 6.2000000000 0.0000000000 + 2665 9.3071878165 1.3999859020 0.0000000000 + 2666 4.1097996805 9.3872857499 0.0000000000 + 2667 4.1110272543 7.2000000000 0.0000000000 + 2668 8.4411542732 8.1000000000 0.0000000000 + 2669 7.5781102244 0.5934921257 0.0000000000 + 2670 5.6698729811 1.7000000000 0.0000000000 + 2671 5.1502577388 3.2000000000 0.0000000000 + 2672 3.7646170928 8.8000000000 0.0000000000 + 2673 8.9607695155 7.6000000000 0.0000000000 + 2674 8.9607695155 7.4000000000 0.0000000000 + 2675 1.3397459622 4.6000000000 0.0000000000 + 2676 4.4574374158 7.4000000000 0.0000000000 + 2677 2.2057713659 3.3000000000 0.0000000000 + 2678 3.9378221735 8.7000000000 0.0000000000 + 2679 0.8201307199 1.3000000000 0.0000000000 + 2680 1.5129510429 1.3000000000 0.0000000000 + 2681 3.4182069312 6.2000000000 0.0000000000 + 2682 0.9933358006 5.2000000000 0.0000000000 + 2683 7.5751288694 6.6000000000 0.0000000000 + 2684 6.0162831426 3.5000000000 0.0000000000 + 2685 9.6535987234 1.1999846109 0.0000000000 + 2686 6.0164103509 0.7002203312 0.0000000000 + 2687 7.5751288694 6.4000000000 0.0000000000 + 2688 8.6143593539 7.8000000000 0.0000000000 + 2689 7.5751288694 8.4000000000 0.0000000000 + 2690 3.9378510871 1.1000500798 0.0000000000 + 2691 4.6306424965 5.5000000000 0.0000000000 + 2692 5.1660335778 9.6244432637 0.0000000000 + 2693 8.9607695155 8.6000000000 0.0000000000 + 2694 5.8430780618 3.4000000000 0.0000000000 + 2695 7.4019237886 5.1000000000 0.0000000000 + 2696 6.1895830334 0.8001642159 0.0000000000 + 2697 1.5129510429 1.1000000000 0.0000000000 + 2698 4.8038475773 7.4000000000 0.0000000000 + 2699 7.2287187079 6.4000000000 0.0000000000 + 2700 4.9770526581 7.5000000000 0.0000000000 + 2701 4.8038475773 7.8000000000 0.0000000000 + 2702 1.6861561237 1.4000000000 0.0000000000 + 2703 0.9932624458 9.1998729457 0.0000000000 + 2704 8.6144928251 9.1997568669 0.0000000000 + 2705 7.9215390309 6.0000000000 0.0000000000 + 2706 8.2679491924 4.8000000000 0.0000000000 + 2707 4.8038475773 1.8000000000 0.0000000000 + 2708 7.2287187079 9.0000000000 0.0000000000 + 2709 5.8430780618 3.2000000000 0.0000000000 + 2710 0.8201253820 1.1000092454 0.0000000000 + 2711 6.7091034656 8.1000000000 0.0000000000 + 2712 4.4574374158 2.4000000000 0.0000000000 + 2713 1.6945351485 9.5938584847 0.0000000000 + 2714 8.4411542732 4.5000000000 0.0000000000 + 2715 7.4019237888 1.6999999998 0.0000000000 + 2716 5.4966679003 1.8000000000 0.0000000000 + 2717 4.8038475773 8.0000000000 0.0000000000 + 2718 2.8985916890 2.1000000000 0.0000000000 + 2719 3.2450018505 6.3000000000 0.0000000000 + 2720 7.4019237886 9.5000000000 0.0000000000 + 2721 7.2381698016 9.5980459035 0.0000000000 + 2722 0.4797914299 2.9036755319 0.0000000000 + 2723 1.8593612044 6.3000000000 0.0000000000 + 2724 6.5367775603 9.3987874565 0.0000000000 + 2725 1.8593612044 4.7000000000 0.0000000000 + 2726 1.6861561237 4.6000000000 0.0000000000 + 2727 5.3234628196 1.9000000000 0.0000000000 + 2728 8.4411542732 7.5000000000 0.0000000000 + 2729 1.3397459622 8.6000000000 0.0000000000 + 2730 3.4182069312 3.6000000000 0.0000000000 + 2731 2.7253866082 4.0000000000 0.0000000000 + 2732 2.8986843011 9.2998395911 0.0000000000 + 2733 6.7091034656 2.9000000000 0.0000000000 + 2734 8.2679491931 2.1999999988 0.0000000000 + 2735 7.5751288694 5.4000000000 0.0000000000 + 2736 1.1665408814 5.5000000000 0.0000000000 + 2737 5.8430780618 6.6000000000 0.0000000000 + 2738 7.4019237886 4.5000000000 0.0000000000 + 2739 7.9215394075 8.7999993478 0.0000000000 + 2740 1.8593612044 1.3000000000 0.0000000000 + 2741 5.8430780618 6.4000000000 0.0000000000 + 2742 7.2287187079 4.4000000000 0.0000000000 + 2743 3.5914120120 3.7000000000 0.0000000000 + 2744 4.1110272543 2.4000000000 0.0000000000 + 2745 6.7091034656 8.3000000000 0.0000000000 + 2746 1.5129510429 8.5000000000 0.0000000000 + 2747 6.0162831426 8.3000000000 0.0000000000 + 2748 3.0717967697 6.4000000000 0.0000000000 + 2749 4.1110272543 8.6000000000 0.0000000000 + 2750 7.4019237886 5.3000000000 0.0000000000 + 2751 2.0325662852 1.4000000000 0.0000000000 + 2752 7.7483339502 5.7000000000 0.0000000000 + 2753 4.8036930158 0.6025290143 0.0000000000 + 2754 8.9607695155 3.0000000000 0.0000000000 + 2755 9.6535927394 1.3999949754 0.0000000000 + 2756 2.3789764467 1.4000000000 0.0000000000 + 2757 2.8945533562 9.4922815291 0.0000000000 + 2758 0.9933522962 3.6000000000 0.0000000000 + 2759 7.4019237887 1.2999999999 0.0000000000 + 2760 2.2057713659 1.5000000000 0.0000000000 + 2761 8.4411542732 5.5000000000 0.0000000000 + 2762 2.0288941754 0.5937007365 0.0000000000 + 2763 8.6143593549 2.1999999984 0.0000000000 + 2764 6.3626933041 5.7000000000 0.0000000000 + 2765 6.1894882233 5.6000000000 0.0000000000 + 2766 6.5358983849 8.4000000000 0.0000000000 + 2767 6.5358983849 5.8000000000 0.0000000000 + 2768 3.2450018505 4.1000000000 0.0000000000 + 2769 6.3626933041 4.3000000000 0.0000000000 + 2770 3.4182069312 4.0000000000 0.0000000000 + 2771 6.5535863322 9.5759165594 0.0000000000 + 2772 7.0555136271 5.5000000000 0.0000000000 + 2773 4.2842323350 3.1000000000 0.0000000000 + 2774 2.2057713659 4.5000000000 0.0000000000 + 2775 6.0162831426 5.7000000000 0.0000000000 + 2776 8.0947440692 1.3000000736 0.0000000000 + 2777 3.5914120120 3.9000000000 0.0000000000 + 2778 6.7091034656 5.7000000000 0.0000000000 + 2779 7.9215390317 1.9999999987 0.0000000000 + 2780 6.8823085464 5.6000000000 0.0000000000 + 2781 8.4411542732 4.7000000000 0.0000000000 + 2782 7.2287187079 5.4000000000 0.0000000000 + 2783 2.2057713659 3.9000000000 0.0000000000 + 2784 3.4182069312 3.4000000000 0.0000000000 + 2785 2.5521815275 1.3000000000 0.0000000000 + 2786 2.2057713659 4.3000000000 0.0000000000 + 2787 1.5129510429 4.7000000000 0.0000000000 + 2788 0.6473200827 1.1995012600 0.0000000000 + 2789 6.1894882233 4.2000000000 0.0000000000 + 2790 2.2057713659 4.1000000000 0.0000000000 + 2791 6.1894882233 8.6000000000 0.0000000000 + 2792 2.2057713659 4.7000000000 0.0000000000 + 2793 0.9933358006 5.4000000000 0.0000000000 + 2794 2.7253866082 1.0000000000 0.0000000000 + 2795 2.7253866082 1.2000000000 0.0000000000 + 2796 3.5914120120 3.1000000000 0.0000000000 + 2797 9.1339745962 3.1000000000 0.0000000000 + 2798 3.4182069312 3.2000000000 0.0000000000 + 2799 3.7646170928 3.0000000000 0.0000000000 + 2800 9.3071796770 5.2000000000 0.0000000000 + 2801 6.3626933041 8.5000000000 0.0000000000 + 2802 6.5358983849 2.2000000000 0.0000000000 + 2803 1.3403053420 9.3989948245 0.0000000000 + 2804 5.4966679003 2.2000000000 0.0000000000 + 2805 5.1502577388 2.4000000000 0.0000000000 + 2806 7.2287187079 1.4000000000 0.0000000000 + 2807 0.6469256391 4.6000000000 0.0000000000 + 2808 5.6698729811 8.9000000000 0.0000000000 + 2809 7.0555136271 1.9000000000 0.0000000000 + 2810 0.9933358006 4.6000000000 0.0000000000 + 2811 5.4966683252 8.7999992640 0.0000000000 + 2812 4.4574374158 2.2000000000 0.0000000000 + 2813 8.7875644347 4.9000000000 0.0000000000 + 2814 0.4797881432 1.2963301609 0.0000000000 + 2815 6.0162831426 8.7000000000 0.0000000000 + 2816 8.6130653679 9.5839031816 0.0000000000 + 2817 0.8201307199 5.5000000000 0.0000000000 + 2818 9.4803847577 3.3000000000 0.0000000000 + 2819 4.4644656622 9.3863733636 0.0000000000 + 2820 8.6143593539 4.8000000000 0.0000000000 + 2821 8.9607695155 5.2000000000 0.0000000000 + 2822 5.3234633153 8.6999991414 0.0000000000 + 2823 5.8430780618 8.8000000000 0.0000000000 + 2824 9.6535898385 3.4000000000 0.0000000000 + 2825 1.3573965144 9.6239403501 0.0000000000 + 2826 0.6469256391 5.4000000000 0.0000000000 + 2827 8.7875644347 5.1000000000 0.0000000000 + 2828 5.3234628196 2.3000000000 0.0000000000 + 2829 4.6306424965 9.3000000000 0.0000000000 + 2830 9.6535903220 1.5999991626 0.0000000000 + 2831 5.1502582463 8.7999991209 0.0000000000 + 2832 9.6535898385 4.0000000000 0.0000000000 + 2833 9.6535899191 1.7999998604 0.0000000000 + 2834 4.8039361848 9.1998465273 0.0000000000 + 2835 4.9771005687 9.0999170164 0.0000000000 + 2836 0.4781246366 5.2996947233 0.0000000000 + 2837 9.6535898519 1.9999999767 0.0000000000 + 2838 9.6535898385 4.6000000000 0.0000000000 + 2839 9.8267949192 4.1000000000 0.0000000000 + 2840 5.1502840795 8.9999543766 0.0000000000 + 2841 9.8267949192 4.7000000000 0.0000000000 + 2842 9.6535898407 2.1999999961 0.0000000000 + 2843 9.6535898385 2.8000000000 0.0000000000 + 2844 9.8267949192 3.5000000000 0.0000000000 + 2845 9.4803847577 3.1000000000 0.0000000000 + 2846 9.6535898385 3.0000000000 0.0000000000 + 2847 9.6535898385 2.6000000000 0.0000000000 + 2848 9.8267949192 3.7000000000 0.0000000000 + 2849 9.6535898389 2.3999999994 0.0000000000 + 2850 9.6535898385 3.8000000000 0.0000000000 + 2851 9.4803847577 6.1000000000 0.0000000000 + 2852 9.8267949192 4.3000000000 0.0000000000 + 2853 9.8267949192 5.3000000000 0.0000000000 + 2854 9.6535898385 4.4000000000 0.0000000000 + 2855 9.8267949192 4.9000000000 0.0000000000 + 2856 9.6535898385 5.0000000000 0.0000000000 + 2857 9.6535898385 6.4000000000 0.0000000000 + 2858 9.6535898385 5.2000000000 0.0000000000 + 2859 9.8288668955 9.4987010364 0.0000000000 + 2860 9.8267949192 6.5000000000 0.0000000000 + 2861 9.6550387791 9.4002882308 0.0000000000 + 2862 9.6535898385 6.2000000000 0.0000000000 + 2863 9.4803847577 5.9000000000 0.0000000000 + 2864 9.6535898385 5.8000000000 0.0000000000 + 2865 9.6535898385 7.2000000000 0.0000000000 + 2866 9.8267949192 6.7000000000 0.0000000000 + 2867 9.6535898385 7.6000000000 0.0000000000 + 2868 9.6535898385 7.8000000000 0.0000000000 + 2869 9.6535898385 5.6000000000 0.0000000000 + 2870 9.6535898385 7.4000000000 0.0000000000 + 2871 9.6535898385 7.0000000000 0.0000000000 + 2872 9.6535898385 6.8000000000 0.0000000000 + 2873 9.8267949192 5.5000000000 0.0000000000 + 2874 9.6535898385 8.0000000000 0.0000000000 + 2875 9.6535898385 8.4000000000 0.0000000000 + 2876 9.6538278106 9.2000738059 0.0000000000 + 2877 9.6535898385 8.2000000000 0.0000000000 + 2878 9.6535898385 8.6000000000 0.0000000000 + 2879 9.6535898385 8.8000000000 0.0000000000 + 2880 9.6536295005 9.0000123010 0.0000000000 + 2881 5.8451836035 0.5978836181 0.0000000000 + 2882 3.0924567680 9.8222539471 0.0000000000 + 2883 8.2910015254 9.8226697297 0.0000000000 + 2884 9.6587721273 0.3906936100 0.0000000000 + 2885 9.6761137722 0.1781858363 0.0000000000 + 2886 1.1683381471 0.5105848046 0.0000000000 + 2887 4.5164695705 0.1660385976 0.0000000000 + 2888 9.8349834371 9.6929144020 0.0000000000 + 2889 4.2909177839 9.4884204629 0.0000000000 + 2890 0.8294814304 0.5119144469 0.0000000000 + 2891 3.5000000000 0.1585309478 0.0000000000 + 2892 5.9055506330 9.8310316937 0.0000000000 + 2893 3.5921240644 0.5133872651 0.0000000000 + 2894 4.0000000000 9.6727824248 0.0000000000 + 2895 0.9019794177 0.1542350672 0.0000000000 + 2896 0.1581877405 9.5014588972 0.0000000000 + 2897 0.1580709242 8.8978488166 0.0000000000 + 2898 0.1606206289 8.2988745464 0.0000000000 + 2899 0.1606301531 6.8988887927 0.0000000000 + 2900 0.1580709242 4.6978488166 0.0000000000 + 2901 0.1606206289 4.0988745464 0.0000000000 + 2902 0.3183312996 3.0026029930 0.0000000000 + 2903 0.1580790893 0.8978654170 0.0000000000 + 2904 0.3173648040 9.1967376093 0.0000000000 + 2905 0.3173730290 8.5967233630 0.0000000000 + 2906 0.3183201163 7.1974112533 0.0000000000 + 2907 0.3173730290 4.3967233630 0.0000000000 + 2908 0.1606301531 3.3011112073 0.0000000000 + 2909 0.3181863469 4.9973970070 0.0000000000 + 2910 0.3183274651 1.1974036486 0.0000000000 + 2911 0.3161843574 0.5967916724 0.0000000000 + 2912 0.1522224789 0.2966553669 0.0000000000 + 2913 0.1547610575 9.7057784569 0.0000000000 + 2914 3.4088710544 0.4263600263 0.0000000000 + 2915 0.3234628196 8.0000000000 0.0000000000 + 2916 0.3234628196 7.8000000000 0.0000000000 + 2917 0.3234628196 7.6000000000 0.0000000000 + 2918 0.3212080993 7.3985727170 0.0000000000 + 2919 0.3234628196 6.4000000000 0.0000000000 + 2920 0.3234628196 6.0000000000 0.0000000000 + 2921 0.3234628196 6.2000000000 0.0000000000 + 2922 0.3234628196 6.6000000000 0.0000000000 + 2923 0.3234628196 5.8000000000 0.0000000000 + 2924 0.3234628196 5.6000000000 0.0000000000 + 2925 0.3230434070 5.3999166184 0.0000000000 + 2926 0.3218321660 5.1985055663 0.0000000000 + 2927 0.3234628196 3.8000000000 0.0000000000 + 2928 0.3234628196 3.6000000000 0.0000000000 + 2929 0.3234628196 2.4000000000 0.0000000000 + 2930 0.3212211464 2.8014439036 0.0000000000 + 2931 0.3234628196 2.2000000000 0.0000000000 + 2932 0.3234628196 2.0000000000 0.0000000000 + 2933 0.3234628196 1.6000000000 0.0000000000 + 2934 0.3231605961 2.6000707521 0.0000000000 + 2935 0.3234628196 1.8000000000 0.0000000000 + 2936 0.3212199596 1.3985581521 0.0000000000 + 2937 0.1583567858 9.0969465542 0.0000000000 + 2938 0.1587831074 8.4971151348 0.0000000000 + 2939 0.1598909494 7.0979058016 0.0000000000 + 2940 0.1594325921 4.8977158516 0.0000000000 + 2941 0.1587831074 4.2971151348 0.0000000000 + 2942 0.3235185870 3.4000000000 0.0000000000 + 2943 0.1594656377 1.0977363257 0.0000000000 + 2944 0.1543226600 0.4976101964 0.0000000000 + 2945 0.3166700985 9.3983805880 0.0000000000 + 2946 0.3180524845 8.7962461137 0.0000000000 + 2947 0.3235185870 8.2000000000 0.0000000000 + 2948 0.3235185870 6.8000000000 0.0000000000 + 2949 0.3180524845 4.5962461137 0.0000000000 + 2950 0.3235185870 4.0000000000 0.0000000000 + 2951 0.1598928133 3.1020965728 0.0000000000 + 2952 0.3177061147 0.7965501554 0.0000000000 + 2953 4.5931655629 9.6711312458 0.0000000000 + 2954 8.7738494856 9.6787123552 0.0000000000 + 2955 8.7997069232 0.3264834287 0.0000000000 + 2956 3.5630610750 9.6884637325 0.0000000000 + 2957 2.2012245045 0.3154530704 0.0000000000 + 2958 2.1998688563 9.6764203793 0.0000000000 + 2959 7.4019913508 0.3156321032 0.0000000000 + 2960 7.3994718517 9.6763911639 0.0000000000 + 2961 1.0966344793 0.1532782530 0.0000000000 + 2962 0.8069042227 9.6734364425 0.0000000000 + 2963 6.1130044894 9.8347078994 0.0000000000 + 2964 4.9747976578 0.3232939635 0.0000000000 + 2965 4.9910369139 9.6757785583 0.0000000000 + 2966 6.0092540693 0.3247085544 0.0000000000 + 2967 1.1814436183 9.6749695520 0.0000000000 + 2968 0.9988739813 0.4256870172 0.0000000000 + 2969 6.4178526015 9.6838564787 0.0000000000 + 2970 6.3826924975 0.3280804149 0.0000000000 + 2971 4.7000000000 0.1413507721 0.0000000000 + 2972 8.4203352510 0.3286537863 0.0000000000 + 2973 3.2363238190 0.3290264230 0.0000000000 + 2974 8.5000000000 9.8608953007 0.0000000000 + 2975 2.5757124399 0.3296686789 0.0000000000 + 2976 2.5721984262 9.6674097554 0.0000000000 + 2977 3.3000000000 9.8616253392 0.0000000000 + 2978 7.7697663030 9.6673019104 0.0000000000 + 2979 7.0303211815 0.3312320476 0.0000000000 + 2980 7.1000000000 9.8633682710 0.0000000000 + 2981 7.7729511182 0.3261367510 0.0000000000 + 2982 1.9000000000 9.8639141472 0.0000000000 + 2983 3.9000000000 0.1357175280 0.0000000000 + 2984 5.6405047216 9.6661938590 0.0000000000 + 2985 0.4924909799 0.1320798685 0.0000000000 + 2986 0.4975299991 9.8659932260 0.0000000000 + 2987 9.4943351338 9.8686409491 0.0000000000 + 2988 1.5000000000 0.1336128825 0.0000000000 + 2989 5.3537272517 9.6647689473 0.0000000000 + 2990 6.7011795610 0.1357392823 0.0000000000 + 2991 8.1000000000 0.1333793739 0.0000000000 + 2992 2.8992277722 0.1347714639 0.0000000000 + 2993 1.8279162092 0.3264041913 0.0000000000 + 2994 5.3104416112 0.1344941584 0.0000000000 + 2995 4.2530843006 0.3321332530 0.0000000000 + 2996 1.5482985274 9.6670684429 0.0000000000 + 2997 6.7298294078 9.6641016151 0.0000000000 + 2998 8.0738302253 9.6637760862 0.0000000000 + 2999 2.8826297413 9.6717395990 0.0000000000 + 3000 9.1127325986 0.1371329994 0.0000000000 + 3001 5.7000000000 0.1286838252 0.0000000000 + 3002 9.1041399799 9.8682260063 0.0000000000 + 3003 9.5000000000 0.1237400872 0.0000000000 + 3004 0.9993010160 0.2732539890 0.0000000000 + 3005 9.8535898385 9.8535898385 0.0000000000 + 3006 9.8535898385 0.1464101615 0.0000000000 + 3007 4.0961439680 9.5468382827 0.0000000000 + 3008 0.1374501500 0.1374501500 0.0000000000 + 3009 0.1374501500 9.8625498500 0.0000000000 + 3010 3.4078534221 0.2729056446 0.0000000000 + 3011 8.5919563291 9.7375699375 0.0000000000 + 3012 4.4914934444 9.5410132281 0.0000000000 + 3013 3.3950637714 9.7376402460 0.0000000000 + 3014 4.7893467876 0.2606257139 0.0000000000 + 3015 6.5881456883 9.7239800064 0.0000000000 +End Nodes + + +Begin Elements UPwSmallStrainElement2D3N + 156 1 1757 2721 220 + 157 1 2883 2998 1843 + 158 1 230 2825 2224 + 159 1 49 1885 229 + 160 1 228 2998 2883 + 161 1 2882 2999 1755 + 162 1 242 2887 1740 + 163 1 221 1797 1772 + 164 1 2825 2996 2224 + 165 1 204 2692 2094 + 166 1 1984 2762 2264 + 167 1 211 1774 1773 + 168 1 1740 2995 242 + 169 1 215 2999 2882 + 170 1 234 1795 162 + 171 1 220 2980 1757 + 172 1 2276 2669 1735 + 173 1 2052 2892 239 + 174 1 207 2175 1751 + 175 1 1751 2894 207 + 176 1 30 1794 201 + 177 1 216 2237 1761 + 178 1 268 2128 1758 + 179 1 221 2982 1797 + 180 1 2692 2989 2094 + 181 1 264 2252 1983 + 182 1 257 2261 1759 + 183 1 1768 2357 229 + 184 1 208 2236 1766 + 185 1 2070 2370 1593 + 186 1 1864 1865 250 + 187 1 247 1790 1770 + 188 1 1729 2392 2391 + 189 1 211 2983 1774 + 190 1 239 2984 2052 + 191 1 212 2963 1762 + 192 1 1783 1784 274 + 193 1 1789 2421 1796 + 194 1 244 1778 1777 + 195 1 1585 2669 2276 + 196 1 1885 2955 229 + 197 1 1765 1874 261 + 198 1 2264 2762 1895 + 199 1 50 1885 49 + 200 1 1761 2979 216 + 201 1 263 1822 1821 + 202 1 1865 2985 250 + 203 1 247 2986 1790 + 204 1 1758 2978 268 + 205 1 162 1795 161 + 206 1 265 2218 21 + 207 1 2264 2957 1984 + 208 1 31 1794 30 + 209 1 234 2954 1795 + 210 1 2252 2975 1983 + 211 1 1759 2976 257 + 212 1 219 2217 1776 + 213 1 1789 3001 2421 + 214 1 2391 2953 1729 + 215 1 223 1821 1820 + 216 1 1768 2972 2357 + 217 1 274 2987 1783 + 218 1 2236 2970 1766 + 219 1 1762 2969 212 + 220 1 1794 2964 201 + 221 1 1773 1775 211 + 222 1 1735 2959 2276 + 223 1 1593 2967 2070 + 224 1 21 2218 20 + 225 1 280 2884 2343 + 226 1 216 1785 40 + 227 1 250 1866 1864 + 228 1 1762 2963 1764 + 229 1 1754 2999 2176 + 230 1 40 1785 39 + 231 1 14 1786 13 + 232 1 1670 2894 1751 + 233 1 1781 1783 248 + 234 1 227 1786 14 + 235 1 1777 1779 244 + 236 1 1839 2998 2073 + 237 1 244 2988 1778 + 238 1 1729 2965 2392 + 239 1 2892 2963 176 + 240 1 240 1788 1787 + 241 1 2370 2962 1593 + 242 1 2188 2997 1752 + 243 1 1865 1867 277 + 244 1 276 1791 1790 + 245 1 245 1887 1886 + 246 1 240 1789 1788 + 247 1 229 2955 1768 + 248 1 261 2990 1765 + 249 1 252 2996 2713 + 250 1 245 1886 1884 + 251 1 1766 2966 208 + 252 1 1377 1888 281 + 253 1 1764 2892 2052 + 254 1 248 1793 1781 + 255 1 2199 2995 2511 + 256 1 2199 2511 1774 + 257 1 1821 2991 263 + 258 1 1740 2887 1744 + 259 1 252 2713 1797 + 260 1 2896 2913 105 + 261 1 1983 2957 264 + 262 1 2261 2958 1759 + 263 1 1844 2883 1843 + 264 1 2176 2999 215 + 265 1 1756 2882 1755 + 266 1 1757 2188 1752 + 267 1 2411 2989 2177 + 268 1 1888 2884 280 + 269 1 1784 2888 274 + 270 1 2128 2960 1758 + 271 1 2073 2998 228 + 272 1 2177 2984 2411 + 273 1 2237 2959 1761 + 274 1 2721 2960 220 + 275 1 219 2992 2217 + 276 1 1764 2963 2892 + 277 1 1772 2958 221 + 278 1 269 2997 2188 + 279 1 1886 1888 1377 + 280 1 281 1888 280 + 281 1 1102 2640 1792 + 282 1 1767 2881 1796 + 283 1 223 2991 1821 + 284 1 2175 2956 1751 + 285 1 2343 2884 275 + 286 1 265 2973 2218 + 287 1 2224 2996 252 + 288 1 2073 2978 1839 + 289 1 1887 2885 2884 + 290 1 1796 2881 1792 + 291 1 1776 2975 219 + 292 1 2176 2976 1754 + 293 1 1866 2968 2890 + 294 1 263 2972 1822 + 295 1 1770 2962 247 + 296 1 204 2965 2692 + 297 1 1820 2981 223 + 298 1 242 2995 2199 + 299 1 1874 2970 261 + 300 1 54 2885 53 + 301 1 230 2967 2825 + 302 1 1792 2640 1788 + 303 1 1781 1793 1621 + 304 1 1621 1793 1624 + 305 1 1791 2913 2896 + 306 1 1789 1792 1788 + 307 1 1887 1888 1886 + 308 1 1792 2881 1102 + 309 1 1793 1795 1624 + 310 1 2000 2926 2909 + 311 1 2902 2930 2722 + 312 1 2112 2918 2906 + 313 1 2814 2936 2910 + 314 1 137 2951 2908 + 315 1 1862 2952 2911 + 316 1 2113 2945 2904 + 317 1 1916 2946 2905 + 318 1 1834 2949 2907 + 319 1 2903 2943 148 + 320 1 2900 2940 129 + 321 1 2898 2938 111 + 322 1 2899 2939 118 + 323 1 2901 2941 132 + 324 1 2897 2937 108 + 325 1 2094 2989 2411 + 326 1 1867 2912 277 + 327 1 276 2913 1791 + 328 1 1729 2953 1730 + 329 1 1789 1796 1792 + 330 1 2890 2968 1357 + 331 1 1555 2914 2893 + 332 1 1783 2987 248 + 333 1 1777 2886 1779 + 334 1 216 2979 1785 + 335 1 1883 1886 1377 + 336 1 303 1801 301 + 337 1 299 1809 297 + 338 1 612 1800 1798 + 339 1 1883 2522 1881 + 340 1 952 2364 1972 + 341 1 952 1972 1803 + 342 1 1377 2522 1883 + 343 1 81 2873 2853 + 344 1 1881 2522 1100 + 345 1 2469 2802 1636 + 346 1 1973 2364 682 + 347 1 1972 2364 1973 + 348 1 1935 2809 1932 + 349 1 612 1809 299 + 350 1 941 2129 1806 + 351 1 2390 2564 1974 + 352 1 311 1934 309 + 353 1 1798 1809 612 + 354 1 303 2715 1801 + 355 1 1880 1881 1100 + 356 1 519 2469 1931 + 357 1 1805 2429 941 + 358 1 317 1811 315 + 359 1 941 1806 1805 + 360 1 519 1934 311 + 361 1 519 2802 2469 + 362 1 289 1996 287 + 363 1 301 1801 612 + 364 1 1806 2129 1808 + 365 1 1931 1934 519 + 366 1 1804 1811 468 + 367 1 1389 2800 1817 + 368 1 1809 2776 297 + 369 1 468 1811 317 + 370 1 1935 2488 552 + 371 1 1808 2366 1826 + 372 1 2129 2374 1808 + 373 1 1808 2374 2366 + 374 1 1617 2807 1533 + 375 1 1826 2366 778 + 376 1 612 1801 1800 + 377 1 866 1829 1827 + 378 1 552 2809 1935 + 379 1 286 2486 288 + 380 1 866 1830 1829 + 381 1 2716 2727 746 + 382 1 1801 2715 1802 + 383 1 1802 2715 2488 + 384 1 1803 1996 952 + 385 1 842 2761 840 + 386 1 468 2002 1804 + 387 1 1451 2337 1417 + 388 1 2099 2481 1812 + 389 1 682 2390 1973 + 390 1 2002 2429 1805 + 391 1 772 2481 2099 + 392 1 305 2715 303 + 393 1 1817 2800 1575 + 394 1 1100 1996 1880 + 395 1 1834 2807 1617 + 396 1 1315 1984 1982 + 397 1 2182 2830 2755 + 398 1 1810 2481 772 + 399 1 583 2099 1812 + 400 1 1536 2360 2002 + 401 1 1451 2707 2337 + 402 1 1637 2337 2336 + 403 1 1799 2564 2390 + 404 1 1446 2413 2379 + 405 1 2201 2824 2818 + 406 1 2813 2827 1832 + 407 1 443 2744 440 + 408 1 2037 2810 1528 + 409 1 1417 2337 1637 + 410 1 1832 2827 1829 + 411 1 1841 1843 1840 + 412 1 297 2776 295 + 413 1 952 1996 289 + 414 1 287 1996 1100 + 415 1 838 1913 867 + 416 1 304 1956 409 + 417 1 300 2779 302 + 418 1 846 1830 844 + 419 1 1256 1840 1838 + 420 1 1711 2596 1982 + 421 1 1402 2753 2473 + 422 1 1988 2707 1451 + 423 1 1142 2794 1255 + 424 1 2659 2753 1402 + 425 1 2712 2812 1279 + 426 1 1384 2547 1853 + 427 1 1243 1841 1106 + 428 1 1989 2014 1414 + 429 1 316 1836 318 + 430 1 867 1913 1849 + 431 1 1928 2687 2142 + 432 1 2297 2362 1519 + 433 1 1973 2390 1974 + 434 1 1812 1813 583 + 435 1 409 1956 1955 + 436 1 1780 1895 1894 + 437 1 2488 2715 552 + 438 1 258 2824 2201 + 439 1 840 2761 1913 + 440 1 844 1830 866 + 441 1 1646 1868 1772 + 442 1 1830 1832 1829 + 443 1 1838 1848 1256 + 444 1 1813 2277 583 + 445 1 2483 2611 368 + 446 1 1982 2596 1315 + 447 1 1893 2560 1467 + 448 1 811 2001 1879 + 449 1 1446 2014 1989 + 450 1 1925 2534 1926 + 451 1 1823 2560 1893 + 452 1 1224 2665 2486 + 453 1 2298 2362 2297 + 454 1 443 2534 1925 + 455 1 840 1913 838 + 456 1 1556 2082 2081 + 457 1 1937 2415 1069 + 458 1 1446 2379 2014 + 459 1 1910 1926 1426 + 460 1 1451 2503 1988 + 461 1 1848 1999 1657 + 462 1 1022 2362 2298 + 463 1 1422 1878 1271 + 464 1 2441 2749 1467 + 465 1 1853 2547 1669 + 466 1 1925 1926 1910 + 467 1 1957 2415 1937 + 468 1 1536 2002 1805 + 469 1 288 2486 772 + 470 1 1851 2349 2278 + 471 1 2035 2596 1711 + 472 1 1629 1846 1824 + 473 1 1399 1894 1110 + 474 1 1543 2797 2754 + 475 1 1273 1878 1877 + 476 1 549 1835 1825 + 477 1 1155 1965 1847 + 478 1 1311 2762 1312 + 479 1 2379 2413 720 + 480 1 2278 2349 1173 + 481 1 1651 1999 1848 + 482 1 1932 2809 1934 + 483 1 1636 2802 1811 + 484 1 1559 2804 1819 + 485 1 1255 2035 1711 + 486 1 302 1956 304 + 487 1 1992 2665 1224 + 488 1 1256 1841 1840 + 489 1 1918 2688 2557 + 490 1 772 2486 1810 + 491 1 1343 1970 1969 + 492 1 1799 2776 1809 + 493 1 385 2145 1851 + 494 1 1851 2278 385 + 495 1 2265 2277 1815 + 496 1 2363 2371 2295 + 497 1 1723 2665 1992 + 498 1 1852 1873 1061 + 499 1 2388 2850 2832 + 500 1 2417 2658 1455 + 501 1 983 2321 2198 + 502 1 1849 1914 867 + 503 1 1814 2763 1816 + 504 1 1597 1822 1600 + 505 1 1988 2503 2109 + 506 1 1090 1912 1269 + 507 1 1115 2627 1117 + 508 1 1819 2727 1559 + 509 1 1315 2762 1984 + 510 1 1925 2744 443 + 511 1 1824 1846 1365 + 512 1 1743 1875 1644 + 513 1 561 2560 1823 + 514 1 2280 2684 2652 + 515 1 1815 2277 1813 + 516 1 520 2581 1859 + 517 1 1061 1990 1852 + 518 1 2336 2727 1637 + 519 1 1845 2504 368 + 520 1 1820 1821 1596 + 521 1 2002 2360 1804 + 522 1 1373 1820 1596 + 523 1 1496 2007 1962 + 524 1 1646 1954 1868 + 525 1 1651 1848 1838 + 526 1 2390 2776 1799 + 527 1 1647 1873 1852 + 528 1 1277 1909 1278 + 529 1 1860 1990 1616 + 530 1 2526 2675 1938 + 531 1 1846 1965 1365 + 532 1 1875 2165 1644 + 533 1 1837 1857 557 + 534 1 998 2415 1957 + 535 1 1277 1958 1909 + 536 1 1473 1876 1476 + 537 1 1879 2001 1878 + 538 1 982 2817 2793 + 539 1 1705 2810 2037 + 540 1 1106 1841 1256 + 541 1 1273 1877 1876 + 542 1 385 2221 2145 + 543 1 1584 2487 2039 + 544 1 725 2675 2526 + 545 1 2501 2582 2001 + 546 1 368 2611 1845 + 547 1 810 2299 1855 + 548 1 1243 1842 1841 + 549 1 1343 1969 1968 + 550 1 1690 1857 1837 + 551 1 302 2779 1956 + 552 1 1823 1837 561 + 553 1 1556 2081 1409 + 554 1 974 2214 1065 + 555 1 1825 2080 549 + 556 1 1271 1878 1273 + 557 1 318 1836 549 + 558 1 1880 1996 1803 + 559 1 1847 1966 1155 + 560 1 994 2732 2496 + 561 1 1780 1894 1399 + 562 1 746 2727 2336 + 563 1 1025 2749 2441 + 564 1 1592 2703 2643 + 565 1 87 2866 2860 + 566 1 1473 1909 1876 + 567 1 1816 2763 2552 + 568 1 1255 2794 2035 + 569 1 1455 2428 2196 + 570 1 1857 1858 557 + 571 1 1448 2585 2040 + 572 1 1224 2486 286 + 573 1 1598 1974 1374 + 574 1 1906 2230 691 + 575 1 1927 2091 1928 + 576 1 75 2852 2839 + 577 1 1166 2728 2630 + 578 1 1269 1912 1393 + 579 1 1426 2231 1910 + 580 1 1742 2575 1738 + 581 1 2030 2510 2031 + 582 1 1889 2299 347 + 583 1 363 2363 1850 + 584 1 468 2429 2002 + 585 1 810 1855 1854 + 586 1 1854 2221 810 + 587 1 923 1947 927 + 588 1 1400 2385 1402 + 589 1 1535 2804 1559 + 590 1 1538 2350 2349 + 591 1 1845 2733 2504 + 592 1 1872 2468 2076 + 593 1 1937 2395 1936 + 594 1 872 2091 1927 + 595 1 1500 2699 1501 + 596 1 2145 2221 1854 + 597 1 1855 2299 1889 + 598 1 846 1831 1830 + 599 1 1231 2028 2027 + 600 1 1374 1974 1265 + 601 1 1586 1874 1382 + 602 1 2808 2811 1718 + 603 1 1478 2544 2541 + 604 1 2617 2649 1622 + 605 1 1920 2112 1967 + 606 1 320 2080 322 + 607 1 1941 2228 631 + 608 1 1167 2367 1959 + 609 1 1422 1879 1878 + 610 1 1559 2727 2716 + 611 1 1110 1894 1111 + 612 1 720 2468 1871 + 613 1 1519 2363 2297 + 614 1 1368 2069 2067 + 615 1 1833 2712 439 + 616 1 1343 2608 1970 + 617 1 1369 2066 1628 + 618 1 1896 2485 635 + 619 1 998 1957 1929 + 620 1 1847 1965 1846 + 621 1 2653 2752 869 + 622 1 2349 2350 1173 + 623 1 1353 2487 1584 + 624 1 1245 2703 1592 + 625 1 2500 2550 1331 + 626 1 1347 1985 1565 + 627 1 983 2198 1975 + 628 1 1368 2067 2066 + 629 1 2174 2524 2173 + 630 1 2466 2524 2174 + 631 1 1649 1907 1247 + 632 1 1107 1848 1657 + 633 1 2198 2321 1631 + 634 1 1644 2165 2108 + 635 1 1870 1954 1646 + 636 1 2652 2684 1556 + 637 1 2581 2734 1859 + 638 1 1069 2395 1937 + 639 1 1304 2739 2479 + 640 1 1801 1802 1800 + 641 1 1450 2585 1448 + 642 1 1103 2378 1403 + 643 1 2233 2689 1432 + 644 1 1642 2521 1861 + 645 1 1939 2074 489 + 646 1 1655 2567 2060 + 647 1 1533 2807 2037 + 648 1 1917 2688 1918 + 649 1 552 2715 305 + 650 1 1934 2809 309 + 651 1 1811 2802 315 + 652 1 347 1891 1889 + 653 1 1850 2523 363 + 654 1 549 1836 1835 + 655 1 796 2477 2173 + 656 1 2173 2524 796 + 657 1 827 2053 825 + 658 1 934 1899 1897 + 659 1 2298 2548 1022 + 660 1 2759 2806 1112 + 661 1 1278 1909 1473 + 662 1 1513 2731 2306 + 663 1 1553 2644 2280 + 664 1 1568 2626 1994 + 665 1 2043 2160 1650 + 666 1 1871 2468 1872 + 667 1 2091 2687 1928 + 668 1 2489 2558 1997 + 669 1 2059 2773 2058 + 670 1 2297 2363 2295 + 671 1 1853 2609 1384 + 672 1 1992 2755 1723 + 673 1 2132 2449 1953 + 674 1 1664 2485 1896 + 675 1 2477 2523 1850 + 676 1 1718 2811 639 + 677 1 2835 2840 1725 + 678 1 407 2132 1953 + 679 1 1915 2316 834 + 680 1 1788 2640 1620 + 681 1 2047 2229 1419 + 682 1 1647 2632 1873 + 683 1 1645 2230 1906 + 684 1 927 1947 1044 + 685 1 1436 2328 1960 + 686 1 1467 2749 1893 + 687 1 1682 2664 1978 + 688 1 1852 1990 1860 + 689 1 2060 2588 1655 + 690 1 409 2582 2501 + 691 1 1614 2661 1238 + 692 1 1938 2787 1333 + 693 1 2437 2747 1720 + 694 1 2557 2688 1122 + 695 1 1947 2625 1948 + 696 1 1415 1958 1277 + 697 1 1025 2441 2440 + 698 1 316 2504 1836 + 699 1 1753 1980 1450 + 700 1 2139 2717 1709 + 701 1 439 2744 1833 + 702 1 2052 2539 1380 + 703 1 489 2074 476 + 704 1 1434 2011 2010 + 705 1 1929 1976 998 + 706 1 2589 2723 1168 + 707 1 1666 2461 2118 + 708 1 1067 2214 974 + 709 1 1959 2328 1167 + 710 1 1257 2617 1622 + 711 1 1547 2576 2507 + 712 1 2142 2687 1501 + 713 1 2817 2826 1717 + 714 1 836 1915 834 + 715 1 1174 2758 2563 + 716 1 1295 2268 2042 + 717 1 796 2523 2477 + 718 1 2643 2703 1008 + 719 1 1060 1990 1061 + 720 1 986 2069 1064 + 721 1 1906 2459 1645 + 722 1 1656 2431 2230 + 723 1 1690 1837 1823 + 724 1 1095 2487 1353 + 725 1 1966 2570 1155 + 726 1 1304 2601 993 + 727 1 2334 2476 1397 + 728 1 1645 2231 1426 + 729 1 1538 2513 2350 + 730 1 1596 1822 1597 + 731 1 2496 2732 1707 + 732 1 2046 2229 2047 + 733 1 346 2300 344 + 734 1 1961 1962 585 + 735 1 1227 2126 1573 + 736 1 1455 2658 2428 + 737 1 440 2744 439 + 738 1 1871 2379 720 + 739 1 834 2316 832 + 740 1 1946 2038 1096 + 741 1 1153 1965 1155 + 742 1 1206 1999 1651 + 743 1 2479 2601 1304 + 744 1 1959 2367 1958 + 745 1 2448 2685 2574 + 746 1 907 2098 1870 + 747 1 1904 1905 1309 + 748 1 1432 2007 1496 + 749 1 1985 1986 1565 + 750 1 480 2195 478 + 751 1 1858 2284 557 + 752 1 1974 2564 1265 + 753 1 1540 2117 1577 + 754 1 489 2194 1939 + 755 1 508 2012 534 + 756 1 1434 2053 2011 + 757 1 1539 2674 2561 + 758 1 1656 2376 2009 + 759 1 1833 2812 2712 + 760 1 1944 2034 2033 + 761 1 2507 2576 2506 + 762 1 363 2371 2363 + 763 1 2087 2102 1445 + 764 1 407 1953 1952 + 765 1 1952 2266 407 + 766 1 1955 2582 409 + 767 1 883 2053 827 + 768 1 2064 2097 868 + 769 1 1897 2300 934 + 770 1 1087 1968 1350 + 771 1 1090 2318 1912 + 772 1 2040 2585 1192 + 773 1 1615 1989 1414 + 774 1 1920 1967 1429 + 775 1 1516 2528 1987 + 776 1 2280 2652 1553 + 777 1 1556 2684 2082 + 778 1 1879 2611 2483 + 779 1 1948 2625 2164 + 780 1 1960 2328 1959 + 781 1 2559 2586 2059 + 782 1 2768 2770 2304 + 783 1 973 1950 759 + 784 1 1092 2026 1351 + 785 1 1914 1915 867 + 786 1 2023 2339 948 + 787 1 1046 2033 1307 + 788 1 1230 1911 1053 + 789 1 1580 2532 1356 + 790 1 1638 2800 1389 + 791 1 1914 2036 1412 + 792 1 1412 2342 1914 + 793 1 631 2467 1941 + 794 1 1397 2559 2334 + 795 1 2230 2431 691 + 796 1 1406 2140 1235 + 797 1 1368 2066 1369 + 798 1 322 2080 1165 + 799 1 1254 2215 1370 + 800 1 1899 2130 1901 + 801 1 2253 2512 2146 + 802 1 354 2250 352 + 803 1 981 2013 982 + 804 1 1125 2013 981 + 805 1 1276 2627 1115 + 806 1 1024 2485 1922 + 807 1 1987 2528 1172 + 808 1 1924 2627 1276 + 809 1 1900 2517 1903 + 810 1 1281 2114 1964 + 811 1 1523 2626 1568 + 812 1 1876 1877 1476 + 813 1 1350 1968 1574 + 814 1 1981 2461 1666 + 815 1 143 2187 224 + 816 1 923 2625 1947 + 817 1 1381 2215 1254 + 818 1 1403 2378 1870 + 819 1 2334 2513 2476 + 820 1 635 2628 1896 + 821 1 954 2626 2467 + 822 1 1907 1908 1247 + 823 1 1397 2586 2559 + 824 1 2232 2572 1502 + 825 1 1645 2459 2231 + 826 1 2009 2431 1656 + 827 1 1896 2628 2482 + 828 1 1424 2376 1656 + 829 1 2196 2428 2195 + 830 1 2228 2464 631 + 831 1 778 2805 1826 + 832 1 1331 2550 1217 + 833 1 1310 1904 1309 + 834 1 1432 2689 2007 + 835 1 1662 2770 2768 + 836 1 1940 2228 1941 + 837 1 2467 2626 1941 + 838 1 2680 2702 637 + 839 1 1412 2036 1129 + 840 1 1501 2699 2142 + 841 1 2160 2161 1650 + 842 1 2024 2742 2738 + 843 1 2569 2598 2048 + 844 1 98 2344 97 + 845 1 804 2105 1281 + 846 1 1963 2575 1742 + 847 1 1257 1621 1358 + 848 1 312 2483 368 + 849 1 476 2074 474 + 850 1 509 2012 508 + 851 1 1155 2570 1151 + 852 1 1409 2081 1825 + 853 1 1962 2007 585 + 854 1 1644 2108 1109 + 855 1 1382 1874 1383 + 856 1 2783 2790 2021 + 857 1 566 2046 814 + 858 1 1024 2658 2417 + 859 1 1056 2544 1478 + 860 1 2098 2407 1489 + 861 1 1628 2066 1847 + 862 1 2064 2444 2092 + 863 1 2648 2690 2232 + 864 1 1949 2118 624 + 865 1 1349 1985 1347 + 866 1 1043 2618 928 + 867 1 1121 2030 1119 + 868 1 1352 2117 1540 + 869 1 1650 2385 1400 + 870 1 2385 2659 1402 + 871 1 2101 2427 2103 + 872 1 144 2187 143 + 873 1 607 2078 1421 + 874 1 1964 2114 1858 + 875 1 1870 2098 1954 + 876 1 2769 2789 2383 + 877 1 771 2161 737 + 878 1 1065 2214 1398 + 879 1 1089 1968 1087 + 880 1 1869 1989 1615 + 881 1 2754 2797 1948 + 882 1 846 2706 1831 + 883 1 2033 2034 1307 + 884 1 2386 2673 1946 + 885 1 1997 2558 795 + 886 1 2003 2257 1439 + 887 1 2032 2332 1673 + 888 1 1782 1784 1783 + 889 1 1048 2033 1046 + 890 1 1047 2125 1049 + 891 1 1753 2724 1980 + 892 1 2217 2218 2216 + 893 1 1702 2748 2719 + 894 1 2088 2459 695 + 895 1 737 2161 739 + 896 1 866 2761 842 + 897 1 1967 2521 1429 + 898 1 1914 2342 1915 + 899 1 2288 2638 676 + 900 1 934 2130 1899 + 901 1 1064 2069 1368 + 902 1 520 2779 300 + 903 1 549 2080 320 + 904 1 352 2250 2130 + 905 1 579 2301 1951 + 906 1 622 2741 2566 + 907 1 998 1976 774 + 908 1 1192 2262 2040 + 909 1 1980 2585 1450 + 910 1 2446 2475 1513 + 911 1 2476 2513 1538 + 912 1 2439 2440 1667 + 913 1 1667 2633 2439 + 914 1 1835 2733 2235 + 915 1 2504 2733 1836 + 916 1 2001 2582 1877 + 917 1 1928 2142 2141 + 918 1 2158 2393 2159 + 919 1 2210 2212 1139 + 920 1 1177 1971 1180 + 921 1 1325 2695 1692 + 922 1 1716 2725 1715 + 923 1 2815 2823 1719 + 924 1 1970 2608 1724 + 925 1 2834 2835 1726 + 926 1 1861 2521 1967 + 927 1 763 2162 756 + 928 1 1978 2664 1169 + 929 1 2457 2691 1903 + 930 1 2049 2565 2050 + 931 1 693 2572 2232 + 932 1 1927 2705 872 + 933 1 2108 2165 1071 + 934 1 1344 2006 1198 + 935 1 1905 2697 1309 + 936 1 1692 2339 2023 + 937 1 1739 2539 2052 + 938 1 2024 2622 2592 + 939 1 2612 2714 2348 + 940 1 1976 2202 774 + 941 1 1870 2378 907 + 942 1 1238 2661 1057 + 943 1 1967 2112 1246 + 944 1 1738 2575 1548 + 945 1 1679 2444 2064 + 946 1 1035 2272 956 + 947 1 1433 2465 2226 + 948 1 1491 2098 1489 + 949 1 1554 2644 1553 + 950 1 1973 1974 1598 + 951 1 534 2012 773 + 952 1 603 2578 601 + 953 1 937 2332 2032 + 954 1 2553 2704 977 + 955 1 1942 2033 1048 + 956 1 1129 2036 1131 + 957 1 2034 2619 1307 + 958 1 730 2495 1490 + 959 1 1464 2471 944 + 960 1 1561 2475 2446 + 961 1 1922 2485 1664 + 962 1 1878 2001 1877 + 963 1 347 2300 1891 + 964 1 2046 2047 814 + 965 1 1960 2568 1436 + 966 1 1531 2000 1610 + 967 1 1993 1994 954 + 968 1 530 2225 517 + 969 1 648 2225 530 + 970 1 600 2455 638 + 971 1 2352 2398 1029 + 972 1 1241 1990 1060 + 973 1 1351 2026 1583 + 974 1 2050 2565 2103 + 975 1 907 2407 2098 + 976 1 1134 2234 1638 + 977 1 1613 2065 1367 + 978 1 1971 2689 2233 + 979 1 474 2629 472 + 980 1 1871 1872 1659 + 981 1 2448 2574 278 + 982 1 624 2119 1949 + 983 1 1301 2546 1302 + 984 1 1895 2762 1311 + 985 1 1622 1782 1781 + 986 1 1734 2649 2617 + 987 1 2291 2427 2101 + 988 1 1156 1965 1153 + 989 1 145 2223 254 + 990 1 1367 2065 1366 + 991 1 2440 2441 1667 + 992 1 1975 2554 2022 + 993 1 2068 2598 2569 + 994 1 47 2357 263 + 995 1 1821 1822 1596 + 996 1 1901 2654 2517 + 997 1 278 279 251 + 998 1 1006 2162 763 + 999 1 1666 2118 1977 + 1000 1 2047 2549 2048 + 1001 1 744 2043 747 + 1002 1 2115 2284 1858 + 1003 1 2226 2465 2225 + 1004 1 2050 2105 803 + 1005 1 1231 2027 2026 + 1006 1 1847 2066 1966 + 1007 1 2358 2393 2158 + 1008 1 97 2344 253 + 1009 1 99 2072 233 + 1010 1 198 2224 252 + 1011 1 357 2250 354 + 1012 1 512 2571 2104 + 1013 1 1200 2233 1432 + 1014 1 1421 2078 2077 + 1015 1 2010 2508 1434 + 1016 1 1977 2118 1517 + 1017 1 1857 1964 1858 + 1018 1 2719 2748 2134 + 1019 1 2203 2464 2228 + 1020 1 95 2377 225 + 1021 1 599 1993 954 + 1022 1 2115 2427 1075 + 1023 1 1096 2487 1095 + 1024 1 1182 1184 1183 + 1025 1 2755 2830 1723 + 1026 1 2012 2508 2010 + 1027 1 2210 2345 2208 + 1028 1 653 2372 656 + 1029 1 692 1906 691 + 1030 1 2042 2268 2041 + 1031 1 2280 2644 2279 + 1032 1 2296 2789 2769 + 1033 1 2864 2869 238 + 1034 1 1257 1358 1054 + 1035 1 1056 1478 1355 + 1036 1 2488 2806 1802 + 1037 1 1842 1843 1841 + 1038 1 2347 2351 1998 + 1039 1 1301 1302 990 + 1040 1 1921 2386 1122 + 1041 1 1509 2728 1166 + 1042 1 1862 1863 1371 + 1043 1 1691 2678 2672 + 1044 1 1742 2659 1963 + 1045 1 686 2078 640 + 1046 1 767 2696 2607 + 1047 1 1631 2321 1250 + 1048 1 2541 2544 1487 + 1049 1 2074 2629 474 + 1050 1 759 1950 989 + 1051 1 992 1106 993 + 1052 1 1073 2109 1114 + 1053 1 1452 2347 1998 + 1054 1 831 2089 833 + 1055 1 1114 2109 1550 + 1056 1 1487 2693 2494 + 1057 1 1868 1954 1493 + 1058 1 1831 1832 1830 + 1059 1 2130 2250 1901 + 1060 1 2092 2097 2064 + 1061 1 146 2223 145 + 1062 1 2265 2581 520 + 1063 1 547 2046 566 + 1064 1 572 620 607 + 1065 1 1411 2204 1164 + 1066 1 1206 1651 1376 + 1067 1 2206 2497 2205 + 1068 1 48 2357 47 + 1069 1 1100 2522 285 + 1070 1 2239 2353 514 + 1071 1 665 666 619 + 1072 1 1109 2108 987 + 1073 1 2475 2731 1513 + 1074 1 2482 2628 1924 + 1075 1 2023 2622 2024 + 1076 1 2039 2487 2038 + 1077 1 2729 2746 2162 + 1078 1 642 2120 717 + 1079 1 971 1096 1095 + 1080 1 1971 2233 1180 + 1081 1 1268 2453 1653 + 1082 1 1649 2554 1975 + 1083 1 2103 2116 2050 + 1084 1 280 2343 251 + 1085 1 618 664 663 + 1086 1 664 703 702 + 1087 1 676 2638 2583 + 1088 1 703 971 970 + 1089 1 825 2053 1434 + 1090 1 1117 2627 1861 + 1091 1 1998 2332 1452 + 1092 1 1994 2563 1568 + 1093 1 2680 2697 1905 + 1094 1 557 2284 532 + 1095 1 586 1961 582 + 1096 1 685 686 640 + 1097 1 1095 1211 970 + 1098 1 1080 2677 2454 + 1099 1 1543 2499 1088 + 1100 1 1940 1941 1523 + 1101 1 2552 2734 1816 + 1102 1 278 2574 279 + 1103 1 338 2221 336 + 1104 1 339 798 341 + 1105 1 417 2213 406 + 1106 1 537 2406 563 + 1107 1 2153 2335 567 + 1108 1 671 2647 2249 + 1109 1 1439 2257 715 + 1110 1 759 760 735 + 1111 1 1223 2308 957 + 1112 1 1256 1848 1107 + 1113 1 2212 2281 1139 + 1114 1 1272 2107 1443 + 1115 1 1373 1596 1374 + 1116 1 1484 2287 1486 + 1117 1 2605 2644 1554 + 1118 1 1675 2752 2653 + 1119 1 1692 2695 2339 + 1120 1 1944 2612 2034 + 1121 1 1997 2266 1952 + 1122 1 2630 2728 2011 + 1123 1 2067 2647 2068 + 1124 1 2249 2647 2069 + 1125 1 58 278 251 + 1126 1 295 2776 682 + 1127 1 760 1025 735 + 1128 1 861 2051 862 + 1129 1 956 1213 955 + 1130 1 1093 2026 1092 + 1131 1 2215 2216 1370 + 1132 1 1390 2481 1391 + 1133 1 1402 2473 1401 + 1134 1 1466 2441 1467 + 1135 1 1490 1491 1489 + 1136 1 1751 1853 1669 + 1137 1 2138 2139 1709 + 1138 1 2227 2228 1940 + 1139 1 2166 2170 2169 + 1140 1 376 380 379 + 1141 1 545 2087 1445 + 1142 1 620 2418 675 + 1143 1 1050 1942 1048 + 1144 1 1251 2013 1125 + 1145 1 1336 2274 1313 + 1146 1 1384 2609 1385 + 1147 1 1427 2376 1424 + 1148 1 1917 2728 1509 + 1149 1 1552 2038 1946 + 1150 1 1972 1973 1598 + 1151 1 1678 2325 2286 + 1152 1 1697 2603 2593 + 1153 1 2602 2614 1698 + 1154 1 1802 2759 1800 + 1155 1 1921 2673 2386 + 1156 1 2215 2217 2216 + 1157 1 582 1961 585 + 1158 1 634 2054 1297 + 1159 1 1225 1718 639 + 1160 1 703 1122 971 + 1161 1 756 2162 1076 + 1162 1 2439 2633 758 + 1163 1 1195 2801 2766 + 1164 1 1590 1725 1349 + 1165 1 1440 2459 2088 + 1166 1 71 2844 258 + 1167 1 628 2137 673 + 1168 1 655 2372 653 + 1169 1 1513 2306 1038 + 1170 1 1391 1394 1392 + 1171 1 466 2041 470 + 1172 1 509 2508 2012 + 1173 1 1221 2197 649 + 1174 1 803 2105 804 + 1175 1 885 2630 883 + 1176 1 890 2403 1686 + 1177 1 1269 1270 1091 + 1178 1 1091 2608 1343 + 1179 1 1351 1352 1094 + 1180 1 1352 1539 1094 + 1181 1 1426 1926 1292 + 1182 1 1812 2481 1390 + 1183 1 1550 1640 1441 + 1184 1 1474 1955 1641 + 1185 1 1968 1969 1574 + 1186 1 2083 2412 2282 + 1187 1 2442 2835 2834 + 1188 1 494 2119 624 + 1189 1 1859 2779 520 + 1190 1 533 1981 578 + 1191 1 559 2406 537 + 1192 1 2118 2461 624 + 1193 1 2063 2064 868 + 1194 1 997 2543 1008 + 1195 1 1499 2489 1997 + 1196 1 1165 2709 324 + 1197 1 344 2300 347 + 1198 1 462 2451 495 + 1199 1 492 2119 494 + 1200 1 567 2335 502 + 1201 1 2437 2656 542 + 1202 1 1951 2512 579 + 1203 1 604 2021 1713 + 1204 1 613 2180 1123 + 1205 1 2358 2438 622 + 1206 1 721 2022 674 + 1207 1 733 2442 687 + 1208 1 2156 2159 716 + 1209 1 734 759 735 + 1210 1 1025 2440 735 + 1211 1 747 2043 766 + 1212 1 774 2202 754 + 1213 1 2085 2181 809 + 1214 1 829 830 828 + 1215 1 833 834 832 + 1216 1 882 2092 884 + 1217 1 888 969 968 + 1218 1 2092 2444 888 + 1219 1 1436 2568 912 + 1220 1 914 916 915 + 1221 1 916 2625 923 + 1222 1 921 922 920 + 1223 1 929 930 926 + 1224 1 1278 1471 953 + 1225 1 967 1089 1087 + 1226 1 969 1093 1092 + 1227 1 1328 2272 1035 + 1228 1 1084 1332 1290 + 1229 1 1514 1543 1088 + 1230 1 1136 1981 1666 + 1231 1 2181 2718 1143 + 1232 1 2143 2460 1185 + 1233 1 1188 1190 1189 + 1234 1 1213 2272 1468 + 1235 1 1571 2389 1226 + 1236 1 1298 2257 2003 + 1237 1 2672 2678 1302 + 1238 1 1415 1959 1958 + 1239 1 1454 2426 2271 + 1240 1 1471 2551 2474 + 1241 1 1570 2587 1514 + 1242 1 1520 2615 2302 + 1243 1 2425 2616 1520 + 1244 1 1798 1800 1549 + 1245 1 1637 2727 1819 + 1246 1 1958 2367 1643 + 1247 1 1677 2798 2784 + 1248 1 1679 2064 2063 + 1249 1 2473 2753 1760 + 1250 1 1816 2734 2581 + 1251 1 1817 2858 1818 + 1252 1 2250 2654 1901 + 1253 1 1903 2691 2655 + 1254 1 1929 1957 1930 + 1255 1 1936 2806 2488 + 1256 1 2146 2512 2003 + 1257 1 2090 2091 2089 + 1258 1 2533 2717 2139 + 1259 1 2212 2457 2281 + 1260 1 204 2094 180 + 1261 1 936 2134 414 + 1262 1 2009 2376 809 + 1263 1 832 2316 868 + 1264 1 841 842 840 + 1265 1 928 2618 924 + 1266 1 1044 1229 1226 + 1267 1 1045 1047 1046 + 1268 1 1118 1119 1093 + 1269 1 1139 2345 2210 + 1270 1 1437 2708 1205 + 1271 1 1546 2141 1214 + 1272 1 1438 1449 1448 + 1273 1 2026 2027 1583 + 1274 1 1665 2163 2106 + 1275 1 2600 2610 1674 + 1276 1 1679 2063 2062 + 1277 1 493 2291 2100 + 1278 1 674 2022 644 + 1279 1 764 2493 1062 + 1280 1 956 2272 1213 + 1281 1 1620 2640 1283 + 1282 1 1320 2736 2538 + 1283 1 1359 1919 1429 + 1284 1 1891 2300 1897 + 1285 1 2019 2020 2016 + 1286 1 181 2392 204 + 1287 1 381 2208 379 + 1288 1 461 2079 460 + 1289 1 580 2387 560 + 1290 1 756 1076 686 + 1291 1 2154 2156 716 + 1292 1 843 844 842 + 1293 1 845 2163 848 + 1294 1 847 2706 846 + 1295 1 852 2348 940 + 1296 1 858 2338 863 + 1297 1 870 2008 864 + 1298 1 1827 2761 866 + 1299 1 873 876 870 + 1300 1 1477 2315 911 + 1301 1 912 914 913 + 1302 1 1045 1046 1043 + 1303 1 1047 1048 1046 + 1304 1 1049 1050 1048 + 1305 1 1051 1052 1050 + 1306 1 1053 1210 1052 + 1307 1 1120 1121 1119 + 1308 1 1119 2030 1231 + 1309 1 1127 1128 1121 + 1310 1 1127 2062 1412 + 1311 1 1396 2234 1133 + 1312 1 1134 1389 1356 + 1313 1 1911 2821 1210 + 1314 1 1227 1573 1572 + 1315 1 1312 2762 1315 + 1316 1 1348 1589 1349 + 1317 1 1725 1985 1349 + 1318 1 1383 1743 1644 + 1319 1 1395 1849 1639 + 1320 1 1827 1828 1396 + 1321 1 2136 2327 1431 + 1322 1 2126 2595 1573 + 1323 1 1673 2332 1998 + 1324 1 2592 2742 2024 + 1325 1 2030 2031 2028 + 1326 1 2056 2723 2589 + 1327 1 2068 2647 2598 + 1328 1 2405 2497 2206 + 1329 1 2271 2426 2251 + 1330 1 2189 2190 185 + 1331 1 2060 2567 441 + 1332 1 554 2351 2347 + 1333 1 2022 2120 644 + 1334 1 795 2266 1997 + 1335 1 2251 2270 881 + 1336 1 989 1950 1252 + 1337 1 1092 1351 1094 + 1338 1 1118 1120 1119 + 1339 1 1172 2583 1987 + 1340 1 1300 2452 2283 + 1341 1 2546 2672 1302 + 1342 1 1385 1756 1755 + 1343 1 1690 1691 1688 + 1344 1 2042 2558 2489 + 1345 1 2305 2650 2635 + 1346 1 997 1006 763 + 1347 1 2032 2329 937 + 1348 1 1149 2203 1152 + 1349 1 1243 2057 1842 + 1350 1 209 2184 85 + 1351 1 217 2186 90 + 1352 1 269 2188 172 + 1353 1 563 2406 2054 + 1354 1 2004 2338 855 + 1355 1 1228 2125 1047 + 1356 1 2121 2122 1228 + 1357 1 2607 2696 1544 + 1358 1 1911 2800 1638 + 1359 1 2549 2569 2048 + 1360 1 572 2418 620 + 1361 1 1343 1968 1089 + 1362 1 1949 2528 1516 + 1363 1 1768 1769 1601 + 1364 1 1632 1908 1907 + 1365 1 401 2159 399 + 1366 1 795 2447 412 + 1367 1 469 2425 1520 + 1368 1 524 2087 545 + 1369 1 684 731 730 + 1370 1 782 2304 790 + 1371 1 789 2309 787 + 1372 1 1270 2608 1091 + 1373 1 1397 2476 1219 + 1374 1 2167 2168 1332 + 1375 1 1900 1902 1898 + 1376 1 366 2253 369 + 1377 1 716 2159 401 + 1378 1 490 491 488 + 1379 1 590 2137 628 + 1380 1 713 2131 1439 + 1381 1 868 2097 830 + 1382 1 876 2008 870 + 1383 1 1005 2400 1337 + 1384 1 2025 2352 1029 + 1385 1 1084 2166 1332 + 1386 1 1103 1403 1378 + 1387 1 1335 2171 2170 + 1388 1 1361 1605 1414 + 1389 1 1850 2363 1519 + 1390 1 1560 2814 2788 + 1391 1 1916 2661 1614 + 1392 1 2653 2705 1675 + 1393 1 2287 2288 1702 + 1394 1 291 2364 952 + 1395 1 2208 2345 379 + 1396 1 2047 2048 814 + 1397 1 853 2004 855 + 1398 1 894 1028 896 + 1399 1 930 966 926 + 1400 1 1158 2227 1940 + 1401 1 1160 1940 1523 + 1402 1 1544 1586 1382 + 1403 1 1717 2826 1532 + 1404 1 2388 2389 1571 + 1405 1 293 2364 291 + 1406 1 382 383 381 + 1407 1 667 685 640 + 1408 1 837 839 838 + 1409 1 855 858 856 + 1410 1 1440 2088 891 + 1411 1 1258 1357 1067 + 1412 1 1154 2227 1158 + 1413 1 2205 2497 1171 + 1414 1 2122 2123 1228 + 1415 1 1389 1578 1356 + 1416 1 1362 1862 1371 + 1417 1 1605 1615 1414 + 1418 1 96 2377 95 + 1419 1 100 2072 99 + 1420 1 199 2224 198 + 1421 1 402 795 412 + 1422 1 1520 2302 465 + 1423 1 565 2254 594 + 1424 1 1879 2483 811 + 1425 1 2055 2637 1013 + 1426 1 1454 2536 1288 + 1427 1 1391 2481 1810 + 1428 1 1909 1958 1643 + 1429 1 349 796 351 + 1430 1 353 2466 355 + 1431 1 1169 2505 360 + 1432 1 459 485 424 + 1433 1 563 2054 587 + 1434 1 567 2525 2153 + 1435 1 1175 2422 615 + 1436 1 862 911 859 + 1437 1 950 2256 1541 + 1438 1 1017 1018 1016 + 1439 1 1017 2257 1298 + 1440 1 1136 1666 1138 + 1441 1 1290 1518 1460 + 1442 1 1486 1702 1701 + 1443 1 1623 1759 1493 + 1444 1 1518 1850 1519 + 1445 1 1686 2707 1988 + 1446 1 934 2300 346 + 1447 1 502 2335 487 + 1448 1 538 2394 570 + 1449 1 569 711 623 + 1450 1 656 2372 2355 + 1451 1 1216 2089 831 + 1452 1 1113 1689 1688 + 1453 1 1123 2180 1709 + 1454 1 1322 2667 2401 + 1455 1 1619 1750 1604 + 1456 1 1863 1867 1865 + 1457 1 591 2408 636 + 1458 1 944 2471 668 + 1459 1 669 2468 720 + 1460 1 1141 2527 991 + 1461 1 1000 2763 2318 + 1462 1 1087 1350 1088 + 1463 1 1313 2274 1904 + 1464 1 1325 1692 1512 + 1465 1 1511 2579 2430 + 1466 1 2563 2758 1568 + 1467 1 1955 1956 1641 + 1468 1 2041 2096 470 + 1469 1 2491 2668 584 + 1470 1 2096 2268 819 + 1471 1 920 2164 918 + 1472 1 1679 2062 1120 + 1473 1 2821 2827 1210 + 1474 1 2369 2541 1582 + 1475 1 1849 2036 1914 + 1476 1 1943 1944 1942 + 1477 1 294 2277 296 + 1478 1 1455 2196 521 + 1479 1 2740 2751 611 + 1480 1 2008 2051 864 + 1481 1 1366 1611 1560 + 1482 1 1722 1724 1392 + 1483 1 1470 2255 2254 + 1484 1 1492 2496 1707 + 1485 1 1928 2141 1546 + 1486 1 1800 2759 1549 + 1487 1 1606 1745 1614 + 1488 1 1633 1635 1634 + 1489 1 2055 2629 1660 + 1490 1 1675 2705 1927 + 1491 1 2418 2565 2049 + 1492 1 2050 2116 2105 + 1493 1 198 252 197 + 1494 1 200 230 199 + 1495 1 475 476 474 + 1496 1 478 2195 489 + 1497 1 480 2196 2195 + 1498 1 497 2291 493 + 1499 1 820 2508 509 + 1500 1 2591 2624 540 + 1501 1 570 589 568 + 1502 1 681 721 674 + 1503 1 680 812 797 + 1504 1 693 2690 694 + 1505 1 744 2160 2043 + 1506 1 2203 2227 1152 + 1507 1 1291 2083 1427 + 1508 1 1353 1579 1354 + 1509 1 1579 1582 1354 + 1510 1 1939 2204 1411 + 1511 1 1490 1492 1491 + 1512 1 1499 1952 1500 + 1513 1 1528 2810 2526 + 1514 1 1628 1847 1846 + 1515 1 284 1991 1224 + 1516 1 405 2330 936 + 1517 1 460 488 427 + 1518 1 588 2485 1024 + 1519 1 654 2009 809 + 1520 1 2044 2651 665 + 1521 1 679 770 769 + 1522 1 1162 2163 1665 + 1523 1 1863 1864 1371 + 1524 1 1480 2207 1479 + 1525 1 1523 1568 1522 + 1526 1 1737 1738 1548 + 1527 1 1649 2198 1907 + 1528 1 1671 1951 1682 + 1529 1 2158 2438 2358 + 1530 1 451 2247 452 + 1531 1 802 2248 451 + 1532 1 490 1494 513 + 1533 1 514 2353 491 + 1534 1 532 2284 503 + 1535 1 539 2239 514 + 1536 1 797 2269 681 + 1537 1 2474 2551 929 + 1538 1 1009 1057 1010 + 1539 1 1226 2389 1041 + 1540 1 1991 1992 1224 + 1541 1 1384 1385 1235 + 1542 1 1303 1669 1668 + 1543 1 2514 2700 1453 + 1544 1 1483 2207 1480 + 1545 1 1486 2287 1702 + 1546 1 1511 2398 2352 + 1547 1 1517 2515 1977 + 1548 1 2110 2111 1602 + 1549 1 2583 2638 1987 + 1550 1 451 2248 2247 + 1551 1 452 2247 455 + 1552 1 541 2254 565 + 1553 1 649 2197 651 + 1554 1 656 2355 658 + 1555 1 663 2044 665 + 1556 1 1240 1251 1125 + 1557 1 1176 1971 1177 + 1558 1 2083 2084 1427 + 1559 1 1601 1880 1803 + 1560 1 1660 2074 1939 + 1561 1 2101 2103 2102 + 1562 1 2209 2610 2600 + 1563 1 2282 2412 453 + 1564 1 470 499 469 + 1565 1 500 2096 507 + 1566 1 546 2490 558 + 1567 1 578 1981 1136 + 1568 1 618 663 619 + 1569 1 644 2120 642 + 1570 1 660 2671 2513 + 1571 1 867 1915 836 + 1572 1 1058 1285 1284 + 1573 1 1167 2328 2008 + 1574 1 1602 1630 1250 + 1575 1 1603 1633 1251 + 1576 1 1601 1803 1599 + 1577 1 1903 2517 2457 + 1578 1 2158 2159 2156 + 1579 1 412 422 417 + 1580 1 449 2346 802 + 1581 1 466 469 465 + 1582 1 640 2078 607 + 1583 1 676 2604 2288 + 1584 1 706 2403 890 + 1585 1 739 741 740 + 1586 1 819 821 820 + 1587 1 881 2271 2251 + 1588 1 915 2061 913 + 1589 1 1103 1378 1253 + 1590 1 1398 1399 1110 + 1591 1 1178 2616 2425 + 1592 1 1383 1765 1743 + 1593 1 1383 1874 1765 + 1594 1 1431 2351 2136 + 1595 1 1468 1667 1466 + 1596 1 1508 1548 1547 + 1597 1 1600 1601 1599 + 1598 1 1661 2550 2500 + 1599 1 2066 2067 1966 + 1600 1 2462 2519 2207 + 1601 1 283 1377 281 + 1602 1 369 2365 373 + 1603 1 378 2358 622 + 1604 1 2148 2213 417 + 1605 1 422 437 424 + 1606 1 485 2148 424 + 1607 1 510 544 528 + 1608 1 2225 2465 517 + 1609 1 2015 2020 544 + 1610 1 544 2747 2437 + 1611 1 1123 1170 615 + 1612 1 664 702 663 + 1613 1 706 890 705 + 1614 1 808 2435 1113 + 1615 1 1286 1287 1032 + 1616 1 1170 1453 1175 + 1617 1 1227 1572 1230 + 1618 1 1362 1371 1258 + 1619 1 1276 2482 1924 + 1620 1 1298 1671 1299 + 1621 1 1308 2326 2322 + 1622 1 1385 2609 1756 + 1623 1 1481 2631 2515 + 1624 1 1823 1893 1691 + 1625 1 1709 2180 2138 + 1626 1 1736 1794 1787 + 1627 1 2212 2691 2457 + 1628 1 44 2275 43 + 1629 1 259 2182 62 + 1630 1 320 321 319 + 1631 1 374 2345 370 + 1632 1 421 426 425 + 1633 1 435 436 434 + 1634 1 556 584 582 + 1635 1 1289 2286 813 + 1636 1 986 2249 2069 + 1637 1 1160 1523 1522 + 1638 1 1198 2006 1194 + 1639 1 1219 1274 1220 + 1640 1 1247 2542 1240 + 1641 1 1265 2564 1263 + 1642 1 1462 2273 1275 + 1643 1 1461 1553 1286 + 1644 1 1287 1556 1409 + 1645 1 1410 1454 1288 + 1646 1 1328 2533 2272 + 1647 1 1375 1761 1735 + 1648 1 1804 2360 1387 + 1649 1 1404 1851 1405 + 1650 1 1637 1819 1418 + 1651 1 1919 1920 1429 + 1652 1 1531 1533 1529 + 1653 1 1975 2198 1649 + 1654 1 1929 1930 1654 + 1655 1 2403 2404 1686 + 1656 1 2434 2670 2458 + 1657 1 384 2519 2462 + 1658 1 455 799 457 + 1659 1 484 1012 522 + 1660 1 848 849 847 + 1661 1 848 2163 1162 + 1662 1 849 851 850 + 1663 1 978 1054 977 + 1664 1 1325 1512 1082 + 1665 1 1151 2570 1150 + 1666 1 1171 2338 2205 + 1667 1 1347 1565 1345 + 1668 1 1346 1739 1348 + 1669 1 1587 1767 1766 + 1670 1 1599 1972 1598 + 1671 1 2606 2734 2552 + 1672 1 94 2071 93 + 1673 1 167 2073 166 + 1674 1 183 2391 182 + 1675 1 323 2129 941 + 1676 1 344 347 342 + 1677 1 358 359 357 + 1678 1 377 389 378 + 1679 1 388 2131 626 + 1680 1 406 716 401 + 1681 1 424 2148 417 + 1682 1 2283 2451 462 + 1683 1 510 511 502 + 1684 1 525 2240 550 + 1685 1 623 2239 539 + 1686 1 578 580 560 + 1687 1 570 2394 1168 + 1688 1 700 964 701 + 1689 1 950 951 709 + 1690 1 782 783 781 + 1691 1 784 785 783 + 1692 1 786 2243 932 + 1693 1 791 793 792 + 1694 1 815 2310 792 + 1695 1 793 1011 794 + 1696 1 812 1163 813 + 1697 1 862 2051 1436 + 1698 1 939 1167 876 + 1699 1 923 924 915 + 1700 1 963 2368 1706 + 1701 1 978 1945 1056 + 1702 1 1001 1272 1271 + 1703 1 2311 2660 1014 + 1704 1 1031 1286 1032 + 1705 1 1435 2244 1039 + 1706 1 1041 2389 1042 + 1707 1 1044 1226 1041 + 1708 1 1044 1947 1305 + 1709 1 1261 1262 1099 + 1710 1 1676 1681 1175 + 1711 1 1208 1268 1266 + 1712 1 1216 2090 2089 + 1713 1 2084 2085 1427 + 1714 1 1505 1773 1507 + 1715 1 1677 2433 2248 + 1716 1 2632 2758 1873 + 1717 1 2028 2029 2027 + 1718 1 2146 2365 2253 + 1719 1 2294 2296 2295 + 1720 1 117 218 116 + 1721 1 122 210 121 + 1722 1 373 374 370 + 1723 1 495 496 463 + 1724 1 587 588 577 + 1725 1 662 955 580 + 1726 1 814 2408 591 + 1727 1 642 717 643 + 1728 1 745 2458 743 + 1729 1 770 977 769 + 1730 1 1020 1293 817 + 1731 1 877 2535 881 + 1732 1 899 1022 897 + 1733 1 1357 2214 1067 + 1734 1 2038 2487 1096 + 1735 1 1098 1375 1260 + 1736 1 1111 1310 1309 + 1737 1 1117 1239 1116 + 1738 1 1239 1250 1116 + 1739 1 1908 2542 1247 + 1740 1 1261 1263 1262 + 1741 1 1280 1451 1417 + 1742 1 1639 1827 1396 + 1743 1 1684 2519 2402 + 1744 1 2589 2637 2056 + 1745 1 93 273 92 + 1746 1 168 268 167 + 1747 1 180 2094 179 + 1748 1 2263 2264 227 + 1749 1 341 343 342 + 1750 1 345 349 346 + 1751 1 351 353 352 + 1752 1 365 2566 1169 + 1753 1 407 2266 400 + 1754 1 405 413 403 + 1755 1 404 2178 430 + 1756 1 414 2134 419 + 1757 1 431 1452 429 + 1758 1 486 779 501 + 1759 1 529 2423 511 + 1760 1 579 2512 2253 + 1761 1 630 2356 1495 + 1762 1 713 714 710 + 1763 1 782 790 784 + 1764 1 785 2241 783 + 1765 1 787 788 785 + 1766 1 791 792 788 + 1767 1 791 2309 935 + 1768 1 794 816 815 + 1769 1 797 2286 2269 + 1770 1 843 2163 845 + 1771 1 852 940 850 + 1772 1 854 2348 852 + 1773 1 911 2315 859 + 1774 1 1022 2548 897 + 1775 1 1023 2361 901 + 1776 1 932 960 933 + 1777 1 1083 2319 942 + 1778 1 948 2339 959 + 1779 1 1001 1271 1002 + 1780 1 1029 2353 2025 + 1781 1 1327 1328 1035 + 1782 1 1099 2636 1072 + 1783 1 1134 1638 1389 + 1784 1 1612 1824 1365 + 1785 1 1395 2036 1849 + 1786 1 1673 1998 1430 + 1787 1 1441 2231 1440 + 1788 1 1854 1855 1695 + 1789 1 1827 1829 1828 + 1790 1 1889 1891 1890 + 1791 1 1891 1897 1892 + 1792 1 2107 2270 2251 + 1793 1 2173 2477 2172 + 1794 1 333 2279 335 + 1795 1 781 2135 551 + 1796 1 601 2578 1993 + 1797 1 1975 2022 721 + 1798 1 993 2601 732 + 1799 1 773 2010 1442 + 1800 1 786 932 789 + 1801 1 896 898 897 + 1802 1 906 2400 1005 + 1803 1 1214 2141 1003 + 1804 1 1020 2292 1294 + 1805 1 1545 1546 1214 + 1806 1 1239 2110 1602 + 1807 1 1633 1634 1251 + 1808 1 1312 1313 1310 + 1809 1 1335 2170 2166 + 1810 1 1711 1712 1381 + 1811 1 1597 1599 1598 + 1812 1 1876 1909 1643 + 1813 1 1674 2610 2032 + 1814 1 1680 2136 2135 + 1815 1 2641 2725 1716 + 1816 1 1770 1790 1771 + 1817 1 2076 2746 1872 + 1818 1 2068 2570 1966 + 1819 1 1982 1984 1983 + 1820 1 2209 2600 2211 + 1821 1 268 2073 167 + 1822 1 376 2420 2402 + 1823 1 383 2329 576 + 1824 1 405 936 414 + 1825 1 466 470 469 + 1826 1 489 2195 2194 + 1827 1 1177 1178 531 + 1828 1 2136 2351 554 + 1829 1 2455 2456 638 + 1830 1 1060 1061 765 + 1831 1 2048 2408 814 + 1832 1 872 2705 835 + 1833 1 857 2004 853 + 1834 1 871 2359 875 + 1835 1 1030 2375 893 + 1836 1 1003 1004 905 + 1837 1 1085 1223 957 + 1838 1 2339 2340 959 + 1839 1 1539 2561 1094 + 1840 1 1294 1674 1673 + 1841 1 1334 1938 1333 + 1842 1 1597 1598 1374 + 1843 1 1421 2077 2075 + 1844 1 1707 1754 1623 + 1845 1 2114 2116 2115 + 1846 1 147 231 146 + 1847 1 420 2095 778 + 1848 1 819 2268 821 + 1849 1 884 886 885 + 1850 1 888 968 886 + 1851 1 890 1073 891 + 1852 1 997 1007 1006 + 1853 1 1065 1398 1110 + 1854 1 1365 1965 1156 + 1855 1 1172 2528 2484 + 1856 1 1179 1222 1178 + 1857 1 1213 1468 1466 + 1858 1 1385 1406 1235 + 1859 1 1255 1711 1381 + 1860 1 1303 1668 1301 + 1861 1 1604 1862 1362 + 1862 1 1407 1567 1558 + 1863 1 1640 1910 1441 + 1864 1 1474 1641 1475 + 1865 1 1504 2232 1502 + 1866 1 1527 1528 1526 + 1867 1 1526 2526 1938 + 1868 1 1540 1577 1552 + 1869 1 1669 2547 1668 + 1870 1 1729 1730 1728 + 1871 1 83 238 82 + 1872 1 86 209 85 + 1873 1 91 217 90 + 1874 1 145 254 144 + 1875 1 150 246 149 + 1876 1 170 220 169 + 1877 1 173 269 172 + 1878 1 175 212 174 + 1879 1 178 239 177 + 1880 1 185 2190 184 + 1881 1 295 682 293 + 1882 1 343 363 345 + 1883 1 399 2393 394 + 1884 1 400 2266 402 + 1885 1 419 2134 2133 + 1886 1 423 2605 2293 + 1887 1 428 2133 471 + 1888 1 445 446 444 + 1889 1 486 487 485 + 1890 1 487 2335 1135 + 1891 1 620 640 607 + 1892 1 658 2355 704 + 1893 1 727 728 672 + 1894 1 2137 2492 673 + 1895 1 688 2440 2439 + 1896 1 826 827 825 + 1897 1 869 2590 2106 + 1898 1 882 884 883 + 1899 1 1321 1322 951 + 1900 1 969 1092 968 + 1901 1 1092 1094 968 + 1902 1 1008 1009 1007 + 1903 1 1019 1081 1018 + 1904 1 1044 1305 1229 + 1905 1 1113 1687 1079 + 1906 1 1370 2527 1141 + 1907 1 1189 1195 1187 + 1908 1 1191 2144 1189 + 1909 1 1190 1199 1193 + 1910 1 1194 1196 1191 + 1911 1 1246 2110 1239 + 1912 1 1373 1374 1265 + 1913 1 1268 1388 1387 + 1914 1 1684 2307 1323 + 1915 1 1324 1480 1479 + 1916 1 1526 1938 1334 + 1917 1 1585 1820 1373 + 1918 1 1394 1722 1392 + 1919 1 1448 2040 1437 + 1920 1 1438 2721 1449 + 1921 1 1467 2560 1465 + 1922 1 1759 1868 1493 + 1923 1 1540 1552 1551 + 1924 1 2662 2739 1657 + 1925 1 2322 2326 1676 + 1926 1 1680 2327 2136 + 1927 1 2479 2739 1962 + 1928 1 384 2594 382 + 1929 1 1433 2470 458 + 1930 1 548 1837 557 + 1931 1 618 619 586 + 1932 1 586 2478 1961 + 1933 1 604 1713 678 + 1934 1 671 2249 670 + 1935 1 735 2440 688 + 1936 1 986 1064 1063 + 1937 1 1079 1108 995 + 1938 1 1284 2545 1010 + 1939 1 1162 1325 1082 + 1940 1 1119 1231 1093 + 1941 1 1111 1311 1310 + 1942 1 1138 2631 1700 + 1943 1 1682 1683 1299 + 1944 1 1303 1670 1669 + 1945 1 1313 1904 1310 + 1946 1 1320 2538 2529 + 1947 1 1324 1479 1323 + 1948 1 1877 2582 1476 + 1949 1 1544 1587 1586 + 1950 1 1999 2662 1657 + 1951 1 2153 2642 2152 + 1952 1 2203 2228 2227 + 1953 1 182 2392 181 + 1954 1 2391 2392 182 + 1955 1 298 520 300 + 1956 1 375 376 374 + 1957 1 773 1317 555 + 1958 1 750 2285 753 + 1959 1 844 866 842 + 1960 1 848 1082 849 + 1961 1 2399 2405 1028 + 1962 1 1042 2121 1045 + 1963 1 1051 1227 1053 + 1964 1 1096 2386 1946 + 1965 1 1097 1503 1502 + 1966 1 1111 1894 1311 + 1967 1 1120 2062 1127 + 1968 1 1127 1412 1129 + 1969 1 1130 1232 1128 + 1970 1 1133 2234 1134 + 1971 1 1231 2030 2028 + 1972 1 1630 1631 1250 + 1973 1 1282 2043 1650 + 1974 1 1291 1427 1424 + 1975 1 2634 2642 1308 + 1976 1 1346 1347 1345 + 1977 1 1589 1590 1349 + 1978 1 1578 1580 1356 + 1979 1 1407 2035 1567 + 1980 1 1420 1660 1411 + 1981 1 1954 2098 1491 + 1982 1 2318 2763 1912 + 1983 1 1933 1937 1936 + 1984 1 36 208 35 + 1985 1 41 216 40 + 1986 1 251 2343 57 + 1987 1 213 2219 68 + 1988 1 298 2265 520 + 1989 1 508 512 506 + 1990 1 558 2490 1221 + 1991 1 605 2356 630 + 1992 1 744 745 743 + 1993 1 2543 2643 1008 + 1994 1 1074 1276 1115 + 1995 1 1338 1339 1145 + 1996 1 1263 1386 1262 + 1997 1 1678 2286 1289 + 1998 1 2042 2489 1295 + 1999 1 1525 1526 1334 + 2000 1 1576 2117 1352 + 2001 1 1360 1607 1359 + 2002 1 1628 1629 1627 + 2003 1 1872 2746 2729 + 2004 1 455 2247 799 + 2005 1 456 462 458 + 2006 1 462 495 463 + 2007 1 512 2104 506 + 2008 1 534 773 555 + 2009 1 595 631 593 + 2010 1 594 1080 596 + 2011 1 598 600 599 + 2012 1 656 658 657 + 2013 1 658 689 659 + 2014 1 726 727 672 + 2015 1 2568 2639 917 + 2016 1 932 2242 960 + 2017 1 1033 1037 964 + 2018 1 1097 1502 965 + 2019 1 1013 2629 2055 + 2020 1 1013 2637 2079 + 2021 1 1696 2463 1037 + 2022 1 1204 1205 1201 + 2023 1 1206 1259 1205 + 2024 1 1268 1387 1266 + 2025 1 1360 1869 1607 + 2026 1 1363 1604 1362 + 2027 1 1910 2231 1441 + 2028 1 1642 1924 1464 + 2029 1 1508 1737 1548 + 2030 1 1609 1749 1618 + 2031 1 2590 2735 1665 + 2032 1 2515 2631 1977 + 2033 1 2586 2773 2059 + 2034 1 2507 2690 2648 + 2035 1 442 445 444 + 2036 1 446 449 448 + 2037 1 1077 1078 447 + 2038 1 449 451 450 + 2039 1 470 2096 500 + 2040 1 479 480 478 + 2041 1 493 2100 483 + 2042 1 492 2484 2119 + 2043 1 505 531 499 + 2044 1 516 518 517 + 2045 1 516 2624 2045 + 2046 1 652 2181 650 + 2047 1 693 694 692 + 2048 1 695 1906 692 + 2049 1 698 707 706 + 2050 1 890 891 705 + 2051 1 707 736 708 + 2052 1 736 771 737 + 2053 1 972 1963 736 + 2054 1 740 2404 738 + 2055 1 738 2404 2403 + 2056 1 1963 2659 771 + 2057 1 804 1281 806 + 2058 1 1164 1289 813 + 2059 1 1073 1114 891 + 2060 1 2551 2552 1000 + 2061 1 1033 2290 1697 + 2062 1 1058 1361 1285 + 2063 1 1988 2109 1073 + 2064 1 1350 1514 1088 + 2065 1 1152 1154 1153 + 2066 1 1160 1522 1161 + 2067 1 1177 1179 1178 + 2068 1 1180 1181 1179 + 2069 1 1182 2233 1200 + 2070 1 1616 1990 1241 + 2071 1 1375 1735 1260 + 2072 1 1261 1264 1263 + 2073 1 2105 2114 1281 + 2074 1 1350 1569 1514 + 2075 1 1393 1912 1814 + 2076 1 1492 1623 1493 + 2077 1 1505 1506 1504 + 2078 1 1517 2118 1949 + 2079 1 1550 1833 1640 + 2080 1 1678 2482 2325 + 2081 1 1933 1935 1932 + 2082 1 1933 1957 1937 + 2083 1 2041 2268 2096 + 2084 1 2103 2427 2116 + 2085 1 2195 2428 2194 + 2086 1 17 264 16 + 2087 1 22 265 21 + 2088 1 224 2260 142 + 2089 1 1444 2330 391 + 2090 1 430 699 432 + 2091 1 2135 2136 554 + 2092 1 642 643 627 + 2093 1 636 2408 671 + 2094 1 656 657 654 + 2095 1 680 797 681 + 2096 1 766 1282 1101 + 2097 1 987 988 777 + 2098 1 784 2243 786 + 2099 1 917 919 918 + 2100 1 917 2639 919 + 2101 1 925 2164 920 + 2102 1 931 1277 953 + 2103 1 936 2719 2134 + 2104 1 969 1118 1093 + 2105 1 1341 1342 1038 + 2106 1 1149 1151 1150 + 2107 1 1364 1365 1156 + 2108 1 1234 1360 1359 + 2109 1 1249 1647 1626 + 2110 1 1278 1472 1471 + 2111 1 1400 1401 1283 + 2112 1 1407 1558 1336 + 2113 1 1351 1576 1352 + 2114 1 1419 2549 2047 + 2115 1 1439 2146 2003 + 2116 1 1952 1953 1500 + 2117 1 1653 2453 1976 + 2118 1 1884 1886 1883 + 2119 1 2319 2353 2239 + 2120 1 143 224 142 + 2121 1 298 300 299 + 2122 1 300 302 301 + 2123 1 302 304 303 + 2124 1 304 306 305 + 2125 1 306 308 307 + 2126 1 308 310 309 + 2127 1 310 312 311 + 2128 1 314 316 315 + 2129 1 368 2504 314 + 2130 1 316 318 317 + 2131 1 318 320 319 + 2132 1 941 2429 321 + 2133 1 322 324 323 + 2134 1 324 326 325 + 2135 1 326 328 327 + 2136 1 410 2374 327 + 2137 1 329 330 328 + 2138 1 331 332 330 + 2139 1 333 334 332 + 2140 1 332 2278 1173 + 2141 1 335 336 334 + 2142 1 335 2279 423 + 2143 1 337 338 336 + 2144 1 336 2221 385 + 2145 1 339 340 338 + 2146 1 339 2293 798 + 2147 1 341 342 340 + 2148 1 340 2299 810 + 2149 1 343 344 342 + 2150 1 343 2371 363 + 2151 1 345 346 344 + 2152 1 349 350 346 + 2153 1 355 356 354 + 2154 1 356 358 357 + 2155 1 358 361 359 + 2156 1 365 1169 360 + 2157 1 361 366 362 + 2158 1 366 369 367 + 2159 1 579 2253 366 + 2160 1 1139 2281 367 + 2161 1 2253 2365 369 + 2162 1 371 609 377 + 2163 1 378 622 372 + 2164 1 377 2193 389 + 2165 1 393 408 397 + 2166 1 398 399 394 + 2167 1 400 401 399 + 2168 1 402 2266 795 + 2169 1 412 417 406 + 2170 1 406 2213 716 + 2171 1 2246 2373 408 + 2172 1 411 660 416 + 2173 1 420 778 415 + 2174 1 419 428 427 + 2175 1 425 2095 420 + 2176 1 421 2238 426 + 2177 1 433 464 425 + 2178 1 439 2712 434 + 2179 1 436 441 440 + 2180 1 2058 2060 441 + 2181 1 799 800 457 + 2182 1 469 1520 465 + 2183 1 472 2629 1013 + 2184 1 477 2583 1172 + 2185 1 1135 2148 485 + 2186 1 486 501 487 + 2187 1 491 1029 488 + 2188 1 501 510 502 + 2189 1 504 1981 533 + 2190 1 510 528 511 + 2191 1 527 541 540 + 2192 1 2422 2423 529 + 2193 1 533 578 560 + 2194 1 538 570 568 + 2195 1 1470 2254 541 + 2196 1 542 562 543 + 2197 1 615 2422 543 + 2198 1 561 1837 548 + 2199 1 562 614 613 + 2200 1 955 2387 580 + 2201 1 590 628 627 + 2202 1 1168 2137 590 + 2203 1 594 595 593 + 2204 1 594 2254 1080 + 2205 1 616 617 614 + 2206 1 2138 2180 621 + 2207 1 626 709 625 + 2208 1 626 2131 713 + 2209 1 660 2334 2333 + 2210 1 680 681 674 + 2211 1 687 734 688 + 2212 1 700 2290 1033 + 2213 1 710 950 709 + 2214 1 714 2256 710 + 2215 1 713 1439 715 + 2216 1 715 2257 909 + 2217 1 726 986 985 + 2218 1 744 747 745 + 2219 1 2434 2458 745 + 2220 1 747 749 748 + 2221 1 766 976 749 + 2222 1 750 753 752 + 2223 1 753 767 754 + 2224 1 757 1208 1207 + 2225 1 766 1101 976 + 2226 1 766 2043 1282 + 2227 1 771 2385 2161 + 2228 1 779 2436 2017 + 2229 1 780 2684 2280 + 2230 1 782 784 783 + 2231 1 788 2241 785 + 2232 1 786 789 787 + 2233 1 787 2309 791 + 2234 1 2295 2371 798 + 2235 1 806 2435 808 + 2236 1 808 1113 1079 + 2237 1 811 2501 2001 + 2238 1 816 817 815 + 2239 1 821 822 820 + 2240 1 821 2268 1295 + 2241 1 822 824 823 + 2242 1 889 2314 822 + 2243 1 829 2313 1216 + 2244 1 833 2089 872 + 2245 1 1296 1497 889 + 2246 1 909 1017 1016 + 2247 1 932 2243 2242 + 2248 1 950 1321 951 + 2249 1 960 2242 1040 + 2250 1 2245 2267 962 + 2251 1 1038 2306 964 + 2252 1 975 1068 1067 + 2253 1 1101 1102 976 + 2254 1 2140 2732 994 + 2255 1 2336 2337 999 + 2256 1 1271 1273 1002 + 2257 1 1011 2584 2580 + 2258 1 1014 2660 2555 + 2259 1 1308 2322 1016 + 2260 1 1017 1019 1018 + 2261 1 1021 2292 1020 + 2262 1 1460 2361 1023 + 2263 1 1922 2658 1024 + 2264 1 1026 1218 1027 + 2265 1 1287 1288 1032 + 2266 1 1034 1326 1035 + 2267 1 1037 2463 1341 + 2268 1 1342 1513 1038 + 2269 1 2599 2634 1081 + 2270 1 1335 2166 1084 + 2271 1 1098 1260 1099 + 2272 1 1113 1688 1687 + 2273 1 1124 1126 1125 + 2274 1 2120 2554 1124 + 2275 1 1135 2335 2150 + 2276 1 1339 1661 1145 + 2277 1 1147 1149 1148 + 2278 1 1158 1160 1159 + 2279 1 1163 1411 1164 + 2280 1 2081 2082 1165 + 2281 1 2350 2498 1173 + 2282 1 1195 2143 1187 + 2283 1 1192 1979 1188 + 2284 1 1190 1193 1191 + 2285 1 1208 1209 1207 + 2286 1 1208 2453 1268 + 2287 1 1266 1267 1209 + 2288 1 1706 2475 1212 + 2289 1 1218 1397 1219 + 2290 1 1219 2476 1274 + 2291 1 1275 2273 1220 + 2292 1 1240 1603 1251 + 2293 1 1240 2542 1603 + 2294 1 1387 2360 1266 + 2295 1 1267 1535 1534 + 2296 1 1268 1653 1388 + 2297 1 1273 1876 1643 + 2298 1 1274 1538 1404 + 2299 1 1405 1462 1275 + 2300 1 1282 1650 1400 + 2301 1 1409 1410 1288 + 2302 1 1290 2172 1518 + 2303 1 1671 1682 1299 + 2304 1 1300 2573 2452 + 2305 1 1320 2529 2516 + 2306 1 2166 2167 1332 + 2307 1 1564 2274 1336 + 2308 1 1368 1369 1367 + 2309 1 1369 1627 1613 + 2310 1 1385 1755 1406 + 2311 1 1408 1921 1509 + 2312 1 1825 1835 1410 + 2313 1 1417 1637 1418 + 2314 1 1433 2623 2470 + 2315 1 1562 1655 1435 + 2316 1 2131 2146 1439 + 2317 1 2271 2536 1454 + 2318 1 1519 2362 1460 + 2319 1 1463 1694 1462 + 2320 1 1462 2509 2273 + 2321 1 1667 2441 1466 + 2322 1 1476 1955 1474 + 2323 1 1641 1859 1475 + 2324 1 1482 1485 1484 + 2325 1 1485 1516 1515 + 2326 1 1500 1501 1498 + 2327 1 1499 1997 1952 + 2328 1 1953 2699 1500 + 2329 1 1536 1537 1535 + 2330 1 1805 1806 1537 + 2331 1 1927 1928 1546 + 2332 1 1632 1907 1631 + 2333 1 2106 2590 1665 + 2334 1 1682 1978 1683 + 2335 1 1951 2664 1682 + 2336 1 2454 2677 1685 + 2337 1 1689 1690 1688 + 2338 1 1855 1856 1695 + 2339 1 1704 2700 2514 + 2340 1 1720 2747 1721 + 2341 1 1742 2753 2659 + 2342 1 1769 1881 1880 + 2343 1 1889 1890 1856 + 2344 1 2580 2584 1856 + 2345 1 1901 2517 1900 + 2346 1 1905 2702 2680 + 2347 1 1933 1936 1935 + 2348 1 2067 2068 1966 + 2349 1 1976 2453 2202 + 2350 1 2016 2020 2015 + 2351 1 2025 2353 2319 + 2352 1 2262 2708 2040 + 2353 1 2056 2637 2055 + 2354 1 2083 2282 2084 + 2355 1 2149 2213 2148 + 2356 1 2151 2154 2149 + 2357 1 2150 2153 2152 + 2358 1 2155 2156 2154 + 2359 1 2157 2158 2156 + 2360 1 2169 2764 2167 + 2361 1 2168 2174 2173 + 2362 1 2333 2559 2238 + 2363 1 2289 2290 2240 + 2364 1 2248 2433 2247 + 2365 1 2286 2325 2269 + 2366 1 2513 2671 2350 + 2367 1 2472 2737 2531 + 2368 1 80 202 79 + 2369 1 84 2183 83 + 2370 1 85 2184 84 + 2371 1 89 255 88 + 2372 1 90 2186 89 + 2373 1 172 2188 171 + 2374 1 181 204 180 + 2375 1 186 2189 185 + 2376 1 351 352 350 + 2377 1 353 354 352 + 2378 1 369 373 370 + 2379 1 408 904 903 + 2380 1 526 2135 554 + 2381 1 574 2290 700 + 2382 1 587 2054 634 + 2383 1 600 601 599 + 2384 1 600 638 602 + 2385 1 669 720 719 + 2386 1 1714 1715 678 + 2387 1 711 2354 958 + 2388 1 736 1963 771 + 2389 1 742 2336 999 + 2390 1 749 2285 750 + 2391 1 1680 2135 781 + 2392 1 806 807 805 + 2393 1 818 1020 817 + 2394 1 875 878 877 + 2395 1 938 939 876 + 2396 1 884 885 883 + 2397 1 898 899 897 + 2398 1 902 949 901 + 2399 1 906 1005 1003 + 2400 1 960 961 933 + 2401 1 961 1026 962 + 2402 1 975 1067 974 + 2403 1 988 1070 1069 + 2404 1 1001 2107 1272 + 2405 1 1005 1215 1214 + 2406 1 1045 1228 1047 + 2407 1 1049 1051 1050 + 2408 1 1053 1911 1210 + 2409 1 1071 2165 1098 + 2410 1 1129 1131 1130 + 2411 1 1193 1197 1194 + 2412 1 1379 1380 1236 + 2413 1 1609 1618 1242 + 2414 1 1255 1381 1254 + 2415 1 1267 1536 1535 + 2416 1 1272 1443 1423 + 2417 1 1401 1620 1283 + 2418 1 1375 2165 1875 + 2419 1 1762 1764 1380 + 2420 1 2352 2579 1511 + 2421 1 1769 1880 1601 + 2422 1 1670 1751 1669 + 2423 1 1684 2420 2307 + 2424 1 1697 2290 2289 + 2425 1 2289 2603 1697 + 2426 1 1744 1760 1741 + 2427 1 1882 1883 1881 + 2428 1 1930 1932 1931 + 2429 1 2623 2718 2084 + 2430 1 2105 2116 2114 + 2431 1 2123 2595 2125 + 2432 1 2152 2642 2634 + 2433 1 2209 2211 2210 + 2434 1 2310 2327 2241 + 2435 1 2324 2600 2292 + 2436 1 142 2260 141 + 2437 1 279 280 251 + 2438 1 325 2374 2129 + 2439 1 486 2436 779 + 2440 1 533 560 548 + 2441 1 587 633 588 + 2442 1 632 641 621 + 2443 1 647 677 641 + 2444 1 651 2197 655 + 2445 1 1297 2468 669 + 2446 1 687 688 677 + 2447 1 711 958 957 + 2448 1 989 990 760 + 2449 1 996 997 763 + 2450 1 783 2241 1680 + 2451 1 787 791 788 + 2452 1 794 2311 816 + 2453 1 806 808 807 + 2454 1 2080 2081 1165 + 2455 1 1169 2566 1978 + 2456 1 1294 2292 1674 + 2457 1 1311 1312 1310 + 2458 1 1314 1336 1313 + 2459 1 1369 1628 1627 + 2460 1 1401 2473 1736 + 2461 1 1861 2627 1642 + 2462 1 1720 2656 2437 + 2463 1 2267 2518 2309 + 2464 1 2509 2518 2273 + 2465 1 2275 2276 262 + 2466 1 282 283 281 + 2467 1 287 1100 285 + 2468 1 292 583 294 + 2469 1 292 2099 583 + 2470 1 373 375 374 + 2471 1 379 2345 374 + 2472 1 375 2420 376 + 2473 1 388 625 375 + 2474 1 387 2329 383 + 2475 1 386 1444 391 + 2476 1 392 937 387 + 2477 1 395 405 403 + 2478 1 404 429 396 + 2479 1 405 414 413 + 2480 1 414 419 418 + 2481 1 430 2178 699 + 2482 1 431 2347 1452 + 2483 1 442 444 443 + 2484 1 446 448 447 + 2485 1 449 450 448 + 2486 1 471 473 472 + 2487 1 1494 2394 513 + 2488 1 599 954 597 + 2489 1 605 629 603 + 2490 1 634 669 668 + 2491 1 646 725 723 + 2492 1 649 650 648 + 2493 1 2232 2690 693 + 2494 1 707 708 706 + 2495 1 729 761 728 + 2496 1 743 2458 746 + 2497 1 753 1469 767 + 2498 1 768 774 754 + 2499 1 776 987 777 + 2500 1 801 946 945 + 2501 1 808 995 807 + 2502 1 853 854 852 + 2503 1 864 2051 861 + 2504 1 863 1171 865 + 2505 1 865 2359 871 + 2506 1 871 875 874 + 2507 1 881 2270 874 + 2508 1 880 893 892 + 2509 1 1114 1440 891 + 2510 1 894 895 893 + 2511 1 894 2399 1028 + 2512 1 896 897 895 + 2513 1 904 906 905 + 2514 1 2340 2450 959 + 2515 1 986 1063 985 + 2516 1 988 1071 1070 + 2517 1 1068 1258 1067 + 2518 1 1112 2395 1070 + 2519 1 1071 1098 1072 + 2520 1 1512 2382 1082 + 2521 1 1115 1117 1116 + 2522 1 1157 1364 1156 + 2523 1 1237 1346 1345 + 2524 1 1425 1426 1292 + 2525 1 1294 1673 1430 + 2526 1 1346 1348 1347 + 2527 1 1379 1763 1762 + 2528 1 1425 2230 1645 + 2529 1 2231 2459 1440 + 2530 1 2107 2251 1443 + 2531 1 2375 2383 1461 + 2532 1 1463 1854 1695 + 2533 1 1527 1530 1529 + 2534 1 1536 1805 1537 + 2535 1 1636 1811 1804 + 2536 1 1647 1852 1648 + 2537 1 2205 2338 2004 + 2538 1 2211 2212 2210 + 2539 1 2229 2624 2591 + 2540 1 9 250 8 + 2541 1 141 2260 267 + 2542 1 196 221 195 + 2543 1 333 335 334 + 2544 1 335 337 336 + 2545 1 363 2523 345 + 2546 1 419 2133 428 + 2547 1 428 471 461 + 2548 1 511 567 502 + 2549 1 568 569 539 + 2550 1 613 615 543 + 2551 1 657 2009 654 + 2552 1 658 704 689 + 2553 1 673 680 674 + 2554 1 695 2459 1906 + 2555 1 762 763 756 + 2556 1 795 2558 2447 + 2557 1 882 883 827 + 2558 1 831 833 832 + 2559 1 833 835 834 + 2560 1 841 843 842 + 2561 1 855 2338 858 + 2562 1 880 2399 894 + 2563 1 919 921 920 + 2564 1 1041 1042 928 + 2565 1 950 1541 1321 + 2566 1 1277 1278 953 + 2567 1 963 1706 1212 + 2568 1 989 1252 1104 + 2569 1 1016 2322 1015 + 2570 1 1062 1241 1060 + 2571 1 1062 1705 1248 + 2572 1 1231 2026 1093 + 2573 1 1666 1977 1138 + 2574 1 1144 2433 1677 + 2575 1 1459 1488 1202 + 2576 1 1294 1430 1293 + 2577 1 1524 1525 1334 + 2578 1 1379 1762 1380 + 2579 1 1764 2052 1380 + 2580 1 1776 2215 1381 + 2581 1 1453 2323 1676 + 2582 1 1497 2683 2556 + 2583 1 1503 1504 1502 + 2584 1 2241 2327 1680 + 2585 1 1694 2584 2540 + 2586 1 1699 2352 2025 + 2587 1 1902 2555 1898 + 2588 1 2131 2365 2146 + 2589 1 2209 2210 2208 + 2590 1 43 2275 262 + 2591 1 254 2187 144 + 2592 1 286 287 285 + 2593 1 294 295 293 + 2594 1 296 297 295 + 2595 1 298 299 297 + 2596 1 314 315 313 + 2597 1 464 2095 425 + 2598 1 442 443 440 + 2599 1 446 2346 449 + 2600 1 451 452 450 + 2601 1 457 2283 456 + 2602 1 507 2096 819 + 2603 1 527 540 515 + 2604 1 541 564 540 + 2605 1 547 553 546 + 2606 1 1421 2406 559 + 2607 1 587 634 633 + 2608 1 598 2455 600 + 2609 1 667 2407 685 + 2610 1 669 719 668 + 2611 1 933 2267 789 + 2612 1 1124 1125 981 + 2613 1 997 1008 1007 + 2614 1 1070 2395 1069 + 2615 1 1077 2083 1291 + 2616 1 1164 2204 1413 + 2617 1 1272 1423 1422 + 2618 1 1340 1563 1562 + 2619 1 1591 1770 1372 + 2620 1 1393 1813 1812 + 2621 1 1417 1418 1416 + 2622 1 1508 1547 1506 + 2623 1 1806 1807 1537 + 2624 1 1628 1846 1629 + 2625 1 1714 1716 1715 + 2626 1 2194 2204 1939 + 2627 1 2057 2704 2553 + 2628 1 2100 2291 2101 + 2629 1 2169 2767 2764 + 2630 1 2551 2606 2552 + 2631 1 7 277 6 + 2632 1 12 244 11 + 2633 1 15 227 14 + 2634 1 257 2176 193 + 2635 1 195 2261 194 + 2636 1 310 2483 312 + 2637 1 319 468 317 + 2638 1 321 2429 319 + 2639 1 327 2374 325 + 2640 1 380 2402 384 + 2641 1 416 420 415 + 2642 1 421 425 420 + 2643 1 426 433 425 + 2644 1 435 2059 2058 + 2645 1 436 2058 441 + 2646 1 449 802 451 + 2647 1 1300 2283 457 + 2648 1 527 1470 541 + 2649 1 609 2775 2765 + 2650 1 636 670 637 + 2651 1 690 691 659 + 2652 1 670 726 672 + 2653 1 1061 1174 765 + 2654 1 773 2012 2010 + 2655 1 799 801 800 + 2656 1 843 845 844 + 2657 1 1082 2382 849 + 2658 1 860 2348 854 + 2659 1 1028 2592 896 + 2660 1 961 962 933 + 2661 1 938 2107 1001 + 2662 1 959 2450 2320 + 2663 1 979 1233 980 + 2664 1 979 1234 1233 + 2665 1 1042 1045 1043 + 2666 1 1047 1049 1048 + 2667 1 1686 1988 1073 + 2668 1 1120 1127 1121 + 2669 1 1126 1247 1240 + 2670 1 1131 1395 1133 + 2671 1 1134 1356 1132 + 2672 1 1266 2360 1267 + 2673 1 1388 1636 1387 + 2674 1 1395 1639 1396 + 2675 1 1457 2405 2399 + 2676 1 1849 1913 1639 + 2677 1 26 2199 25 + 2678 1 306 307 305 + 2679 1 312 313 311 + 2680 1 312 368 314 + 2681 1 316 317 315 + 2682 1 319 2429 468 + 2683 1 322 323 321 + 2684 1 324 325 323 + 2685 1 326 327 325 + 2686 1 328 348 327 + 2687 1 332 1173 330 + 2688 1 331 780 333 + 2689 1 334 2278 332 + 2690 1 340 810 338 + 2691 1 342 2299 340 + 2692 1 350 934 346 + 2693 1 348 411 410 + 2694 1 352 2130 350 + 2695 1 356 357 354 + 2696 1 361 362 359 + 2697 1 361 2301 579 + 2698 1 362 2281 610 + 2699 1 364 371 365 + 2700 1 371 377 372 + 2701 1 609 2193 377 + 2702 1 389 393 390 + 2703 1 2193 2246 389 + 2704 1 393 397 394 + 2705 1 398 407 400 + 2706 1 412 2447 422 + 2707 1 416 421 420 + 2708 1 660 2333 416 + 2709 1 426 434 433 + 2710 1 428 460 427 + 2711 1 436 440 439 + 2712 1 438 466 465 + 2713 1 441 442 440 + 2714 1 800 1300 457 + 2715 1 501 502 487 + 2716 1 528 529 511 + 2717 1 545 572 559 + 2718 1 566 814 591 + 2719 1 585 1510 581 + 2720 1 631 2464 593 + 2721 1 594 596 595 + 2722 1 602 604 603 + 2723 1 634 668 633 + 2724 1 670 672 637 + 2725 1 650 1143 648 + 2726 1 654 809 652 + 2727 1 662 956 955 + 2728 1 675 683 667 + 2729 1 910 2256 714 + 2730 1 715 909 908 + 2731 1 780 2280 2279 + 2732 1 877 881 874 + 2733 1 1497 2314 889 + 2734 1 901 2361 899 + 2735 1 949 1023 901 + 2736 1 938 1001 939 + 2737 1 1202 2432 945 + 2738 1 960 1039 961 + 2739 1 1026 1027 962 + 2740 1 1027 2245 962 + 2741 1 1273 1643 1002 + 2742 1 1014 2555 2424 + 2743 1 1026 2244 1329 + 2744 1 1218 1219 1027 + 2745 1 1219 1220 1027 + 2746 1 2254 2255 1080 + 2747 1 2472 2531 1081 + 2748 1 1260 1261 1099 + 2749 1 1143 2718 2226 + 2750 1 1153 1155 1151 + 2751 1 1204 1999 1206 + 2752 1 2313 2556 1216 + 2753 1 1239 1602 1250 + 2754 1 1274 1404 1275 + 2755 1 1404 1405 1275 + 2756 1 1319 1698 1428 + 2757 1 1322 1324 1323 + 2758 1 1340 1562 1435 + 2759 1 1538 2349 1404 + 2760 1 1405 2145 1463 + 2761 1 1835 2235 1410 + 2762 1 1420 2520 2056 + 2763 1 1694 2509 1462 + 2764 1 1476 2582 1955 + 2765 1 1481 1482 1480 + 2766 1 1482 1484 1483 + 2767 1 1485 1515 1484 + 2768 1 1485 2515 1517 + 2769 1 1507 1508 1506 + 2770 1 1532 2000 1531 + 2771 1 1653 1976 1929 + 2772 1 1664 1896 1678 + 2773 1 2326 2525 1681 + 2774 1 2022 2554 2120 + 2775 1 2282 2623 2084 + 2776 1 2150 2152 2151 + 2777 1 2296 2298 2297 + 2778 1 2334 2559 2333 + 2779 1 156 2370 5 + 2780 1 231 2223 146 + 2781 1 247 2370 156 + 2782 1 193 2176 192 + 2783 1 221 2261 195 + 2784 1 369 370 367 + 2785 1 370 2345 1139 + 2786 1 373 2365 388 + 2787 1 408 903 397 + 2788 1 498 503 497 + 2789 1 504 532 503 + 2790 1 534 555 535 + 2791 1 2045 2046 547 + 2792 1 2240 2290 574 + 2793 1 650 2181 1143 + 2794 1 720 2413 719 + 2795 1 722 2269 1074 + 2796 1 748 2434 745 + 2797 1 776 1105 987 + 2798 1 871 874 873 + 2799 1 875 877 874 + 2800 1 875 2359 1457 + 2801 1 878 879 877 + 2802 1 880 892 879 + 2803 1 1003 2141 1004 + 2804 1 1005 1214 1003 + 2805 1 1105 1544 1382 + 2806 1 1142 1254 1141 + 2807 1 1148 1419 1146 + 2808 1 1147 2203 1149 + 2809 1 1154 1157 1156 + 2810 1 1203 1204 1201 + 2811 1 1208 1266 1209 + 2812 1 1215 1545 1214 + 2813 1 1359 1429 1233 + 2814 1 1249 1609 1242 + 2815 1 1246 2112 2110 + 2816 1 1443 1458 1423 + 2817 1 2251 2426 1443 + 2818 1 1711 1982 1712 + 2819 1 67 270 66 + 2820 1 124 2220 123 + 2821 1 526 554 467 + 2822 1 522 2087 524 + 2823 1 565 594 593 + 2824 1 566 591 571 + 2825 1 1445 2418 572 + 2826 1 633 635 588 + 2827 1 653 654 652 + 2828 1 658 659 657 + 2829 1 684 730 683 + 2830 1 685 755 686 + 2831 1 690 692 691 + 2832 1 717 2120 1124 + 2833 1 726 985 727 + 2834 1 727 729 728 + 2835 1 788 2310 2241 + 2836 1 793 794 792 + 2837 1 1011 2311 794 + 2838 1 816 818 817 + 2839 1 1293 2312 817 + 2840 1 818 1021 1020 + 2841 1 829 831 830 + 2842 1 858 863 861 + 2843 1 863 864 861 + 2844 1 863 865 864 + 2845 1 865 870 864 + 2846 1 865 871 870 + 2847 1 1171 2359 865 + 2848 1 873 938 876 + 2849 1 875 1457 878 + 2850 1 1167 2008 876 + 2851 1 884 2092 888 + 2852 1 895 1030 893 + 2853 1 904 905 903 + 2854 1 903 2449 2132 + 2855 1 906 1003 905 + 2856 1 980 1642 1464 + 2857 1 1007 2545 1006 + 2858 1 1021 2324 2292 + 2859 1 1030 2383 2375 + 2860 1 1064 1367 1366 + 2861 1 1071 1072 1070 + 2862 1 1098 2165 1375 + 2863 1 1124 2554 1126 + 2864 1 1204 1206 1205 + 2865 1 1206 1376 1259 + 2866 1 1248 1608 1241 + 2867 1 1269 1390 1270 + 2868 1 1415 1960 1959 + 2869 1 1457 2497 2405 + 2870 1 1461 2383 1554 + 2871 1 1608 1747 1616 + 2872 1 1740 1741 1738 + 2873 1 1741 1742 1738 + 2874 1 1855 1889 1856 + 2875 1 2090 2687 2091 + 2876 1 2516 2529 2414 + 2877 1 264 2263 16 + 2878 1 229 2357 48 + 2879 1 58 251 57 + 2880 1 65 222 64 + 2881 1 71 258 70 + 2882 1 155 247 156 + 2883 1 188 2175 187 + 2884 1 2279 2644 423 + 2885 1 435 2238 2059 + 2886 1 521 2196 482 + 2887 1 523 1455 521 + 2888 1 569 623 539 + 2889 1 541 565 564 + 2890 1 565 592 564 + 2891 1 565 593 592 + 2892 1 570 590 589 + 2893 1 591 636 606 + 2894 1 711 712 623 + 2895 1 2307 2420 625 + 2896 1 673 674 644 + 2897 1 651 652 650 + 2898 1 680 2492 812 + 2899 1 681 722 721 + 2900 1 957 2308 712 + 2901 1 717 1124 981 + 2902 1 722 984 983 + 2903 1 813 2286 797 + 2904 1 2247 2433 799 + 2905 1 916 923 915 + 2906 1 922 925 920 + 2907 1 929 2551 1000 + 2908 1 1471 2474 953 + 2909 1 1005 1337 1215 + 2910 1 1009 1059 1057 + 2911 1 1059 1244 1238 + 2912 1 1672 2794 1142 + 2913 1 1161 1249 1242 + 2914 1 1180 2233 1182 + 2915 1 1234 1359 1233 + 2916 1 1245 1592 1591 + 2917 1 1964 2435 1281 + 2918 1 1664 1678 1289 + 2919 1 1607 1919 1359 + 2920 1 1393 1812 1390 + 2921 1 1459 1685 1488 + 2922 1 1535 1559 1534 + 2923 1 1675 1927 1546 + 2924 1 1807 2828 2804 + 2925 1 475 477 476 + 2926 1 481 483 482 + 2927 1 500 506 505 + 2928 1 598 599 597 + 2929 1 601 1993 599 + 2930 1 602 603 601 + 2931 1 602 2021 604 + 2932 1 604 605 603 + 2933 1 694 695 692 + 2934 1 749 750 748 + 2935 1 750 752 751 + 2936 1 753 754 752 + 2937 1 1163 1164 813 + 2938 1 914 915 913 + 2939 1 919 931 921 + 2940 1 948 2622 2023 + 2941 1 2506 2576 972 + 2942 1 1366 1560 1063 + 2943 1 1077 1291 1078 + 2944 1 2255 2677 1080 + 2945 1 1085 2341 1223 + 2946 1 1152 1153 1151 + 2947 1 1184 2708 2262 + 2948 1 1572 1575 1230 + 2949 1 1605 1746 1615 + 2950 1 1647 1648 1626 + 2951 1 2114 2115 1858 + 2952 1 1993 1995 1994 + 2953 1 2005 2205 2004 + 2954 1 2077 2746 2076 + 2955 1 15 2263 227 + 2956 1 56 275 55 + 2957 1 97 253 96 + 2958 1 99 233 98 + 2959 1 233 2344 98 + 2960 1 101 260 100 + 2961 1 260 2072 100 + 2962 1 153 276 154 + 2963 1 158 274 157 + 2964 1 160 248 159 + 2965 1 163 234 162 + 2966 1 166 228 165 + 2967 1 230 2224 199 + 2968 1 296 2265 298 + 2969 1 494 498 497 + 2970 1 517 2465 496 + 2971 1 504 533 532 + 2972 1 547 566 553 + 2973 1 560 2387 561 + 2974 1 661 662 580 + 2975 1 592 1147 1146 + 2976 1 638 2021 602 + 2977 1 651 655 653 + 2978 1 685 907 755 + 2979 1 737 738 708 + 2980 1 737 739 738 + 2981 1 747 766 749 + 2982 1 753 2285 1469 + 2983 1 883 2630 2053 + 2984 1 890 1686 1073 + 2985 1 942 2319 2239 + 2986 1 1994 2626 954 + 2987 1 1062 2493 1705 + 2988 1 1142 1255 1254 + 2989 1 1158 1940 1160 + 2990 1 2082 2709 1165 + 2991 1 1285 1658 1284 + 2992 1 2075 2076 1297 + 2993 1 1339 1663 1662 + 2994 1 1446 1989 1360 + 2995 1 1386 1798 1549 + 2996 1 1473 1476 1474 + 2997 1 1838 1839 1652 + 2998 1 1689 1964 1857 + 2999 1 2401 2667 1700 + 3000 1 1727 1728 1726 + 3001 1 1782 1783 1781 + 3002 1 1932 1934 1931 + 3003 1 5 2070 200 + 3004 1 69 213 68 + 3005 1 70 2200 69 + 3006 1 258 2200 70 + 3007 1 74 205 73 + 3008 1 95 225 94 + 3009 1 253 2377 96 + 3010 1 113 2093 226 + 3011 1 284 285 283 + 3012 1 296 2277 2265 + 3013 1 2159 2393 399 + 3014 1 446 447 444 + 3015 1 473 475 474 + 3016 1 511 2423 567 + 3017 1 518 547 546 + 3018 1 572 607 559 + 3019 1 590 627 589 + 3020 1 678 2356 605 + 3021 1 630 646 645 + 3022 1 636 671 670 + 3023 1 694 696 695 + 3024 1 703 970 702 + 3025 1 716 2213 2154 + 3026 1 722 983 721 + 3027 1 723 2493 764 + 3028 1 764 1062 1060 + 3029 1 913 2061 1477 + 3030 1 1144 1145 946 + 3031 1 991 2527 1097 + 3032 1 1292 1926 1078 + 3033 1 1333 2341 1085 + 3034 1 1086 1524 1334 + 3035 1 1126 1240 1125 + 3036 1 1187 2143 1185 + 3037 1 1186 1192 1188 + 3038 1 1186 2262 1192 + 3039 1 1188 1979 1190 + 3040 1 1189 2144 1195 + 3041 1 1979 1980 1199 + 3042 1 1234 2413 1446 + 3043 1 1245 1591 1372 + 3044 1 1298 2003 1671 + 3045 1 1339 1662 1661 + 3046 1 1733 1734 1355 + 3047 1 1624 1625 1358 + 3048 1 1361 1916 1605 + 3049 1 1770 1771 1372 + 3050 1 1438 1448 1437 + 3051 1 1492 1493 1491 + 3052 1 1524 1710 1525 + 3053 1 1533 2037 1529 + 3054 1 1565 2811 2808 + 3055 1 1610 1748 1617 + 3056 1 1622 1781 1621 + 3057 1 1671 2512 1951 + 3058 1 1676 2323 2322 + 3059 1 2154 2213 2149 + 3060 1 57 2343 56 + 3061 1 134 206 133 + 3062 1 139 214 138 + 3063 1 288 772 290 + 3064 1 291 952 289 + 3065 1 448 1077 447 + 3066 1 452 454 453 + 3067 1 484 2100 1012 + 3068 1 491 2353 1029 + 3069 1 538 539 514 + 3070 1 518 546 530 + 3071 1 550 573 551 + 3072 1 569 2354 711 + 3073 1 570 1168 590 + 3074 1 636 637 606 + 3075 1 942 2239 623 + 3076 1 699 2602 2179 + 3077 1 964 2306 701 + 3078 1 729 974 761 + 3079 1 752 2202 757 + 3080 1 783 1680 781 + 3081 1 801 1144 946 + 3082 1 963 1202 945 + 3083 1 1059 2703 1245 + 3084 1 1065 1110 1066 + 3085 1 2077 2078 1076 + 3086 1 1319 1428 1083 + 3087 1 1086 1334 1333 + 3088 1 1254 1370 1141 + 3089 1 1144 1338 1145 + 3090 1 1152 2227 1154 + 3091 1 1154 1158 1157 + 3092 1 1608 1616 1241 + 3093 1 1245 1372 1244 + 3094 1 1264 1265 1263 + 3095 1 1658 1659 1284 + 3096 1 1712 1776 1381 + 3097 1 1777 1778 1399 + 3098 1 1403 1646 1588 + 3099 1 1430 2351 1431 + 3100 1 1655 2588 1435 + 3101 1 1530 1531 1529 + 3102 1 1530 1717 1532 + 3103 1 1630 1632 1631 + 3104 1 1651 1838 1652 + 3105 1 2430 2579 2178 + 3106 1 59 278 58 + 3107 1 113 226 112 + 3108 1 300 301 299 + 3109 1 301 612 299 + 3110 1 302 303 301 + 3111 1 304 305 303 + 3112 1 307 552 305 + 3113 1 495 2451 527 + 3114 1 524 537 536 + 3115 1 588 1024 577 + 3116 1 730 1489 683 + 3117 1 697 698 696 + 3118 1 704 2355 1140 + 3119 1 999 2404 740 + 3120 1 1174 2562 765 + 3121 1 912 2568 914 + 3122 1 931 953 921 + 3123 1 960 1040 1039 + 3124 1 996 2543 997 + 3125 1 1140 1142 1141 + 3126 1 1140 1672 1142 + 3127 1 1158 1159 1157 + 3128 1 1160 1161 1159 + 3129 1 1237 1344 1198 + 3130 1 1237 1345 1344 + 3131 1 1282 1400 1283 + 3132 1 1558 1564 1336 + 3133 1 1348 1349 1347 + 3134 1 1369 1613 1367 + 3135 1 1505 1507 1506 + 3136 1 1514 2587 1543 + 3137 1 1930 1931 1654 + 3138 1 1936 2488 1935 + 3139 1 19 219 18 + 3140 1 24 211 23 + 3141 1 36 2236 208 + 3142 1 225 2071 94 + 3143 1 194 257 193 + 3144 1 432 525 467 + 3145 1 699 2179 432 + 3146 1 507 819 509 + 3147 1 563 587 577 + 3148 1 591 606 571 + 3149 1 755 756 686 + 3150 1 764 765 724 + 3151 1 762 996 763 + 3152 1 988 1069 777 + 3153 1 1115 1116 984 + 3154 1 1055 1257 1054 + 3155 1 1358 2553 1054 + 3156 1 1383 1644 1109 + 3157 1 1117 1861 1246 + 3158 1 1149 1150 1148 + 3159 1 1249 1626 1609 + 3160 1 1504 2648 2232 + 3161 1 288 289 287 + 3162 1 472 1013 461 + 3163 1 484 522 521 + 3164 1 522 524 523 + 3165 1 1012 2087 522 + 3166 1 524 536 523 + 3167 1 537 563 536 + 3168 1 606 611 571 + 3169 1 1024 2417 577 + 3170 1 653 656 654 + 3171 1 689 690 659 + 3172 1 691 2431 659 + 3173 1 684 803 731 + 3174 1 690 693 692 + 3175 1 755 762 756 + 3176 1 775 2415 998 + 3177 1 799 2433 801 + 3178 1 2049 2050 803 + 3179 1 1140 1141 991 + 3180 1 2101 2102 1012 + 3181 1 1059 1238 1057 + 3182 1 1661 2368 1145 + 3183 1 1154 1156 1153 + 3184 1 1269 1393 1390 + 3185 1 1656 2230 1425 + 3186 1 1507 2511 1508 + 3187 1 1557 2735 2590 + 3188 1 45 223 44 + 3189 1 92 2409 91 + 3190 1 169 2128 168 + 3191 1 179 2411 178 + 3192 1 187 207 186 + 3193 1 207 2189 186 + 3194 1 192 215 191 + 3195 1 258 2201 2200 + 3196 1 445 2346 446 + 3197 1 453 2412 450 + 3198 1 477 478 476 + 3199 1 513 538 514 + 3200 1 518 530 517 + 3201 1 524 545 537 + 3202 1 546 558 530 + 3203 1 563 577 536 + 3204 1 564 2591 540 + 3205 1 553 2490 546 + 3206 1 558 649 648 + 3207 1 592 1146 564 + 3208 1 1143 2225 648 + 3209 1 649 651 650 + 3210 1 651 653 652 + 3211 1 809 2181 652 + 3212 1 673 2492 680 + 3213 1 729 975 974 + 3214 1 750 751 748 + 3215 1 752 757 751 + 3216 1 776 777 775 + 3217 1 945 2432 800 + 3218 1 821 889 822 + 3219 1 1074 1115 984 + 3220 1 992 1243 1106 + 3221 1 992 2704 1243 + 3222 1 1057 1058 1010 + 3223 1 1110 1111 1066 + 3224 1 1077 2412 2083 + 3225 1 1291 1292 1078 + 3226 1 1282 1283 1101 + 3227 1 1114 1550 1441 + 3228 1 1117 1246 1239 + 3229 1 1149 1152 1151 + 3230 1 1163 1420 1411 + 3231 1 1248 1834 1608 + 3232 1 1413 1664 1289 + 3233 1 1424 1425 1292 + 3234 1 1403 1588 1378 + 3235 1 1420 2056 2055 + 3236 1 1425 1645 1426 + 3237 1 1473 1474 1472 + 3238 1 1592 1593 1591 + 3239 1 1640 1925 1910 + 3240 1 1930 1957 1933 + 3241 1 2045 2624 2229 + 3242 1 77 236 76 + 3243 1 134 2258 206 + 3244 1 141 267 140 + 3245 1 184 237 183 + 3246 1 189 256 188 + 3247 1 290 291 289 + 3248 1 290 2099 292 + 3249 1 389 390 378 + 3250 1 484 521 482 + 3251 1 490 2079 1494 + 3252 1 522 523 521 + 3253 1 523 2417 1455 + 3254 1 629 2578 603 + 3255 1 604 678 605 + 3256 1 665 679 666 + 3257 1 679 769 732 + 3258 1 711 957 712 + 3259 1 981 982 718 + 3260 1 983 1975 721 + 3261 1 1295 1296 889 + 3262 1 1322 1323 951 + 3263 1 1502 2572 965 + 3264 1 1018 1308 1016 + 3265 1 1017 1298 1019 + 3266 1 1111 1309 1066 + 3267 1 1095 1353 1211 + 3268 1 1162 1665 1330 + 3269 1 1353 1354 1211 + 3270 1 1487 2494 1211 + 3271 1 1230 2800 1911 + 3272 1 1429 2521 1233 + 3273 1 1244 1606 1238 + 3274 1 1296 1498 1497 + 3275 1 1499 1500 1498 + 3276 1 1941 2626 1523 + 3277 1 1658 1871 1659 + 3278 1 1838 1840 1839 + 3279 1 2005 2206 2205 + 3280 1 2150 2335 2153 + 3281 1 2320 2450 2171 + 3282 1 2211 2600 2324 + 3283 1 43 262 42 + 3284 1 115 271 114 + 3285 1 200 2070 230 + 3286 1 308 811 310 + 3287 1 418 2398 1511 + 3288 1 488 2398 427 + 3289 1 428 461 460 + 3290 1 432 2179 525 + 3291 1 452 455 454 + 3292 1 455 457 456 + 3293 1 456 2283 462 + 3294 1 463 1433 458 + 3295 1 460 2079 490 + 3296 1 471 472 461 + 3297 1 473 474 472 + 3298 1 478 489 476 + 3299 1 477 1172 479 + 3300 1 494 624 498 + 3301 1 495 527 515 + 3302 1 516 517 496 + 3303 1 503 1075 497 + 3304 1 1075 2291 497 + 3305 1 513 2394 538 + 3306 1 550 551 526 + 3307 1 548 557 532 + 3308 1 550 2240 574 + 3309 1 566 571 553 + 3310 1 575 782 781 + 3311 1 2303 2304 575 + 3312 1 578 661 580 + 3313 1 596 597 595 + 3314 1 701 1217 608 + 3315 1 628 644 642 + 3316 1 718 1320 643 + 3317 1 1136 1137 661 + 3318 1 1715 2356 678 + 3319 1 699 2614 2602 + 3320 1 712 943 942 + 3321 1 754 2202 752 + 3322 1 767 768 754 + 3323 1 777 2415 775 + 3324 1 784 786 785 + 3325 1 790 2243 784 + 3326 1 801 945 800 + 3327 1 800 2432 1300 + 3328 1 801 2433 1144 + 3329 1 807 994 805 + 3330 1 1281 2435 806 + 3331 1 812 2520 1163 + 3332 1 943 1318 1083 + 3333 1 946 963 945 + 3334 1 963 1212 1202 + 3335 1 984 2321 983 + 3336 1 1108 1235 995 + 3337 1 1012 2102 2087 + 3338 1 1033 1696 1037 + 3339 1 1340 1435 1039 + 3340 1 1061 1873 1174 + 3341 1 1098 1099 1072 + 3342 1 1428 2319 1083 + 3343 1 1104 1303 1301 + 3344 1 1250 2321 1116 + 3345 1 1138 1700 1137 + 3346 1 1144 1677 1338 + 3347 1 1488 2432 1202 + 3348 1 1212 1561 1459 + 3349 1 1414 2014 1285 + 3350 1 1322 2401 1324 + 3351 1 1324 1481 1480 + 3352 1 1363 1619 1604 + 3353 1 1420 2055 1660 + 3354 1 1699 2025 1428 + 3355 1 2401 2631 1481 + 3356 1 1517 1949 1516 + 3357 1 1661 2500 2368 + 3358 1 1690 1823 1691 + 3359 1 1836 2733 1835 + 3360 1 2283 2452 2451 + 3361 1 2287 2638 2288 + 3362 1 2655 2691 2324 + 3363 1 27 242 26 + 3364 1 223 2275 44 + 3365 1 61 232 60 + 3366 1 63 259 62 + 3367 1 64 2397 63 + 3368 1 273 2409 92 + 3369 1 2094 2411 179 + 3370 1 477 479 478 + 3371 1 483 2100 484 + 3372 1 605 630 629 + 3373 1 663 665 619 + 3374 1 666 2478 619 + 3375 1 702 2044 663 + 3376 1 698 705 696 + 3377 1 700 1033 964 + 3378 1 970 2494 702 + 3379 1 736 737 708 + 3380 1 729 2480 975 + 3381 1 741 742 740 + 3382 1 743 746 742 + 3383 1 976 2285 749 + 3384 1 914 917 916 + 3385 1 2330 2681 936 + 3386 1 961 2244 1026 + 3387 1 1106 1107 993 + 3388 1 1107 1304 993 + 3389 1 1064 1366 1063 + 3390 1 1147 1148 1146 + 3391 1 1566 1571 1226 + 3392 1 1234 1446 1360 + 3393 1 1264 1585 1373 + 3394 1 1553 2652 1286 + 3395 1 1431 2312 1293 + 3396 1 2244 2588 1329 + 3397 1 1621 1624 1358 + 3398 1 1400 1402 1401 + 3399 1 2207 2519 1479 + 3400 1 1486 1521 1483 + 3401 1 1692 1693 1512 + 3402 1 2635 2650 1542 + 3403 1 2245 2518 2267 + 3404 1 33 240 32 + 3405 1 38 261 37 + 3406 1 131 241 130 + 3407 1 136 266 135 + 3408 1 166 2073 228 + 3409 1 335 423 337 + 3410 1 355 364 360 + 3411 1 358 2505 2301 + 3412 1 1280 1416 464 + 3413 1 481 492 483 + 3414 1 492 494 493 + 3415 1 498 504 503 + 3416 1 510 2015 544 + 3417 1 542 543 529 + 3418 1 550 574 573 + 3419 1 575 781 551 + 3420 1 1217 2303 608 + 3421 1 614 2180 613 + 3422 1 613 1123 615 + 3423 1 685 2407 907 + 3424 1 734 735 688 + 3425 1 1207 2434 751 + 3426 1 786 787 785 + 3427 1 935 2540 793 + 3428 1 817 2312 815 + 3429 1 816 1014 818 + 3430 1 879 2535 877 + 3431 1 904 2373 1036 + 3432 1 1465 2387 955 + 3433 1 1034 1035 956 + 3434 1 971 1095 970 + 3435 1 1104 1301 990 + 3436 1 1011 2580 2311 + 3437 1 1084 1290 1023 + 3438 1 1031 2375 1461 + 3439 1 1037 1341 1038 + 3440 1 1064 1368 1367 + 3441 1 1318 1319 1083 + 3442 1 1135 2150 2149 + 3443 1 1703 1704 1327 + 3444 1 1653 1654 1388 + 3445 1 1610 1617 1533 + 3446 1 1545 1675 1546 + 3447 1 1581 2039 2038 + 3448 1 2057 2553 1625 + 3449 1 1681 2423 2422 + 3450 1 1856 2584 1695 + 3451 1 1808 1826 1807 + 3452 1 5 2370 2070 + 3453 1 120 272 119 + 3454 1 125 243 124 + 3455 1 304 409 306 + 3456 1 313 519 311 + 3457 1 323 941 321 + 3458 1 322 1165 324 + 3459 1 325 2129 323 + 3460 1 326 329 328 + 3461 1 348 410 327 + 3462 1 380 384 382 + 3463 1 2402 2519 384 + 3464 1 391 2330 395 + 3465 1 396 2331 392 + 3466 1 411 415 410 + 3467 1 1511 2430 413 + 3468 1 430 431 429 + 3469 1 432 467 431 + 3470 1 436 439 434 + 3471 1 525 526 467 + 3472 1 551 2135 526 + 3473 1 2329 2610 576 + 3474 1 578 1136 661 + 3475 1 668 2471 633 + 3476 1 698 706 705 + 3477 1 974 1065 761 + 3478 1 868 2316 2063 + 3479 1 2331 2332 937 + 3480 1 949 2320 1335 + 3481 1 958 1086 1085 + 3482 1 1054 2553 977 + 3483 1 978 1056 1055 + 3484 1 1062 1248 1241 + 3485 1 1072 1112 1070 + 3486 1 1113 2435 1689 + 3487 1 1161 1242 1159 + 3488 1 1401 1736 1620 + 3489 1 1478 2369 1733 + 3490 1 2368 2500 1706 + 3491 1 1799 1809 1798 + 3492 1 2179 2289 2240 + 3493 1 2312 2327 2310 + 3494 1 17 2252 264 + 3495 1 314 2504 316 + 3496 1 329 331 330 + 3497 1 331 333 332 + 3498 1 780 2279 333 + 3499 1 362 610 359 + 3500 1 364 365 360 + 3501 1 361 579 366 + 3502 1 367 2281 362 + 3503 1 371 372 365 + 3504 1 380 382 381 + 3505 1 576 2208 381 + 3506 1 382 386 383 + 3507 1 386 391 387 + 3508 1 388 626 625 + 3509 1 393 394 390 + 3510 1 390 2393 2358 + 3511 1 391 395 392 + 3512 1 397 398 394 + 3513 1 395 403 396 + 3514 1 429 2331 396 + 3515 1 402 412 406 + 3516 1 408 2373 904 + 3517 1 414 418 413 + 3518 1 459 2436 486 + 3519 1 1013 2079 461 + 3520 1 487 1135 485 + 3521 1 501 2015 510 + 3522 1 508 534 512 + 3523 1 525 550 526 + 3524 1 543 2422 529 + 3525 1 558 1221 649 + 3526 1 607 1421 559 + 3527 1 574 608 573 + 3528 1 584 586 582 + 3529 1 584 618 586 + 3530 1 596 598 597 + 3531 1 700 701 608 + 3532 1 621 2180 614 + 3533 1 626 710 709 + 3534 1 677 758 641 + 3535 1 647 733 687 + 3536 1 662 2305 1034 + 3537 1 681 2269 722 + 3538 1 701 1331 1217 + 3539 1 891 2088 705 + 3540 1 707 972 736 + 3541 1 710 2256 950 + 3542 1 725 2493 723 + 3543 1 739 740 738 + 3544 1 779 2016 2015 + 3545 1 2267 2309 789 + 3546 1 2106 2163 843 + 3547 1 892 947 879 + 3548 1 897 2548 895 + 3549 1 898 900 899 + 3550 1 900 902 901 + 3551 1 935 2518 2509 + 3552 1 943 1456 1318 + 3553 1 1031 1032 947 + 3554 1 949 1335 1084 + 3555 1 1026 1329 1218 + 3556 1 1033 1697 1696 + 3557 1 1052 1316 1050 + 3558 1 1086 1333 1085 + 3559 1 1107 1657 1304 + 3560 1 1708 2514 1170 + 3561 1 1213 1466 1465 + 3562 1 1274 1275 1220 + 3563 1 1220 2273 2245 + 3564 1 1243 2704 2057 + 3565 1 1378 1595 1253 + 3566 1 1261 2669 1264 + 3567 1 1917 1918 1317 + 3568 1 2306 2731 1331 + 3569 1 2168 2172 1332 + 3570 1 1342 2446 1513 + 3571 1 1582 2541 1354 + 3572 1 1405 1463 1462 + 3573 1 1851 2145 1405 + 3574 1 1458 1845 1423 + 3575 1 1424 1656 1425 + 3576 1 1463 1695 1694 + 3577 1 1573 1732 1572 + 3578 1 1646 1772 1588 + 3579 1 1882 1884 1883 + 3580 1 1897 1899 1898 + 3581 1 1899 1901 1900 + 3582 1 2017 2018 2016 + 3583 1 2075 2077 2076 + 3584 1 2122 2124 2123 + 3585 1 2150 2151 2149 + 3586 1 2155 2157 2156 + 3587 1 2157 2438 2158 + 3588 1 220 2128 169 + 3589 1 308 309 307 + 3590 1 310 311 309 + 3591 1 318 319 317 + 3592 1 336 385 334 + 3593 1 411 416 415 + 3594 1 455 456 454 + 3595 1 470 500 499 + 3596 1 495 515 496 + 3597 1 507 508 506 + 3598 1 664 2557 703 + 3599 1 703 2557 1122 + 3600 1 704 1140 991 + 3601 1 739 2161 2160 + 3602 1 977 2704 769 + 3603 1 770 1945 978 + 3604 1 892 1031 947 + 3605 1 980 1464 944 + 3606 1 1103 1253 996 + 3607 1 1288 2536 1032 + 3608 1 1091 1343 1089 + 3609 1 1122 2688 1921 + 3610 1 1126 1649 1247 + 3611 1 1212 1459 1202 + 3612 1 1267 1534 1209 + 3613 1 1244 2113 1606 + 3614 1 1279 2812 2503 + 3615 1 1353 1584 1579 + 3616 1 1422 2611 1879 + 3617 1 1577 1581 1552 + 3618 1 1772 1797 1588 + 3619 1 1769 1882 1881 + 3620 1 261 2236 37 + 3621 1 41 2237 216 + 3622 1 115 2222 271 + 3623 1 318 549 320 + 3624 1 380 381 379 + 3625 1 386 387 383 + 3626 1 426 2238 435 + 3627 1 1452 2331 429 + 3628 1 433 1279 464 + 3629 1 1416 2095 464 + 3630 1 620 675 667 + 3631 1 630 1495 646 + 3632 1 769 992 732 + 3633 1 741 743 742 + 3634 1 768 775 774 + 3635 1 871 873 870 + 3636 1 880 894 893 + 3637 1 894 896 895 + 3638 1 948 959 902 + 3639 1 1068 1362 1258 + 3640 1 1105 1382 1109 + 3641 1 1606 1614 1238 + 3642 1 1531 1610 1533 + 3643 1 2784 2798 1563 + 3644 1 2853 2873 1818 + 3645 1 2006 2823 2815 + 3646 1 68 2219 67 + 3647 1 110 235 109 + 3648 1 267 2259 140 + 3649 1 212 2410 174 + 3650 1 237 2391 183 + 3651 1 256 2175 188 + 3652 1 282 1991 284 + 3653 1 337 2293 339 + 3654 1 422 438 437 + 3655 1 555 556 535 + 3656 1 538 568 539 + 3657 1 545 1445 572 + 3658 1 555 2491 556 + 3659 1 709 2307 625 + 3660 1 679 732 666 + 3661 1 675 684 683 + 3662 1 704 991 965 + 3663 1 822 823 820 + 3664 1 828 882 827 + 3665 1 2089 2091 872 + 3666 1 909 1016 1015 + 3667 1 918 2625 916 + 3668 1 923 927 924 + 3669 1 927 928 924 + 3670 1 927 1041 928 + 3671 1 967 1087 966 + 3672 1 1068 1363 1362 + 3673 1 1072 2636 1112 + 3674 1 1123 1708 1170 + 3675 1 1432 1496 1203 + 3676 1 1354 1487 1211 + 3677 1 1634 2013 1251 + 3678 1 1267 2360 1536 + 3679 1 1272 1422 1271 + 3680 1 2325 2482 1276 + 3681 1 1287 1409 1288 + 3682 1 2593 2603 1319 + 3683 1 1366 2065 1611 + 3684 1 1375 1875 1761 + 3685 1 1409 1825 1410 + 3686 1 1458 2426 2235 + 3687 1 1492 1707 1623 + 3688 1 1516 1987 1515 + 3689 1 2172 2477 1518 + 3690 1 1542 2676 2635 + 3691 1 1600 1768 1601 + 3692 1 1993 2578 1995 + 3693 1 2470 2623 2282 + 3694 1 2350 2671 2498 + 3695 1 47 263 46 + 3696 1 49 229 48 + 3697 1 52 245 51 + 3698 1 107 249 106 + 3699 1 122 2419 210 + 3700 1 203 2127 127 + 3701 1 194 2261 257 + 3702 1 581 2571 535 + 3703 1 1320 2516 643 + 3704 1 747 748 745 + 3705 1 1065 1066 761 + 3706 1 833 872 835 + 3707 1 839 869 841 + 3708 1 841 2106 843 + 3709 1 873 2270 938 + 3710 1 1211 2494 970 + 3711 1 1009 1010 1007 + 3712 1 1059 1245 1244 + 3713 1 1097 1555 1503 + 3714 1 1106 1256 1107 + 3715 1 1118 1679 1120 + 3716 1 2076 2468 1297 + 3717 1 1330 2695 1325 + 3718 1 2216 2597 1370 + 3719 1 1398 1777 1399 + 3720 1 1778 1780 1399 + 3721 1 1403 1870 1646 + 3722 1 2544 2693 1487 + 3723 1 1508 2511 1737 + 3724 1 1530 1532 1531 + 3725 1 1551 2674 1539 + 3726 1 2045 2229 2046 + 3727 1 18 2252 17 + 3728 1 242 2199 26 + 3729 1 262 2237 42 + 3730 1 125 2381 243 + 3731 1 168 2128 268 + 3732 1 450 2412 448 + 3733 1 513 514 491 + 3734 1 505 2104 1176 + 3735 1 534 535 512 + 3736 1 627 2516 589 + 3737 1 600 602 601 + 3738 1 717 718 643 + 3739 1 697 2507 2506 + 3740 1 719 979 944 + 3741 1 762 1103 996 + 3742 1 762 2378 1103 + 3743 1 838 867 836 + 3744 1 845 848 847 + 3745 1 851 857 853 + 3746 1 856 860 854 + 3747 1 2013 2817 982 + 3748 1 1131 1133 1132 + 3749 1 1140 2355 1672 + 3750 1 1168 2723 2137 + 3751 1 1200 1203 1201 + 3752 1 1291 1424 1292 + 3753 1 1352 1540 1539 + 3754 1 1485 1517 1516 + 3755 1 1509 2688 1917 + 3756 1 1710 2682 1525 + 3757 1 1587 1766 1586 + 3758 1 2161 2385 1650 + 3759 1 2395 2806 1936 + 3760 1 2452 2573 2255 + 3761 1 140 2259 139 + 3762 1 139 2259 214 + 3763 1 279 282 281 + 3764 1 282 284 283 + 3765 1 448 2412 1077 + 3766 1 456 458 454 + 3767 1 462 463 458 + 3768 1 506 2104 505 + 3769 1 505 1176 531 + 3770 1 643 2516 627 + 3771 1 696 2088 695 + 3772 1 727 2480 729 + 3773 1 985 2480 727 + 3774 1 809 2376 2085 + 3775 1 946 2368 963 + 3776 1 1182 1200 1184 + 3777 1 1361 1414 1285 + 3778 1 1314 1407 1336 + 3779 1 1386 1799 1798 + 3780 1 1561 2456 1459 + 3781 1 1597 1600 1599 + 3782 1 1982 1983 1712 + 3783 1 2494 2693 2044 + 3784 1 16 2263 15 + 3785 1 219 2252 18 + 3786 1 30 201 29 + 3787 1 128 203 127 + 3788 1 284 286 285 + 3789 1 479 481 480 + 3790 1 558 648 530 + 3791 1 569 2414 2354 + 3792 1 634 1297 669 + 3793 1 719 944 668 + 3794 1 958 2537 1086 + 3795 1 1075 2284 2115 + 3796 1 1177 1180 1179 + 3797 1 1180 1182 1181 + 3798 1 1259 1437 1205 + 3799 1 1660 1939 1411 + 3800 1 2075 2406 1421 + 3801 1 2285 2502 1469 + 3802 1 2194 2428 1923 + 3803 1 135 2258 134 + 3804 1 460 490 488 + 3805 1 473 676 475 + 3806 1 475 2583 477 + 3807 1 1029 2398 488 + 3808 1 490 513 491 + 3809 1 574 700 608 + 3810 1 584 2668 618 + 3811 1 589 2516 2414 + 3812 1 628 642 627 + 3813 1 660 2513 2334 + 3814 1 1137 2305 661 + 3815 1 775 998 774 + 3816 1 822 2314 824 + 3817 1 1108 2547 1384 + 3818 1 1143 2226 2225 + 3819 1 1183 1185 1181 + 3820 1 1185 2460 1181 + 3821 1 1581 2038 1552 + 3822 1 1689 1857 1690 + 3823 1 1698 2614 1699 + 3824 1 1720 1721 1719 + 3825 1 1802 2806 2759 + 3826 1 1863 1865 1864 + 3827 1 2529 2538 2537 + 3828 1 56 2343 275 + 3829 1 91 2409 217 + 3830 1 93 2071 273 + 3831 1 116 2222 115 + 3832 1 243 2220 124 + 3833 1 126 2381 125 + 3834 1 178 2411 239 + 3835 1 286 288 287 + 3836 1 419 427 418 + 3837 1 452 453 450 + 3838 1 1172 2484 479 + 3839 1 492 493 483 + 3840 1 494 497 493 + 3841 1 515 516 496 + 3842 1 533 548 532 + 3843 1 683 2407 667 + 3844 1 708 2403 706 + 3845 1 951 2307 709 + 3846 1 758 2633 2139 + 3847 1 807 2140 994 + 3848 1 830 2097 828 + 3849 1 931 2639 1415 + 3850 1 1122 2386 971 + 3851 1 1081 2634 1018 + 3852 1 1687 2086 1079 + 3853 1 1148 2549 1419 + 3854 1 1170 2514 1453 + 3855 1 1174 2563 2562 + 3856 1 1681 2422 1175 + 3857 1 1186 1187 1185 + 3858 1 1188 1189 1187 + 3859 1 1190 1191 1189 + 3860 1 1193 1194 1191 + 3861 1 2272 2533 1468 + 3862 1 2533 2633 1468 + 3863 1 1493 1954 1491 + 3864 1 1569 1570 1514 + 3865 1 1528 2526 1526 + 3866 1 1552 1946 1551 + 3867 1 1803 1972 1599 + 3868 1 2003 2512 1671 + 3869 1 2152 2599 2151 + 3870 1 2220 2419 123 + 3871 1 292 293 291 + 3872 1 937 2329 387 + 3873 1 2179 2240 525 + 3874 1 545 559 537 + 3875 1 556 2491 584 + 3876 1 575 2304 782 + 3877 1 582 585 581 + 3878 1 954 2467 597 + 3879 1 630 645 629 + 3880 1 672 2680 637 + 3881 1 1489 2407 683 + 3882 1 723 764 724 + 3883 1 764 1060 765 + 3884 1 812 813 797 + 3885 1 1037 1038 964 + 3886 1 1040 1340 1039 + 3887 1 1194 2006 1196 + 3888 1 1197 1198 1194 + 3889 1 1225 1719 1718 + 3890 1 1229 1566 1226 + 3891 1 1668 2546 1301 + 3892 1 1312 1315 1314 + 3893 1 1328 2717 2533 + 3894 1 1651 1652 1376 + 3895 1 1431 2327 2312 + 3896 1 1449 1450 1448 + 3897 1 1449 2721 1757 + 3898 1 1452 2332 2331 + 3899 1 1525 1527 1526 + 3900 1 1548 2576 1547 + 3901 1 1590 1726 1725 + 3902 1 2302 2615 2436 + 3903 1 59 2448 278 + 3904 1 61 2182 232 + 3905 1 63 2397 259 + 3906 1 65 2147 222 + 3907 1 173 2410 269 + 3908 1 184 2190 237 + 3909 1 2462 2594 384 + 3910 1 535 2571 512 + 3911 1 536 2417 523 + 3912 1 556 581 535 + 3913 1 577 2417 536 + 3914 1 585 2007 1510 + 3915 1 638 2783 2021 + 3916 1 898 2622 900 + 3917 1 991 1097 965 + 3918 1 1040 2416 1340 + 3919 1 1157 2530 1364 + 3920 1 1236 1237 1198 + 3921 1 1618 2530 1242 + 3922 1 1264 1373 1265 + 3923 1 1442 1917 1317 + 3924 1 1918 2491 1317 + 3925 1 1652 1758 1376 + 3926 1 1464 2628 2471 + 3927 1 1503 1505 1504 + 3928 1 1773 1774 1507 + 3929 1 1510 2689 2396 + 3930 1 1540 1551 1539 + 3931 1 1740 1744 1741 + 3932 1 2063 2342 2062 + 3933 1 2184 2185 2183 + 3934 1 391 392 387 + 3935 1 395 396 392 + 3936 1 392 2331 937 + 3937 1 395 2330 405 + 3938 1 403 404 396 + 3939 1 413 2430 403 + 3940 1 404 430 429 + 3941 1 418 1511 413 + 3942 1 430 432 431 + 3943 1 500 505 499 + 3944 1 645 2577 629 + 3945 1 825 1434 823 + 3946 1 979 980 944 + 3947 1 1058 1284 1010 + 3948 1 1926 2534 1078 + 3949 1 1164 1413 1289 + 3950 1 1430 1431 1293 + 3951 1 1998 2351 1430 + 3952 1 1787 1788 1620 + 3953 1 67 2219 270 + 3954 1 288 290 289 + 3955 1 2366 2374 410 + 3956 1 689 2572 690 + 3957 1 704 965 689 + 3958 1 773 1442 1317 + 3959 1 1408 1509 1166 + 3960 1 1200 1432 1203 + 3961 1 1390 1391 1270 + 3962 1 1364 1612 1365 + 3963 1 1394 1723 1722 + 3964 1 1737 1740 1738 + 3965 1 2103 2565 2102 + 3966 1 120 2380 272 + 3967 1 279 281 280 + 3968 1 290 292 291 + 3969 1 772 2099 290 + 3970 1 292 294 293 + 3971 1 682 2364 293 + 3972 1 411 2671 660 + 3973 1 421 2333 2238 + 3974 1 447 2534 444 + 3975 1 481 482 480 + 3976 1 483 484 482 + 3977 1 500 507 506 + 3978 1 504 2461 1981 + 3979 1 507 509 508 + 3980 1 518 2045 547 + 3981 1 1176 1177 531 + 3982 1 684 2049 803 + 3983 1 694 697 696 + 3984 1 705 2088 696 + 3985 1 697 2506 698 + 3986 1 698 2506 707 + 3987 1 707 2506 972 + 3988 1 738 2403 708 + 3989 1 739 2160 741 + 3990 1 742 999 740 + 3991 1 741 744 743 + 3992 1 746 2336 742 + 3993 1 887 1166 885 + 3994 1 1075 2427 2291 + 3995 1 1090 1091 1089 + 3996 1 1114 1441 1440 + 3997 1 1163 2520 1420 + 3998 1 1184 2262 1183 + 3999 1 1861 1967 1246 + 4000 1 1312 1314 1313 + 4001 1 2010 2011 1442 + 4002 1 1527 1529 1528 + 4003 1 1833 2744 1640 + 4004 1 2151 2155 2154 + 4005 1 2226 2718 2623 + 4006 1 2535 2536 2271 + 4007 1 385 2278 334 + 4008 1 337 339 338 + 4009 1 810 2221 338 + 4010 1 339 341 340 + 4011 1 798 2371 341 + 4012 1 347 2299 342 + 4013 1 343 345 344 + 4014 1 2498 2671 348 + 4015 1 349 351 350 + 4016 1 796 2524 351 + 4017 1 353 355 354 + 4018 1 355 360 356 + 4019 1 356 2505 358 + 4020 1 358 2301 361 + 4021 1 370 1139 367 + 4022 1 377 378 372 + 4023 1 393 2246 408 + 4024 1 903 2132 397 + 4025 1 398 400 399 + 4026 1 400 402 401 + 4027 1 444 2534 443 + 4028 1 2423 2525 567 + 4029 1 573 2303 575 + 4030 1 646 723 645 + 4031 1 712 2308 943 + 4032 1 803 804 731 + 4033 1 857 2005 2004 + 4034 1 882 2097 2092 + 4035 1 902 2320 949 + 4036 1 904 1036 906 + 4037 1 909 1015 908 + 4038 1 2509 2540 935 + 4039 1 2141 2142 1004 + 4040 1 1015 2323 2317 + 4041 1 1290 1460 1023 + 4042 1 1135 2149 2148 + 4043 1 1136 1138 1137 + 4044 1 1176 2396 1971 + 4045 1 1549 2636 1262 + 4046 1 1274 2476 1538 + 4047 1 2054 2075 1297 + 4048 1 1324 2401 1481 + 4049 1 1518 1519 1460 + 4050 1 1460 2362 2361 + 4051 1 1479 2519 1684 + 4052 1 1482 1483 1480 + 4053 1 1484 1486 1483 + 4054 1 1515 2287 1484 + 4055 1 1541 2676 1542 + 4056 1 2292 2600 1674 + 4057 1 2054 2406 2075 + 4058 1 2166 2169 2167 + 4059 1 2191 2192 2190 + 4060 1 2296 2297 2295 + 4061 1 2314 2556 2313 + 4062 1 2127 2381 126 + 4063 1 192 2176 215 + 4064 1 294 296 295 + 4065 1 583 2277 294 + 4066 1 296 298 297 + 4067 1 409 2501 306 + 4068 1 312 314 313 + 4069 1 320 322 321 + 4070 1 328 2498 348 + 4071 1 331 2694 780 + 4072 1 349 2523 796 + 4073 1 350 2130 934 + 4074 1 353 2524 2466 + 4075 1 355 2466 364 + 4076 1 360 2505 356 + 4077 1 372 2566 365 + 4078 1 390 2358 378 + 4079 1 388 2365 2131 + 4080 1 389 2246 393 + 4081 1 394 2393 390 + 4082 1 402 406 401 + 4083 1 415 2366 410 + 4084 1 416 2333 421 + 4085 1 422 424 417 + 4086 1 422 2447 438 + 4087 1 437 459 424 + 4088 1 426 435 434 + 4089 1 435 2058 436 + 4090 1 465 2302 437 + 4091 1 438 1447 466 + 4092 1 496 2465 463 + 4093 1 1279 1280 464 + 4094 1 473 2604 676 + 4095 1 481 2484 492 + 4096 1 779 2015 501 + 4097 1 819 820 509 + 4098 1 528 542 529 + 4099 1 573 575 551 + 4100 1 597 2467 595 + 4101 1 2457 2517 610 + 4102 1 1170 1175 615 + 4103 1 617 632 621 + 4104 1 632 647 641 + 4105 1 647 687 677 + 4106 1 661 2305 662 + 4107 1 662 1034 956 + 4108 1 908 910 714 + 4109 1 751 2434 748 + 4110 1 757 1207 751 + 4111 1 792 2310 788 + 4112 1 932 933 789 + 4113 1 791 935 793 + 4114 1 794 815 792 + 4115 1 793 2540 1011 + 4116 1 804 806 805 + 4117 1 815 2312 2310 + 4118 1 816 2311 1014 + 4119 1 824 826 825 + 4120 1 826 828 827 + 4121 1 828 2097 882 + 4122 1 831 832 830 + 4123 1 839 2653 869 + 4124 1 884 888 886 + 4125 1 887 1408 1166 + 4126 1 899 2361 1022 + 4127 1 1036 2400 906 + 4128 1 1015 2317 908 + 4129 1 917 918 916 + 4130 1 919 920 918 + 4131 1 2164 2625 918 + 4132 1 919 2639 931 + 4133 1 922 926 925 + 4134 1 927 1044 1041 + 4135 1 930 967 966 + 4136 1 931 1415 1277 + 4137 1 2309 2518 935 + 4138 1 1001 1002 939 + 4139 1 939 2367 1167 + 4140 1 1145 2368 946 + 4141 1 1032 2536 947 + 4142 1 949 1084 1023 + 4143 1 1323 2307 951 + 4144 1 1213 1465 955 + 4145 1 1039 2244 961 + 4146 1 1088 2499 966 + 4147 1 1094 2561 968 + 4148 1 976 2502 2285 + 4149 1 989 1104 990 + 4150 1 2322 2323 1015 + 4151 1 1019 2472 1081 + 4152 1 1220 2245 1027 + 4153 1 2305 2635 1034 + 4154 1 1262 2636 1099 + 4155 1 1123 1709 1708 + 4156 1 1453 1676 1175 + 4157 1 1179 2460 1222 + 4158 1 1182 1183 1181 + 4159 1 1183 1186 1185 + 4160 1 1186 1188 1187 + 4161 1 1196 2144 1191 + 4162 1 1207 2670 2434 + 4163 1 1216 2556 2090 + 4164 1 1329 2586 1218 + 4165 1 1305 1306 1229 + 4166 1 1386 1549 1262 + 4167 1 1280 1417 1416 + 4168 1 1296 2489 1499 + 4169 1 1318 2593 1319 + 4170 1 1321 2667 1322 + 4171 1 1541 1542 1321 + 4172 1 1479 1684 1323 + 4173 1 1326 1703 1327 + 4174 1 2588 2773 1329 + 4175 1 1340 2416 1563 + 4176 1 1350 1574 1569 + 4177 1 1351 1583 1576 + 4178 1 1636 1804 1387 + 4179 1 1393 1814 1813 + 4180 1 1404 2349 1851 + 4181 1 1410 2235 1454 + 4182 1 1845 2611 1423 + 4183 1 1435 2588 2244 + 4184 1 1447 2042 2041 + 4185 1 2447 2558 1447 + 4186 1 2641 2792 1456 + 4187 1 1459 2456 1685 + 4188 1 1463 2145 1854 + 4189 1 1466 1467 1465 + 4190 1 1474 1475 1472 + 4191 1 1475 2734 2606 + 4192 1 1481 2515 1482 + 4193 1 2079 2637 1494 + 4194 1 1498 2683 1497 + 4195 1 1497 2556 2314 + 4196 1 1518 2477 1850 + 4197 1 2587 2797 1543 + 4198 1 1562 2799 1655 + 4199 1 2796 2799 1562 + 4200 1 1569 2847 2843 + 4201 1 1590 1727 1726 + 4202 1 1653 1929 1654 + 4203 1 1931 2469 1654 + 4204 1 1662 2550 1661 + 4205 1 2086 2546 1668 + 4206 1 1676 2326 1681 + 4207 1 1689 2435 1964 + 4208 1 1695 2584 1694 + 4209 1 1694 2540 2509 + 4210 1 1708 2717 2701 + 4211 1 2793 2817 1717 + 4212 1 1806 1808 1807 + 4213 1 1814 1816 1815 + 4214 1 1912 2763 1814 + 4215 1 1815 2581 2265 + 4216 1 1825 2081 2080 + 4217 1 1891 1892 1890 + 4218 1 1897 1898 1892 + 4219 1 1899 1900 1898 + 4220 1 1900 1903 1902 + 4221 1 2424 2555 1902 + 4222 1 1902 2655 2424 + 4223 1 1930 1933 1932 + 4224 1 1960 2639 2568 + 4225 1 2566 2741 1978 + 4226 1 2008 2328 2051 + 4227 1 2018 2019 2016 + 4228 1 2019 2621 2020 + 4229 1 2044 2693 2651 + 4230 1 2484 2528 2119 + 4231 1 2139 2633 2533 + 4232 1 2273 2518 2245 + 4233 1 2293 2605 2294 + 4234 1 2767 2778 2373 + 4235 1 2670 2716 2458 + 4236 1 2190 2192 237 + 4237 1 373 388 375 + 4238 1 398 2132 407 + 4239 1 459 486 485 + 4240 1 759 989 760 + 4241 1 1469 2696 767 + 4242 1 768 776 775 + 4243 1 835 836 834 + 4244 1 853 855 854 + 4245 1 947 2535 879 + 4246 1 881 2535 2271 + 4247 1 886 887 885 + 4248 1 2561 2674 887 + 4249 1 892 2375 1031 + 4250 1 900 901 899 + 4251 1 905 2449 903 + 4252 1 1004 2449 905 + 4253 1 967 1090 1089 + 4254 1 1298 1299 1019 + 4255 1 1020 1294 1293 + 4256 1 1031 1461 1286 + 4257 1 1042 2389 2121 + 4258 1 1307 2618 1043 + 4259 1 1252 2666 1104 + 4260 1 1105 2607 1544 + 4261 1 1127 1129 1128 + 4262 1 1147 2464 2203 + 4263 1 1162 1330 1325 + 4264 1 1337 2384 1215 + 4265 1 1215 1557 1545 + 4266 1 1225 1720 1719 + 4267 1 1335 2320 2171 + 4268 1 1596 1597 1374 + 4269 1 1443 2426 1458 + 4270 1 1449 1752 1450 + 4271 1 1461 1554 1553 + 4272 1 2502 2686 1469 + 4273 1 1521 2462 2207 + 4274 1 1674 2032 1673 + 4275 1 2023 2024 1693 + 4276 1 1727 1729 1728 + 4277 1 2675 2787 1938 + 4278 1 2316 2342 2063 + 4279 1 2125 2595 2126 + 4280 1 341 2371 343 + 4281 1 366 367 362 + 4282 1 1447 2041 466 + 4283 1 562 613 543 + 4284 1 617 621 614 + 4285 1 712 942 623 + 4286 1 626 713 710 + 4287 1 713 715 714 + 4288 1 760 2443 1025 + 4289 1 818 2424 1021 + 4290 1 943 1083 942 + 4291 1 1326 1327 1035 + 4292 1 1199 2724 2445 + 4293 1 1280 2503 1451 + 4294 1 1332 2172 1290 + 4295 1 2235 2426 1454 + 4296 1 1521 2207 1483 + 4297 1 1907 2198 1631 + 4298 1 1700 2631 2401 + 4299 1 1903 2655 1902 + 4300 1 2155 2531 2157 + 4301 1 2168 2173 2172 + 4302 1 69 2200 213 + 4303 1 83 2183 238 + 4304 1 84 2184 2183 + 4305 1 89 2186 255 + 4306 1 114 2093 113 + 4307 1 187 2175 207 + 4308 1 376 2402 380 + 4309 1 383 576 381 + 4310 1 382 2594 386 + 4311 1 404 2430 2178 + 4312 1 1078 2534 447 + 4313 1 576 2209 2208 + 4314 1 616 1225 639 + 4315 1 628 673 644 + 4316 1 1495 2675 646 + 4317 1 717 981 718 + 4318 1 722 1074 984 + 4319 1 765 2562 724 + 4320 1 779 2017 2016 + 4321 1 2293 2294 798 + 4322 1 837 838 836 + 4323 1 839 840 838 + 4324 1 845 846 844 + 4325 1 849 850 847 + 4326 1 848 1162 1082 + 4327 1 851 852 850 + 4328 1 855 856 854 + 4329 1 858 859 856 + 4330 1 856 2315 860 + 4331 1 861 862 859 + 4332 1 860 2613 2612 + 4333 1 862 912 911 + 4334 1 863 2338 1171 + 4335 1 878 880 879 + 4336 1 878 2399 880 + 4337 1 1457 2399 878 + 4338 1 895 2548 1030 + 4339 1 959 2320 902 + 4340 1 924 2061 915 + 4341 1 1042 1043 928 + 4342 1 929 1000 930 + 4343 1 938 2270 2107 + 4344 1 1087 1088 966 + 4345 1 967 2318 1090 + 4346 1 1105 1109 987 + 4347 1 1045 2121 1228 + 4348 1 1051 2126 1227 + 4349 1 1382 1383 1109 + 4350 1 1121 2510 2030 + 4351 1 1129 1130 1128 + 4352 1 1131 1132 1130 + 4353 1 1131 2036 1395 + 4354 1 1133 1134 1132 + 4355 1 1171 2497 2359 + 4356 1 1197 1236 1198 + 4357 1 1212 2475 1561 + 4358 1 2341 2725 1223 + 4359 1 2123 2125 1228 + 4360 1 1279 2503 1280 + 4361 1 1389 1817 1578 + 4362 1 1413 1923 1922 + 4363 1 1580 2869 2864 + 4364 1 1592 1594 1593 + 4365 1 1736 1787 1620 + 4366 1 1852 1860 1648 + 4367 1 2402 2420 1684 + 4368 1 1765 1785 1743 + 4369 1 1831 2820 1832 + 4370 1 1944 2033 1942 + 4371 1 1944 2714 2612 + 4372 1 1995 2577 2562 + 4373 1 2613 2619 2034 + 4374 1 2121 2388 2122 + 4375 1 266 2258 135 + 4376 1 308 2501 811 + 4377 1 403 2430 404 + 4378 1 778 2366 415 + 4379 1 467 2347 431 + 4380 1 527 2451 1470 + 4381 1 560 561 548 + 4382 1 562 616 614 + 4383 1 2281 2457 610 + 4384 1 616 639 617 + 4385 1 646 2675 725 + 4386 1 734 973 759 + 4387 1 776 2607 1105 + 4388 1 1014 2424 818 + 4389 1 835 837 836 + 4390 1 839 841 840 + 4391 1 893 2375 892 + 4392 1 900 948 902 + 4393 1 962 2267 933 + 4394 1 958 1085 957 + 4395 1 2354 2537 958 + 4396 1 2424 2655 1021 + 4397 1 1056 1355 1055 + 4398 1 2531 2599 1081 + 4399 1 1372 2113 1244 + 4400 1 1625 2553 1358 + 4401 1 1771 2113 1372 + 4402 1 1388 2469 1636 + 4403 1 1447 2558 2042 + 4404 1 2308 2641 1456 + 4405 1 1566 1731 1571 + 4406 1 1817 1818 1578 + 4407 1 1641 2779 1859 + 4408 1 1896 2482 1678 + 4409 1 1708 2701 2514 + 4410 1 2580 2660 2311 + 4411 1 270 2147 66 + 4412 1 635 2485 588 + 4413 1 1102 2502 976 + 4414 1 978 1055 1054 + 4415 1 1413 1922 1664 + 4416 1 1470 2452 2255 + 4417 1 1778 1786 1780 + 4418 1 2032 2610 2329 + 4419 1 127 2127 126 + 4420 1 659 2431 657 + 4421 1 845 847 846 + 4422 1 858 861 859 + 4423 1 874 2270 873 + 4424 1 1010 2545 1007 + 4425 1 1316 1942 1050 + 4426 1 1227 1230 1053 + 4427 1 1828 2234 1396 + 4428 1 1449 1757 1752 + 4429 1 1529 2037 1528 + 4430 1 2612 2613 2034 + 4431 1 222 2397 64 + 4432 1 330 2498 328 + 4433 1 593 2464 592 + 4434 1 769 2704 992 + 4435 1 770 978 977 + 4436 1 821 1295 889 + 4437 1 824 825 823 + 4438 1 912 913 911 + 4439 1 1018 2634 1308 + 4440 1 1296 1499 1498 + 4441 1 1418 2828 2805 + 4442 1 1453 2700 2323 + 4443 1 2404 2707 1686 + 4444 1 1890 2580 1856 + 4445 1 2436 2615 2017 + 4446 1 2048 2598 2408 + 4447 1 2152 2634 2599 + 4448 1 42 2237 41 + 4449 1 66 2147 65 + 4450 1 210 2380 121 + 4451 1 992 993 732 + 4452 1 757 2453 1208 + 4453 1 980 2521 1642 + 4454 1 1097 2527 1555 + 4455 1 1413 2204 1923 + 4456 1 1699 2579 2352 + 4457 1 37 2236 36 + 4458 1 218 2222 116 + 4459 1 121 2380 120 + 4460 1 427 2398 418 + 4461 1 1713 1714 678 + 4462 1 2562 2577 724 + 4463 1 731 2495 730 + 4464 1 975 2710 1068 + 4465 1 1006 2729 2162 + 4466 1 2104 2396 1176 + 4467 1 1698 1699 1428 + 4468 1 1482 2515 1485 + 4469 1 1486 1701 1521 + 4470 1 1662 2768 2550 + 4471 1 1692 2023 1693 + 4472 1 271 2093 114 + 4473 1 1146 2591 564 + 4474 1 741 2160 744 + 4475 1 914 2568 917 + 4476 1 922 2474 929 + 4477 1 966 2499 926 + 4478 1 979 2413 1234 + 4479 1 1200 1201 1184 + 4480 1 1278 1473 1472 + 4481 1 554 2347 467 + 4482 1 723 724 645 + 4483 1 719 2413 979 + 4484 1 2592 2622 898 + 4485 1 1285 2014 1658 + 4486 1 2538 2736 1710 + 4487 1 1904 2740 1905 + 4488 1 2562 2563 1995 + 4489 1 2069 2647 2067 + 4490 1 453 2470 2282 + 4491 1 676 2583 475 + 4492 1 479 2484 481 + 4493 1 516 2045 518 + 4494 1 690 2572 693 + 4495 1 701 2306 1331 + 4496 1 2458 2716 746 + 4497 1 1112 2806 2395 + 4498 1 1181 2460 1179 + 4499 1 2301 2664 1951 + 4500 1 2449 2699 1953 + 4501 1 208 2421 35 + 4502 1 284 1224 286 + 4503 1 542 2656 562 + 4504 1 2438 2741 622 + 4505 1 724 2577 645 + 4506 1 688 2439 677 + 4507 1 2304 2770 790 + 4508 1 2394 2589 1168 + 4509 1 1257 1622 1621 + 4510 1 1302 2678 2443 + 4511 1 2650 2667 1542 + 4512 1 1683 2737 2472 + 4513 1 1687 2546 2086 + 4514 1 1776 2217 2215 + 4515 1 1995 2563 1994 + 4516 1 2738 2742 2206 + 4517 1 618 2668 664 + 4518 1 2471 2628 635 + 4519 1 940 2781 2706 + 4520 1 971 2386 1096 + 4521 1 1308 2642 2326 + 4522 1 1318 2620 2593 + 4523 1 1348 2177 1589 + 4524 1 2229 2591 1419 + 4525 1 2226 2623 1433 + 4526 1 1642 2627 1924 + 4527 1 1882 1885 1884 + 4528 1 306 2501 308 + 4529 1 324 2709 326 + 4530 1 1173 2498 330 + 4531 1 637 2702 606 + 4532 1 675 2049 684 + 4533 1 1116 2321 984 + 4534 1 1643 2367 1002 + 4535 1 1028 2742 2592 + 4536 1 1197 1379 1236 + 4537 1 2432 2573 1300 + 4538 1 1314 2596 1407 + 4539 1 1522 2758 2632 + 4540 1 1563 2796 1562 + 4541 1 2053 2630 2011 + 4542 1 531 2425 499 + 4543 1 2100 2101 1012 + 4544 1 1478 1733 1355 + 4545 1 1407 2596 2035 + 4546 1 2686 2696 1469 + 4547 1 1923 2204 2194 + 4548 1 35 2421 34 + 4549 1 123 2419 122 + 4550 1 285 2522 283 + 4551 1 471 2604 473 + 4552 1 2517 2654 610 + 4553 1 611 2751 2657 + 4554 1 2492 2520 812 + 4555 1 1233 2521 980 + 4556 1 1419 2591 1146 + 4557 1 1150 2549 1148 + 4558 1 1392 2608 1270 + 4559 1 1947 1948 1305 + 4560 1 1391 1810 1394 + 4561 1 1774 2511 1507 + 4562 1 2355 2372 1672 + 4563 1 2556 2683 2090 + 4564 1 232 2685 2448 + 4565 1 259 2830 2182 + 4566 1 463 2465 1433 + 4567 1 589 2414 568 + 4568 1 675 2418 2049 + 4569 1 2085 2376 1427 + 4570 1 1563 2798 2796 + 4571 1 1660 2629 2074 + 4572 1 2119 2528 1949 + 4573 1 2574 2685 1991 + 4574 1 2085 2718 2181 + 4575 1 174 2410 173 + 4576 1 423 2293 337 + 4577 1 715 908 714 + 4578 1 2294 2295 798 + 4579 1 909 2257 1017 + 4580 1 1058 2661 1361 + 4581 1 1560 2679 1063 + 4582 1 1090 1269 1091 + 4583 1 1215 2384 1557 + 4584 1 1264 2669 1585 + 4585 1 1316 1943 1942 + 4586 1 1423 2611 1422 + 4587 1 441 2567 442 + 4588 1 458 2470 454 + 4589 1 498 2461 504 + 4590 1 608 2303 573 + 4591 1 592 2464 1147 + 4592 1 595 2467 631 + 4593 1 965 2572 689 + 4594 1 1977 2631 1138 + 4595 1 1223 2641 2308 + 4596 1 1456 2620 1318 + 4597 1 1465 2560 2387 + 4598 1 1668 2547 2086 + 4599 1 1687 2672 2546 + 4600 1 1697 2593 1696 + 4601 1 1696 2620 2463 + 4602 1 2500 2731 1706 + 4603 1 2116 2427 2115 + 4604 1 376 379 374 + 4605 1 576 2610 2209 + 4606 1 2202 2453 757 + 4607 1 922 929 926 + 4608 1 2681 2719 936 + 4609 1 947 2536 2535 + 4610 1 2235 2733 1458 + 4611 1 2507 2648 1547 + 4612 1 2179 2602 2289 + 4613 1 345 2523 349 + 4614 1 351 2524 353 + 4615 1 624 2461 498 + 4616 1 1317 2491 555 + 4617 1 657 2431 2009 + 4618 1 734 2442 973 + 4619 1 829 1216 831 + 4620 1 832 868 830 + 4621 1 862 1436 912 + 4622 1 921 2474 922 + 4623 1 1002 2367 939 + 4624 1 943 2308 1456 + 4625 1 1235 2140 995 + 4626 1 1079 2086 1108 + 4627 1 1183 2262 1186 + 4628 1 2025 2319 1428 + 4629 1 2593 2620 1696 + 4630 1 1709 2717 1708 + 4631 1 1898 2555 1892 + 4632 1 397 2132 398 + 4633 1 515 2624 516 + 4634 1 913 1477 911 + 4635 1 1315 2596 1314 + 4636 1 1905 2740 2702 + 4637 1 625 2420 375 + 4638 1 442 2567 445 + 4639 1 2408 2598 671 + 4640 1 687 2442 734 + 4641 1 2315 2613 860 + 4642 1 860 2612 2348 + 4643 1 1166 2630 885 + 4644 1 896 2592 898 + 4645 1 1104 2666 1303 + 4646 1 1380 2539 1236 + 4647 1 1659 2545 1284 + 4648 1 1346 2539 1739 + 4649 1 1752 1753 1450 + 4650 1 1477 2619 2613 + 4651 1 1590 2692 1727 + 4652 1 2555 2660 1892 + 4653 1 386 2594 1444 + 4654 1 556 582 581 + 4655 1 232 2448 60 + 4656 1 1086 2537 1524 + 4657 1 2341 2787 2726 + 4658 1 357 2654 2250 + 4659 1 622 2566 372 + 4660 1 437 2302 459 + 4661 1 730 1490 1489 + 4662 1 824 2313 826 + 4663 1 826 2313 829 + 4664 1 888 2444 969 + 4665 1 910 2698 2663 + 4666 1 969 2444 1118 + 4667 1 1126 2554 1649 + 4668 1 1249 2632 1647 + 4669 1 1286 2652 1287 + 4670 1 1295 2489 1296 + 4671 1 2813 2820 1316 + 4672 1 1327 2701 1328 + 4673 1 1654 2469 1388 + 4674 1 2256 2663 1541 + 4675 1 1557 2752 1545 + 4676 1 1946 2673 1551 + 4677 1 2104 2571 2396 + 4678 1 2832 2850 205 + 4679 1 482 2196 480 + 4680 1 2178 2614 699 + 4681 1 835 2705 837 + 4682 1 1046 1307 1043 + 4683 1 1395 1396 1133 + 4684 1 1150 2569 2549 + 4685 1 1331 2731 2500 + 4686 1 1477 2613 2315 + 4687 1 1814 1815 1813 + 4688 1 1915 2342 2316 + 4689 1 1943 2714 1944 + 4690 1 2396 2689 1971 + 4691 1 329 2694 331 + 4692 1 1076 2078 686 + 4693 1 694 2690 697 + 4694 1 804 805 731 + 4695 1 728 2680 672 + 4696 1 1394 2665 1723 + 4697 1 1685 2456 2455 + 4698 1 438 2447 1447 + 4699 1 808 1079 995 + 4700 1 968 2561 886 + 4701 1 972 2575 1963 + 4702 1 1253 2543 996 + 4703 1 1735 2669 1260 + 4704 1 1391 1392 1270 + 4705 1 359 2654 357 + 4706 1 438 465 437 + 4707 1 641 2138 621 + 4708 1 728 2697 2680 + 4709 1 990 2443 760 + 4710 1 908 2317 910 + 4711 1 1190 1979 1199 + 4712 1 1218 2586 1397 + 4713 1 2460 2745 1222 + 4714 1 1704 2701 1327 + 4715 1 1468 2633 1667 + 4716 1 1494 2637 2589 + 4717 1 1962 2739 1496 + 4718 1 1688 2672 1687 + 4719 1 2505 2664 2301 + 4720 1 2341 2726 2725 + 4721 1 1197 2445 1379 + 4722 1 1326 2676 1703 + 4723 1 1415 2639 1960 + 4724 1 1496 2739 2662 + 4725 1 2673 2674 1551 + 4726 1 620 667 640 + 4727 1 2348 2714 940 + 4728 1 1159 2530 1157 + 4729 1 1204 2662 1999 + 4730 1 1894 1895 1311 + 4731 1 2062 2342 1412 + 4732 1 2359 2497 1457 + 4733 1 2058 2773 2060 + 4734 1 2298 2769 2548 + 4735 1 2051 2328 1436 + 4736 1 1527 2682 1530 + 4737 1 1510 2571 581 + 4738 1 2480 2710 975 + 4739 1 2361 2362 1022 + 4740 1 2288 2748 1702 + 4741 1 2657 2760 2490 + 4742 1 499 2425 469 + 4743 1 907 2378 755 + 4744 1 1201 2708 1184 + 4745 1 1260 2669 1261 + 4746 1 2040 2708 1437 + 4747 1 2781 2820 1831 + 4748 1 826 829 828 + 4749 1 869 2106 841 + 4750 1 930 2318 967 + 4751 1 1360 1989 1869 + 4752 1 1693 2738 2645 + 4753 1 2324 2691 2211 + 4754 1 811 2483 310 + 4755 1 329 2709 2694 + 4756 1 348 2671 411 + 4757 1 610 2654 359 + 4758 1 423 2644 2605 + 4759 1 2302 2436 459 + 4760 1 1178 2425 531 + 4761 1 596 2454 598 + 4762 1 758 2138 641 + 4763 1 767 2607 768 + 4764 1 995 2140 807 + 4765 1 869 2752 2590 + 4766 1 910 2663 2256 + 4767 1 2317 2698 910 + 4768 1 1302 2443 990 + 4769 1 1137 2650 2305 + 4770 1 1169 2664 2505 + 4771 1 1980 2724 1199 + 4772 1 1222 2745 2711 + 4773 1 1259 1438 1437 + 4774 1 1287 2652 1556 + 4775 1 1319 2603 1698 + 4776 1 1339 2730 1663 + 4777 1 1494 2589 2394 + 4778 1 2384 2735 1557 + 4779 1 2590 2752 1557 + 4780 1 1681 2525 2423 + 4781 1 1685 2455 2454 + 4782 1 1700 2667 2650 + 4783 1 2514 2701 1704 + 4784 1 1890 2660 2580 + 4785 1 2766 2801 2019 + 4786 1 2155 2599 2531 + 4787 1 2573 2677 2255 + 4788 1 2296 2769 2298 + 4789 1 2529 2537 2354 + 4790 1 2446 2790 2783 + 4791 1 279 2574 282 + 4792 1 1069 2415 777 + 4793 1 851 853 852 + 4794 1 1051 1053 1052 + 4795 1 1074 2325 1276 + 4796 1 1873 2758 1174 + 4797 1 1199 2445 1193 + 4798 1 1739 2177 1348 + 4799 1 1701 2646 1521 + 4800 1 1544 2696 1587 + 4801 1 1703 2676 2663 + 4802 1 2326 2642 2525 + 4803 1 2616 2711 2615 + 4804 1 568 2414 569 + 4805 1 611 2657 571 + 4806 1 677 2439 758 + 4807 1 924 2618 2061 + 4808 1 1021 2655 2324 + 4809 1 1222 2616 1178 + 4810 1 1691 2672 1688 + 4811 1 1892 2660 1890 + 4812 1 2133 2604 471 + 4813 1 1080 2454 596 + 4814 1 2577 2578 629 + 4815 1 851 2382 857 + 4816 1 900 2622 948 + 4817 1 987 2108 988 + 4818 1 988 2108 1071 + 4819 1 1108 1384 1235 + 4820 1 1236 2539 1237 + 4821 1 1683 2472 1299 + 4822 1 1565 2808 1345 + 4823 1 1693 2645 1512 + 4824 1 1525 2682 1527 + 4825 1 2383 2789 1554 + 4826 1 2024 2738 1693 + 4827 1 849 2382 851 + 4828 1 1924 2628 1464 + 4829 1 1618 2722 2530 + 4830 1 2462 2646 2594 + 4831 1 540 2624 515 + 4832 1 1068 2710 1363 + 4833 1 1588 2713 1378 + 4834 1 1524 2538 1710 + 4835 1 1790 1791 1771 + 4836 1 326 2709 329 + 4837 1 454 2470 453 + 4838 1 823 2508 820 + 4839 1 1004 2699 2449 + 4840 1 1299 2472 1019 + 4841 1 1034 2635 1326 + 4842 1 1700 2650 1137 + 4843 1 1203 2662 1204 + 4844 1 1354 2541 1487 + 4845 1 1506 2648 1504 + 4846 1 1520 2616 2615 + 4847 1 1995 2578 2577 + 4848 1 2133 2748 2604 + 4849 1 2151 2599 2155 + 4850 1 2169 2778 2767 + 4851 1 2414 2529 2354 + 4852 1 2125 2126 1049 + 4853 1 1307 2619 2618 + 4854 1 2694 2709 2082 + 4855 1 1063 2679 985 + 4856 1 1205 2708 1201 + 4857 1 702 2494 2044 + 4858 1 2162 2746 1076 + 4859 1 1259 2720 1438 + 4860 1 62 2182 61 + 4861 1 697 2690 2507 + 4862 1 2540 2584 1011 + 4863 1 1755 2757 1406 + 4864 1 1893 2678 1691 + 4865 1 1721 2747 2621 + 4866 1 2621 2747 2020 + 4867 1 2238 2559 2059 + 4868 1 2387 2560 561 + 4869 1 2443 2749 1025 + 4870 1 1263 2564 1386 + 4871 1 1501 2683 1498 + 4872 1 1530 2682 1717 + 4873 1 1698 2603 2602 + 4874 1 2478 2601 2479 + 4875 1 664 2668 2557 + 4876 1 1370 2597 2527 + 4877 1 2525 2642 2153 + 4878 1 1242 2530 1159 + 4879 1 1859 2734 1475 + 4880 1 1521 2646 2462 + 4881 1 2788 2814 1619 + 4882 1 1478 2541 2369 + 4883 1 2372 2795 1672 + 4884 1 571 2657 553 + 4885 1 790 2777 2243 + 4886 1 2530 2722 1364 + 4887 1 1918 2668 2491 + 4888 1 2843 2847 2219 + 4889 1 770 2651 1945 + 4890 1 2495 2496 1490 + 4891 1 1797 2713 1588 + 4892 1 2428 2658 1923 + 4893 1 60 2448 59 + 4894 1 283 2522 1377 + 4895 1 665 2651 679 + 4896 1 768 2607 776 + 4897 1 1706 2731 2475 + 4898 1 1923 2658 1922 + 4899 1 2531 2737 2157 + 4900 1 2579 2614 2178 + 4901 1 1040 2743 2416 + 4902 1 1217 2768 2303 + 4903 1 1333 2787 2341 + 4904 1 1685 2677 1488 + 4905 1 1699 2614 2579 + 4906 1 2604 2748 2288 + 4907 1 2463 2792 2774 + 4908 1 2454 2455 598 + 4909 1 1361 2661 1916 + 4910 1 1622 2649 1782 + 4911 1 2466 2775 364 + 4912 1 433 2712 1279 + 4913 1 528 2437 542 + 4914 1 562 2656 616 + 4915 1 1161 2632 1249 + 4916 1 1222 2711 2616 + 4917 1 1542 2667 1321 + 4918 1 2451 2452 1470 + 4919 1 2445 2724 1763 + 4920 1 2060 2773 2588 + 4921 1 2317 2700 2698 + 4922 1 2269 2325 1074 + 4923 1 1444 2681 2330 + 4924 1 2594 2646 1444 + 4925 1 2726 2787 1495 + 4926 1 2537 2538 1524 + 4927 1 2645 2738 2005 + 4928 1 2121 2389 2388 + 4929 1 434 2712 433 + 4930 1 771 2659 2385 + 4931 1 850 2706 847 + 4932 1 940 2706 850 + 4933 1 859 2315 856 + 4934 1 1945 2544 1056 + 4935 1 1309 2697 1066 + 4936 1 1225 2656 1720 + 4937 1 2037 2807 1705 + 4938 1 2339 2695 2340 + 4939 1 2174 2775 2466 + 4940 1 679 2651 770 + 4941 1 886 2561 887 + 4942 1 1496 2662 1203 + 4943 1 2651 2693 1945 + 4944 1 1991 2685 1992 + 4945 1 633 2471 635 + 4946 1 718 2736 1320 + 4947 1 2007 2689 1510 + 4948 1 1592 2643 1594 + 4949 1 606 2702 611 + 4950 1 926 2499 925 + 4951 1 1209 2670 1207 + 4952 1 1458 2733 1845 + 4953 1 1471 2606 2551 + 4954 1 1488 2573 2432 + 4955 1 1560 2788 2679 + 4956 1 1066 2697 761 + 4957 1 2701 2717 1328 + 4958 1 1701 2681 2646 + 4959 1 1842 1844 1843 + 4960 1 2189 2191 2190 + 4961 1 619 2478 586 + 4962 1 1872 2729 1659 + 4963 1 553 2657 2490 + 4964 1 994 2495 805 + 4965 1 1758 2720 1376 + 4966 1 2725 2726 1715 + 4967 1 2478 2479 1961 + 4968 1 670 2249 726 + 4969 1 780 2694 2684 + 4970 1 973 2829 1950 + 4971 1 2086 2547 1108 + 4972 1 1303 2666 1670 + 4973 1 1475 2606 1472 + 4974 1 1515 2638 2287 + 4975 1 1655 2799 2567 + 4976 1 761 2697 728 + 4977 1 1979 2585 1980 + 4978 1 2557 2668 1918 + 4979 1 1810 2665 1394 + 4980 1 1921 2688 1509 + 4981 1 2396 2571 1510 + 4982 1 1554 2789 2605 + 4983 1 2663 2698 1703 + 4984 1 824 2314 2313 + 4985 1 2061 2619 1477 + 4986 1 503 2284 1075 + 4987 1 2548 2769 1030 + 4988 1 1338 2730 1339 + 4989 1 1724 2608 1392 + 4990 1 1442 2728 1917 + 4991 1 2575 2576 1548 + 4992 1 1702 2719 1701 + 4993 1 1701 2719 2681 + 4994 1 2605 2789 2294 + 4995 1 1434 2508 823 + 4996 1 999 2707 2404 + 4997 1 1386 2564 1799 + 4998 1 2102 2565 1445 + 4999 1 2084 2718 2085 + 5000 1 2598 2647 671 + 5001 1 2646 2681 1444 + 5002 1 1512 2645 2382 + 5003 1 544 2437 528 + 5004 1 726 2249 986 + 5005 1 2095 2805 778 + 5006 1 953 2474 921 + 5007 1 1000 2318 930 + 5008 1 2552 2763 1000 + 5009 1 2142 2699 1004 + 5010 1 1118 2444 1679 + 5011 1 1522 2632 1161 + 5012 1 1192 2585 1979 + 5013 1 1665 2735 1330 + 5014 1 2720 2721 1438 + 5015 1 1472 2606 1471 + 5016 1 1488 2677 2573 + 5017 1 1568 2758 1522 + 5018 1 1543 2754 2499 + 5019 1 1703 2698 1704 + 5020 1 2698 2700 1704 + 5021 1 1713 2790 2786 + 5022 1 2486 2665 1810 + 5023 1 2164 2754 1948 + 5024 1 2167 2765 2168 + 5025 1 2765 2775 2174 + 5026 1 2845 2846 2201 + 5027 1 2274 2751 2740 + 5028 1 2323 2700 2317 + 5029 1 616 2656 1225 + 5030 1 837 2705 2653 + 5031 1 2778 2780 1036 + 5032 1 1379 2445 1763 + 5033 1 2663 2676 1541 + 5034 1 2211 2691 2212 + 5035 1 758 2139 2138 + 5036 1 1587 2696 2686 + 5037 1 2157 2737 2438 + 5038 1 2679 2710 2480 + 5039 1 2751 2760 2657 + 5040 1 857 2645 2005 + 5041 1 1130 2532 1232 + 5042 1 1356 2532 1132 + 5043 1 1657 2739 1304 + 5044 1 2772 2782 1337 + 5045 1 1364 2722 1612 + 5046 1 1587 2686 1767 + 5047 1 1589 2692 1590 + 5048 1 1715 2726 2356 + 5049 1 1753 2771 2724 + 5050 1 2017 2711 2018 + 5051 1 1237 2539 1346 + 5052 1 2786 2790 1342 + 5053 1 1406 2732 2140 + 5054 1 1716 2792 2641 + 5055 1 1719 2823 1718 + 5056 1 1057 2661 1058 + 5057 1 1418 2805 1416 + 5058 1 2248 2798 1677 + 5059 1 2527 2597 1555 + 5060 1 1638 2821 1911 + 5061 1 1725 2840 1985 + 5062 1 1537 2804 1535 + 5063 1 2643 2803 1594 + 5064 1 1945 2693 2544 + 5065 1 2242 2743 1040 + 5066 1 1534 2670 1209 + 5067 1 1341 2786 1342 + 5068 1 1816 2581 1815 + 5069 1 1559 2716 1534 + 5070 1 1558 2785 2756 + 5071 1 1193 2445 1197 + 5072 1 1195 2766 2143 + 5073 1 755 2378 762 + 5074 1 2550 2768 1217 + 5075 1 2702 2740 611 + 5076 1 1547 2648 1506 + 5077 1 315 2802 313 + 5078 1 2602 2603 2289 + 5079 1 2182 2755 232 + 5080 1 371 2775 609 + 5081 1 2545 2729 1006 + 5082 1 1987 2638 1515 + 5083 1 2170 2780 2778 + 5084 1 2246 2767 2373 + 5085 1 2416 2743 2730 + 5086 1 805 2495 731 + 5087 1 994 2496 2495 + 5088 1 1221 2756 2197 + 5089 1 2770 2777 790 + 5090 1 2242 2777 2743 + 5091 1 282 2574 1991 + 5092 1 1150 2570 2569 + 5093 1 1408 2673 1921 + 5094 1 1534 2716 2670 + 5095 1 2520 2723 2056 + 5096 1 2683 2687 2090 + 5097 1 2134 2748 2133 + 5098 1 2384 2750 2735 + 5099 1 837 2653 839 + 5100 1 2714 2781 940 + 5101 1 985 2679 2480 + 5102 1 1049 2126 1051 + 5103 1 2711 2745 2018 + 5104 1 2621 2801 2791 + 5105 1 1640 2744 1925 + 5106 1 2569 2570 2068 + 5107 1 2170 2778 2169 + 5108 1 925 2754 2164 + 5109 1 2303 2768 2304 + 5110 1 2382 2645 857 + 5111 1 2490 2760 1221 + 5112 1 1490 2496 1492 + 5113 1 2356 2726 1495 + 5114 1 2615 2711 2017 + 5115 1 982 2736 718 + 5116 1 1707 2757 1754 + 5117 1 2764 2767 2193 + 5118 1 2492 2723 2520 + 5119 1 309 2809 307 + 5120 1 2526 2810 725 + 5121 1 2735 2750 1330 + 5122 1 2400 2772 1337 + 5123 1 1978 2741 1683 + 5124 1 2743 2777 1663 + 5125 1 2274 2740 1904 + 5126 1 2416 2784 1563 + 5127 1 2730 2743 1663 + 5128 1 2756 2785 2197 + 5129 1 2567 2799 445 + 5130 1 1036 2780 2400 + 5131 1 1376 2720 1259 + 5132 1 1663 2770 1662 + 5133 1 2020 2747 544 + 5134 1 1501 2687 2683 + 5135 1 1545 2752 1675 + 5136 1 1956 2779 1641 + 5137 1 2804 2828 1819 + 5138 1 2635 2676 1326 + 5139 1 2011 2728 1442 + 5140 1 1567 2785 1558 + 5141 1 1639 2761 1827 + 5142 1 2397 2833 259 + 5143 1 1076 2746 2077 + 5144 1 725 2810 2493 + 5145 1 1030 2769 2383 + 5146 1 1232 2510 1128 + 5147 1 1330 2750 2695 + 5148 1 2021 2790 1713 + 5149 1 2005 2738 2206 + 5150 1 2750 2782 2340 + 5151 1 1961 2479 1962 + 5152 1 2684 2694 2082 + 5153 1 1445 2565 2418 + 5154 1 2373 2778 1036 + 5155 1 1558 2756 1564 + 5156 1 1570 2846 2845 + 5157 1 2764 2765 2167 + 5158 1 2337 2707 999 + 5159 1 1378 2713 1595 + 5160 1 1659 2729 2545 + 5161 1 2730 2784 2416 + 5162 1 972 2576 2575 + 5163 1 2144 2801 1195 + 5164 1 2774 2792 1716 + 5165 1 1223 2725 2641 + 5166 1 2682 2793 1717 + 5167 1 2137 2723 2492 + 5168 1 887 2674 1408 + 5169 1 1338 2784 2730 + 5170 1 1734 2617 1355 + 5171 1 1710 2793 2682 + 5172 1 2168 2765 2174 + 5173 1 1677 2784 1338 + 5174 1 1342 2790 2446 + 5175 1 2818 2824 1566 + 5176 1 1913 2761 1639 + 5177 1 2405 2742 1028 + 5178 1 1705 2807 1248 + 5179 1 1337 2782 2384 + 5180 1 1658 2379 1871 + 5181 1 2450 2782 2772 + 5182 1 2695 2750 2340 + 5183 1 2456 2783 638 + 5184 1 2463 2774 1341 + 5185 1 2035 2794 1567 + 5186 1 2685 2755 1992 + 5187 1 232 2755 2685 + 5188 1 259 2833 2830 + 5189 1 1128 2510 1121 + 5190 1 1408 2674 2673 + 5191 1 1564 2751 2274 + 5192 1 1672 2795 2794 + 5193 1 2014 2379 1658 + 5194 1 682 2776 2390 + 5195 1 2805 2828 1826 + 5196 1 2400 2780 2772 + 5197 1 2384 2782 2750 + 5198 1 364 2775 371 + 5199 1 609 2764 2193 + 5200 1 1549 2759 2636 + 5201 1 1574 2849 2847 + 5202 1 1683 2741 2737 + 5203 1 2791 2801 2144 + 5204 1 2193 2767 2246 + 5205 1 2294 2789 2296 + 5206 1 2678 2749 2443 + 5207 1 1132 2532 1130 + 5208 1 2737 2741 2438 + 5209 1 1052 2813 1316 + 5210 1 2706 2781 1831 + 5211 1 2618 2619 2061 + 5212 1 2171 2780 2170 + 5213 1 2184 2862 2185 + 5214 1 2206 2742 2405 + 5215 1 2595 2854 2838 + 5216 1 655 2795 2372 + 5217 1 2243 2777 2242 + 5218 1 2197 2785 655 + 5219 1 2143 2745 2460 + 5220 1 2234 2821 1638 + 5221 1 1495 2787 2675 + 5222 1 2785 2795 655 + 5223 1 2446 2783 1561 + 5224 1 1714 2774 1716 + 5225 1 2346 2799 2796 + 5226 1 1329 2773 2586 + 5227 1 2621 2791 1721 + 5228 1 1561 2783 2456 + 5229 1 2019 2801 2621 + 5230 1 732 2601 666 + 5231 1 1567 2795 2785 + 5232 1 2346 2796 802 + 5233 1 2340 2782 2450 + 5234 1 802 2798 2248 + 5235 1 2636 2759 1112 + 5236 1 1221 2760 2756 + 5237 1 1456 2792 2620 + 5238 1 2620 2792 2463 + 5239 1 313 2802 519 + 5240 1 1832 2820 2813 + 5241 1 2732 2757 1707 + 5242 1 2499 2754 925 + 5243 1 1713 2786 1714 + 5244 1 2774 2786 1341 + 5245 1 2109 2812 1550 + 5246 1 2679 2788 2710 + 5247 1 2503 2812 2109 + 5248 1 2450 2772 2171 + 5249 1 2796 2798 802 + 5250 1 1283 2640 1101 + 5251 1 2006 2815 1196 + 5252 1 1355 2617 1055 + 5253 1 2772 2780 2171 + 5254 1 1663 2777 2770 + 5255 1 1008 2703 1009 + 5256 1 2018 2766 2019 + 5257 1 445 2799 2346 + 5258 1 1101 2640 1102 + 5259 1 2756 2760 1564 + 5260 1 973 2834 2829 + 5261 1 2724 2771 1763 + 5262 1 1416 2805 2095 + 5263 1 2543 2803 2643 + 5264 1 1826 2828 1807 + 5265 1 666 2601 2478 + 5266 1 1611 2814 1560 + 5267 1 1726 2835 1725 + 5268 1 307 2809 552 + 5269 1 1055 2617 1257 + 5270 1 1009 2703 1059 + 5271 1 1305 2797 1306 + 5272 1 1948 2797 1305 + 5273 1 609 2765 2764 + 5274 1 1345 2808 1344 + 5275 1 2803 2825 1594 + 5276 1 1634 2826 2817 + 5277 1 74 2839 205 + 5278 1 647 2831 733 + 5279 1 1210 2827 2813 + 5280 1 1575 2800 1230 + 5281 1 1943 2781 2714 + 5282 1 1248 2807 1834 + 5283 1 2839 2852 2124 + 5284 1 1807 2804 1537 + 5285 1 1893 2749 2678 + 5286 1 1595 2803 1253 + 5287 1 982 2793 2736 + 5288 1 1253 2803 2543 + 5289 1 2736 2793 1710 + 5290 1 1714 2786 2774 + 5291 1 1564 2760 2751 + 5292 1 1532 2836 2000 + 5293 1 1741 2753 1742 + 5294 1 1196 2791 2144 + 5295 1 1970 2842 1969 + 5296 1 2442 2834 973 + 5297 1 1306 2797 2587 + 5298 1 1406 2757 2732 + 5299 1 2745 2766 2018 + 5300 1 639 2822 617 + 5301 1 1363 2788 1619 + 5302 1 1986 2811 1565 + 5303 1 1943 2820 2781 + 5304 1 2794 2795 1567 + 5305 1 1550 2812 1833 + 5306 1 1721 2815 1719 + 5307 1 213 2843 2219 + 5308 1 1986 2831 2822 + 5309 1 202 2856 2855 + 5310 1 2493 2810 1705 + 5311 1 1760 2753 1741 + 5312 1 1782 2861 1784 + 5313 1 2649 2876 2861 + 5314 1 1625 2816 2057 + 5315 1 225 2877 2874 + 5316 1 1634 2817 2013 + 5317 1 1210 2813 1052 + 5318 1 77 2841 236 + 5319 1 733 2840 2835 + 5320 1 2143 2766 2745 + 5321 1 1571 2850 2388 + 5322 1 1950 2819 1252 + 5323 1 2791 2815 1721 + 5324 1 1229 2818 1566 + 5325 1 1969 2849 1574 + 5326 1 2057 2816 1842 + 5327 1 1232 2863 2851 + 5328 1 1316 2820 1943 + 5329 1 2808 2823 1344 + 5330 1 2855 2856 1732 + 5331 1 205 2848 73 + 5332 1 222 2837 2397 + 5333 1 258 2844 2824 + 5334 1 1574 2847 1569 + 5335 1 1570 2845 2587 + 5336 1 1842 2816 1844 + 5337 1 2710 2788 1363 + 5338 1 2811 2822 639 + 5339 1 2874 2877 1584 + 5340 1 2822 2831 632 + 5341 1 1306 2818 1229 + 5342 1 2842 2849 1969 + 5343 1 1344 2823 2006 + 5344 1 76 2852 75 + 5345 1 1566 2824 1731 + 5346 1 1573 2838 1732 + 5347 1 1829 2827 1828 + 5348 1 1828 2821 2234 + 5349 1 2122 2832 2124 + 5350 1 1718 2823 2808 + 5351 1 1635 2826 1634 + 5352 1 2818 2845 2201 + 5353 1 1828 2827 2821 + 5354 1 1595 2825 2803 + 5355 1 1819 2828 1418 + 5356 1 632 2831 647 + 5357 1 1196 2815 2791 + 5358 1 72 2844 71 + 5359 1 1818 2858 2853 + 5360 1 202 2855 79 + 5361 1 617 2822 632 + 5362 1 101 2859 260 + 5363 1 233 2880 2879 + 5364 1 81 2853 80 + 5365 1 86 2860 209 + 5366 1 1986 2822 2811 + 5367 1 2201 2846 2200 + 5368 1 1728 2834 1726 + 5369 1 2397 2837 2833 + 5370 1 1306 2845 2818 + 5371 1 1724 2837 1970 + 5372 1 1732 2856 1572 + 5373 1 1730 2829 1728 + 5374 1 205 2850 2848 + 5375 1 2838 2854 236 + 5376 1 2826 2836 1532 + 5377 1 2860 2866 2029 + 5378 1 2829 2834 1728 + 5379 1 75 2839 74 + 5380 1 205 2839 2832 + 5381 1 2831 2840 733 + 5382 1 1232 2851 2510 + 5383 1 2879 2880 1733 + 5384 1 1722 2833 1724 + 5385 1 2830 2833 1722 + 5386 1 1985 2840 1986 + 5387 1 2388 2832 2122 + 5388 1 1723 2830 1722 + 5389 1 2123 2854 2595 + 5390 1 1577 2870 2867 + 5391 1 733 2835 2442 + 5392 1 2851 2863 2185 + 5393 1 2028 2857 2029 + 5394 1 2510 2851 2031 + 5395 1 1950 2829 2819 + 5396 1 2867 2870 2409 + 5397 1 1580 2863 2532 + 5398 1 78 2841 77 + 5399 1 236 2841 2838 + 5400 1 2124 2854 2123 + 5401 1 1575 2858 1817 + 5402 1 2147 2842 222 + 5403 1 2595 2838 1573 + 5404 1 2847 2849 270 + 5405 1 2147 2849 2842 + 5406 1 88 2866 87 + 5407 1 2219 2847 270 + 5408 1 2183 2864 238 + 5409 1 2838 2841 1732 + 5410 1 2832 2839 2124 + 5411 1 2200 2846 213 + 5412 1 1569 2843 1570 + 5413 1 2587 2845 1306 + 5414 1 78 2855 2841 + 5415 1 2819 2829 1730 + 5416 1 270 2849 2147 + 5417 1 73 2848 72 + 5418 1 1635 2836 2826 + 5419 1 2837 2842 1970 + 5420 1 2185 2862 2851 + 5421 1 1578 2869 1580 + 5422 1 2039 2874 1584 + 5423 1 2833 2837 1724 + 5424 1 2861 2876 260 + 5425 1 82 2873 81 + 5426 1 2841 2855 1732 + 5427 1 1731 2850 1571 + 5428 1 222 2842 2837 + 5429 1 2031 2862 2857 + 5430 1 2857 2862 209 + 5431 1 1784 2861 2859 + 5432 1 236 2852 76 + 5433 1 2865 2870 2117 + 5434 1 1986 2840 2831 + 5435 1 2117 2870 1577 + 5436 1 72 2848 2844 + 5437 1 79 2855 78 + 5438 1 2377 2877 225 + 5439 1 213 2846 2843 + 5440 1 80 2853 202 + 5441 1 273 2867 2409 + 5442 1 2878 2879 2369 + 5443 1 2031 2857 2028 + 5444 1 2844 2848 1731 + 5445 1 2027 2872 1583 + 5446 1 1582 2878 2369 + 5447 1 2824 2844 1731 + 5448 1 1572 2856 1575 + 5449 1 209 2860 2857 + 5450 1 2072 2880 233 + 5451 1 1583 2871 1576 + 5452 1 2848 2850 1731 + 5453 1 202 2858 2856 + 5454 1 209 2862 2184 + 5455 1 1576 2871 2865 + 5456 1 1583 2872 2871 + 5457 1 102 2859 101 + 5458 1 87 2860 86 + 5459 1 1734 2876 2649 + 5460 1 2859 2861 260 + 5461 1 2843 2846 1570 + 5462 1 2369 2879 1733 + 5463 1 1576 2865 2117 + 5464 1 2856 2858 1575 + 5465 1 2852 2854 2124 + 5466 1 2029 2872 2027 + 5467 1 1580 2864 2863 + 5468 1 2868 2874 2039 + 5469 1 2649 2861 1782 + 5470 1 253 2875 2377 + 5471 1 2857 2860 2029 + 5472 1 1581 2868 2039 + 5473 1 2875 2877 2377 + 5474 1 217 2870 2865 + 5475 1 2532 2863 1232 + 5476 1 236 2854 2852 + 5477 1 2185 2864 2183 + 5478 1 217 2865 2186 + 5479 1 2071 2868 273 + 5480 1 238 2873 82 + 5481 1 1818 2869 1578 + 5482 1 1579 2875 1582 + 5483 1 255 2866 88 + 5484 1 2071 2874 2868 + 5485 1 2853 2858 202 + 5486 1 2186 2871 255 + 5487 1 1577 2867 1581 + 5488 1 1584 2877 1579 + 5489 1 1733 2880 1734 + 5490 1 2871 2872 255 + 5491 1 2409 2870 217 + 5492 1 2344 2878 253 + 5493 1 2865 2871 2186 + 5494 1 225 2874 2071 + 5495 1 2344 2879 2878 + 5496 1 260 2876 2072 + 5497 1 233 2879 2344 + 5498 1 2863 2864 2185 + 5499 1 2851 2862 2031 + 5500 1 1579 2877 2875 + 5501 1 273 2868 2867 + 5502 1 2866 2872 2029 + 5503 1 2867 2868 1581 + 5504 1 2875 2878 1582 + 5505 1 253 2878 2875 + 5506 1 1734 2880 2876 + 5507 1 255 2872 2866 + 5508 1 2876 2880 2072 + 5509 1 2869 2873 238 + 5510 1 1818 2873 2869 + 5511 1 1102 2881 2502 + 5512 1 2686 2881 1767 + 5513 1 1775 2891 211 + 5514 1 1866 2890 1864 + 5515 1 2502 2881 2686 + 5516 1 2411 2984 239 + 5517 1 2954 3011 2816 + 5518 1 1773 2893 1775 + 5519 1 191 2882 190 + 5520 1 2969 3015 2410 + 5521 1 165 2883 164 + 5522 1 250 2895 1866 + 5523 1 277 2985 1865 + 5524 1 1790 2986 276 + 5525 1 1787 2994 240 + 5526 1 2912 2944 151 + 5527 1 215 2882 191 + 5528 1 1357 2886 2214 + 5529 1 1398 2886 1777 + 5530 1 2956 3013 2609 + 5531 1 2771 3015 2969 + 5532 1 1786 2988 13 + 5533 1 28 2887 27 + 5534 1 2421 2966 1796 + 5535 1 103 2888 102 + 5536 1 2859 2888 1784 + 5537 1 1779 2961 244 + 5538 1 2911 2952 246 + 5539 1 2904 2945 249 + 5540 1 2905 2946 235 + 5541 1 2908 2951 1749 + 5542 1 2907 2949 241 + 5543 1 2111 2939 2899 + 5544 1 1746 2938 2898 + 5545 1 1747 2941 2901 + 5546 1 1750 2943 2903 + 5547 1 1745 2937 2897 + 5548 1 1748 2940 2900 + 5549 1 2909 2926 203 + 5550 1 214 2930 2902 + 5551 1 2906 2918 218 + 5552 1 2910 2936 231 + 5553 1 228 2883 165 + 5554 1 1887 3003 2885 + 5555 1 1252 2889 2666 + 5556 1 1864 2890 1371 + 5557 1 1258 2890 1357 + 5558 1 211 2891 23 + 5559 1 22 2891 265 + 5560 1 28 2971 2887 + 5561 1 234 3011 2954 + 5562 1 2893 2914 1775 + 5563 1 177 2892 176 + 5564 1 2191 2889 2192 + 5565 1 1785 2990 39 + 5566 1 1505 2893 1773 + 5567 1 1555 2893 1503 + 5568 1 1887 2884 1888 + 5569 1 227 2993 1786 + 5570 1 2189 2894 2191 + 5571 1 9 2895 250 + 5572 1 2214 2886 1398 + 5573 1 256 3013 2956 + 5574 1 106 2896 105 + 5575 1 109 2897 108 + 5576 1 112 2898 111 + 5577 1 130 2900 129 + 5578 1 119 2899 118 + 5579 1 133 2901 132 + 5580 1 149 2903 148 + 5581 1 1618 2902 2722 + 5582 1 2113 2904 1606 + 5583 1 1916 2905 1605 + 5584 1 2112 2906 2110 + 5585 1 1834 2907 1608 + 5586 1 2000 2909 1610 + 5587 1 137 2908 136 + 5588 1 1862 2911 1863 + 5589 1 2814 2910 1619 + 5590 1 107 2937 249 + 5591 1 110 2938 235 + 5592 1 117 2939 218 + 5593 1 128 2940 203 + 5594 1 131 2941 241 + 5595 1 1609 2942 1749 + 5596 1 147 2943 231 + 5597 1 1748 2949 1617 + 5598 1 150 2944 246 + 5599 1 1745 2946 1614 + 5600 1 1746 2947 1615 + 5601 1 1791 2945 1771 + 5602 1 2111 2948 1602 + 5603 1 214 2951 138 + 5604 1 1750 2952 1604 + 5605 1 1747 2950 1616 + 5606 1 1774 2983 2199 + 5607 1 27 2887 242 + 5608 1 2883 2974 164 + 5609 1 2192 2953 237 + 5610 1 240 3001 1789 + 5611 1 1625 2954 2816 + 5612 1 1768 2955 1769 + 5613 1 1882 2955 1885 + 5614 1 2263 2957 2264 + 5615 1 2276 2959 262 + 5616 1 1760 3014 2964 + 5617 1 268 2978 2073 + 5618 1 1867 2944 2912 + 5619 1 2882 2977 190 + 5620 1 244 2961 11 + 5621 1 245 3003 1887 + 5622 1 1593 2962 1591 + 5623 1 176 2963 175 + 5624 1 1797 2982 252 + 5625 1 102 2888 2859 + 5626 1 1760 2964 2473 + 5627 1 1736 2964 1794 + 5628 1 1727 2965 1729 + 5629 1 2887 2971 1744 + 5630 1 1795 2954 1624 + 5631 1 2884 2885 275 + 5632 1 1594 2967 1593 + 5633 1 219 2975 2252 + 5634 1 257 2976 2176 + 5635 1 1763 2969 1762 + 5636 1 1766 2970 1586 + 5637 1 201 2971 29 + 5638 1 1600 2972 1768 + 5639 1 1853 2956 2609 + 5640 1 1844 2974 2883 + 5641 1 2218 2973 2216 + 5642 1 163 2974 234 + 5643 1 1983 2975 1712 + 5644 1 1623 2976 1759 + 5645 1 1756 2977 2882 + 5646 1 1757 2980 2188 + 5647 1 189 2977 256 + 5648 1 1652 2978 1758 + 5649 1 2819 2889 1252 + 5650 1 152 2912 151 + 5651 1 105 2913 104 + 5652 1 1875 2979 1761 + 5653 1 1785 2979 1743 + 5654 1 2188 2980 171 + 5655 1 170 2980 220 + 5656 1 223 2981 2275 + 5657 1 252 2982 197 + 5658 1 196 2982 221 + 5659 1 1371 2890 1258 + 5660 1 24 2983 211 + 5661 1 2199 2983 25 + 5662 1 2052 2984 1739 + 5663 1 7 2985 277 + 5664 1 250 2985 8 + 5665 1 276 2986 154 + 5666 1 155 2986 247 + 5667 1 248 2987 159 + 5668 1 158 2987 274 + 5669 1 12 2988 244 + 5670 1 1589 2989 2692 + 5671 1 38 2990 261 + 5672 1 263 2991 46 + 5673 1 45 2991 223 + 5674 1 19 2992 219 + 5675 1 1759 2958 1868 + 5676 1 1984 2957 1983 + 5677 1 2889 3007 2666 + 5678 1 1737 2995 1740 + 5679 1 1595 2996 2825 + 5680 1 23 2891 22 + 5681 1 1753 2997 2771 + 5682 1 1843 2998 1840 + 5683 1 1755 2999 2757 + 5684 1 2357 2972 263 + 5685 1 2421 3001 34 + 5686 1 33 3001 240 + 5687 1 239 2892 177 + 5688 1 248 3002 1793 + 5689 1 52 3003 245 + 5690 1 2218 2992 20 + 5691 1 3 3005 103 + 5692 1 157 3005 3 + 5693 1 2 3006 54 + 5694 1 55 3006 2 + 5695 1 261 2970 2236 + 5696 1 212 2969 2410 + 5697 1 1758 2960 2720 + 5698 1 54 3006 2885 + 5699 1 1884 3000 245 + 5700 1 240 2994 32 + 5701 1 1503 2893 1505 + 5702 1 1767 2966 1766 + 5703 1 2070 2967 230 + 5704 1 160 3002 248 + 5705 1 1778 2988 1786 + 5706 1 1761 2959 1735 + 5707 1 2720 2960 2721 + 5708 1 2276 2981 1585 + 5709 1 207 2894 2189 + 5710 1 2964 3014 201 + 5711 1 10 2895 9 + 5712 1 2896 2945 1791 + 5713 1 2900 2949 1748 + 5714 1 2897 2946 1745 + 5715 1 2898 2947 1746 + 5716 1 2899 2948 2111 + 5717 1 249 2937 2904 + 5718 1 235 2938 2905 + 5719 1 2901 2950 1747 + 5720 1 2902 2951 214 + 5721 1 218 2939 2906 + 5722 1 2903 2952 1750 + 5723 1 241 2941 2907 + 5724 1 203 2940 2909 + 5725 1 1749 2942 2908 + 5726 1 231 2943 2910 + 5727 1 246 2944 2911 + 5728 1 208 2966 2421 + 5729 1 1786 2993 1780 + 5730 1 1868 2958 1772 + 5731 1 249 2896 106 + 5732 1 235 2897 109 + 5733 1 226 2898 112 + 5734 1 272 2899 119 + 5735 1 241 2900 130 + 5736 1 206 2901 133 + 5737 1 246 2903 149 + 5738 1 1749 2902 1618 + 5739 1 1606 2904 1745 + 5740 1 1605 2905 1746 + 5741 1 2110 2906 2111 + 5742 1 1608 2907 1747 + 5743 1 136 2908 266 + 5744 1 1610 2909 1748 + 5745 1 1619 2910 1750 + 5746 1 1863 2911 1867 + 5747 1 2191 3007 2889 + 5748 1 1765 2990 1785 + 5749 1 2392 2965 204 + 5750 1 2889 3012 2192 + 5751 1 247 2962 2370 + 5752 1 1751 2956 1853 + 5753 1 2597 2914 1555 + 5754 1 2915 2947 226 + 5755 1 2927 2950 206 + 5756 1 2922 2948 272 + 5757 1 266 2942 2928 + 5758 1 2222 2918 2917 + 5759 1 2917 2918 1920 + 5760 1 2923 2924 1633 + 5761 1 243 2924 2923 + 5762 1 2930 2934 1612 + 5763 1 2259 2934 2930 + 5764 1 2927 2928 1648 + 5765 1 2258 2928 2927 + 5766 1 2932 2935 1613 + 5767 1 2187 2935 2932 + 5768 1 1869 2915 1607 + 5769 1 2222 2917 271 + 5770 1 1920 2918 2112 + 5771 1 271 2916 2093 + 5772 1 210 2921 2919 + 5773 1 271 2917 2916 + 5774 1 210 2919 2380 + 5775 1 2380 2922 272 + 5776 1 203 2926 2127 + 5777 1 2919 2922 2380 + 5778 1 2220 2920 2419 + 5779 1 2419 2921 210 + 5780 1 243 2923 2220 + 5781 1 1633 2924 1635 + 5782 1 2924 2925 1635 + 5783 1 2920 2921 2419 + 5784 1 2220 2923 2920 + 5785 1 1824 2929 1629 + 5786 1 1648 2928 1626 + 5787 1 2259 2930 214 + 5788 1 2258 2927 206 + 5789 1 1612 2934 1824 + 5790 1 2933 2936 1611 + 5791 1 2929 2931 1629 + 5792 1 1635 2925 2836 + 5793 1 1629 2931 1627 + 5794 1 1613 2935 2065 + 5795 1 2187 2932 224 + 5796 1 1824 2934 2929 + 5797 1 2065 2933 1611 + 5798 1 1611 2936 2814 + 5799 1 2065 2935 2933 + 5800 1 2093 2915 226 + 5801 1 1607 2916 1919 + 5802 1 2919 2921 1908 + 5803 1 1919 2917 1920 + 5804 1 218 2918 2222 + 5805 1 1632 2919 1908 + 5806 1 2916 2917 1919 + 5807 1 1603 2923 1633 + 5808 1 1630 2922 1632 + 5809 1 2542 2920 1603 + 5810 1 1908 2921 2542 + 5811 1 2920 2923 1603 + 5812 1 2381 2924 243 + 5813 1 2542 2921 2920 + 5814 1 1632 2922 2919 + 5815 1 2381 2925 2924 + 5816 1 2127 2925 2381 + 5817 1 1860 2927 1648 + 5818 1 2260 2931 2929 + 5819 1 266 2928 2258 + 5820 1 2260 2929 267 + 5821 1 2223 2936 2933 + 5822 1 1627 2932 1613 + 5823 1 2223 2933 254 + 5824 1 224 2931 2260 + 5825 1 2722 2930 1612 + 5826 1 2836 2926 2000 + 5827 1 267 2934 2259 + 5828 1 254 2935 2187 + 5829 1 2929 2934 267 + 5830 1 231 2936 2223 + 5831 1 2933 2935 254 + 5832 1 2915 2916 1607 + 5833 1 2093 2916 2915 + 5834 1 2931 2932 1627 + 5835 1 224 2932 2931 + 5836 1 2127 2926 2925 + 5837 1 2925 2926 2836 + 5838 1 1869 2947 2915 + 5839 1 1630 2948 2922 + 5840 1 1860 2950 2927 + 5841 1 2928 2942 1626 + 5842 1 108 2937 107 + 5843 1 111 2938 110 + 5844 1 118 2939 117 + 5845 1 129 2940 128 + 5846 1 132 2941 131 + 5847 1 148 2943 147 + 5848 1 1626 2942 1609 + 5849 1 151 2944 150 + 5850 1 1614 2946 1916 + 5851 1 1615 2947 1869 + 5852 1 1771 2945 2113 + 5853 1 1602 2948 1630 + 5854 1 1617 2949 1834 + 5855 1 1616 2950 1860 + 5856 1 138 2951 137 + 5857 1 1604 2952 1862 + 5858 1 10 2961 2895 + 5859 1 237 2953 2391 + 5860 1 1624 2954 1625 + 5861 1 1769 2955 1882 + 5862 1 256 2956 2175 + 5863 1 264 2957 2263 + 5864 1 221 2958 2261 + 5865 1 1796 2966 1767 + 5866 1 262 2959 2237 + 5867 1 220 2960 2128 + 5868 1 1895 2993 2264 + 5869 1 245 3000 51 + 5870 1 11 2961 10 + 5871 1 1591 2962 1770 + 5872 1 175 2963 212 + 5873 1 2597 2973 2914 + 5874 1 2473 2964 1736 + 5875 1 2692 2965 1727 + 5876 1 2819 3012 2889 + 5877 1 2217 2992 2218 + 5878 1 1 3008 152 + 5879 1 6 3008 1 + 5880 1 4 3009 153 + 5881 1 104 3009 4 + 5882 1 50 3000 1885 + 5883 1 31 2994 1794 + 5884 1 2825 2967 1594 + 5885 1 1357 2968 2886 + 5886 1 1586 2970 1874 + 5887 1 2771 2969 1763 + 5888 1 29 2971 28 + 5889 1 1822 2972 1600 + 5890 1 2216 2973 2597 + 5891 1 164 2974 163 + 5892 1 1585 2981 1820 + 5893 1 1712 2975 1776 + 5894 1 1754 2976 1623 + 5895 1 1780 2993 1895 + 5896 1 51 3000 50 + 5897 1 190 2977 189 + 5898 1 1839 2978 1652 + 5899 1 2973 3010 2914 + 5900 1 1743 2979 1875 + 5901 1 1795 3002 161 + 5902 1 171 2980 170 + 5903 1 2275 2981 2276 + 5904 1 197 2982 196 + 5905 1 25 2983 24 + 5906 1 32 2994 31 + 5907 1 249 2945 2896 + 5908 1 235 2946 2897 + 5909 1 226 2947 2898 + 5910 1 272 2948 2899 + 5911 1 241 2949 2900 + 5912 1 206 2950 2901 + 5913 1 1749 2951 2902 + 5914 1 246 2952 2903 + 5915 1 2904 2937 1745 + 5916 1 2905 2938 1746 + 5917 1 2906 2939 2111 + 5918 1 2907 2941 1747 + 5919 1 2908 2942 266 + 5920 1 2909 2940 1748 + 5921 1 2910 2943 1750 + 5922 1 2911 2944 1867 + 5923 1 1739 2984 2177 + 5924 1 8 2985 7 + 5925 1 154 2986 155 + 5926 1 2885 3003 53 + 5927 1 159 2987 158 + 5928 1 13 2988 12 + 5929 1 2177 2989 1589 + 5930 1 39 2990 38 + 5931 1 46 2991 45 + 5932 1 20 2992 19 + 5933 1 2886 2968 1779 + 5934 1 2264 2993 227 + 5935 1 1794 2994 1787 + 5936 1 2511 2995 1737 + 5937 1 2713 2996 1595 + 5938 1 161 3002 160 + 5939 1 1752 2997 1753 + 5940 1 1840 2998 1839 + 5941 1 2757 2999 1754 + 5942 1 1866 3004 2968 + 5943 1 1793 3002 1795 + 5944 1 1885 3000 1884 + 5945 1 34 3001 33 + 5946 1 2885 3006 275 + 5947 1 2192 3012 2953 + 5948 1 103 3005 2888 + 5949 1 2961 3004 2895 + 5950 1 53 3003 52 + 5951 1 153 3009 276 + 5952 1 277 3008 6 + 5953 1 2997 3015 2771 + 5954 1 275 3006 55 + 5955 1 274 3005 157 + 5956 1 2977 3013 256 + 5957 1 2666 3007 1670 + 5958 1 2974 3011 234 + 5959 1 201 3014 2971 + 5960 1 2894 3007 2191 + 5961 1 1744 3014 1760 + 5962 1 2891 3010 265 + 5963 1 2816 3011 1844 + 5964 1 1730 3012 2819 + 5965 1 2609 3013 1756 + 5966 1 2410 3015 269 + 5967 1 2888 3005 274 + 5968 1 265 3010 2973 + 5969 1 1775 3010 2891 + 5970 1 2895 3004 1866 + 5971 1 2953 3012 1730 + 5972 1 2912 3008 277 + 5973 1 276 3009 2913 + 5974 1 2914 3010 1775 + 5975 1 1670 3007 2894 + 5976 1 1779 3004 2961 + 5977 1 152 3008 2912 + 5978 1 2913 3009 104 + 5979 1 2968 3004 1779 + 5980 1 2971 3014 1744 + 5981 1 1844 3011 2974 + 5982 1 1756 3013 2977 + 5983 1 269 3015 2997 +End Elements + + +Begin Conditions LineLoadCondition2D2N + 1 1 153 4 + 2 1 154 153 + 3 1 155 154 + 4 1 156 155 + 5 1 5 156 +End Conditions + + +Begin SubModelPart soil_block + Begin SubModelPartTables + End SubModelPartTables + Begin SubModelPartNodes + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + 13 + 14 + 15 + 16 + 17 + 18 + 19 + 20 + 21 + 22 + 23 + 24 + 25 + 26 + 27 + 28 + 29 + 30 + 31 + 32 + 33 + 34 + 35 + 36 + 37 + 38 + 39 + 40 + 41 + 42 + 43 + 44 + 45 + 46 + 47 + 48 + 49 + 50 + 51 + 52 + 53 + 54 + 55 + 56 + 57 + 58 + 59 + 60 + 61 + 62 + 63 + 64 + 65 + 66 + 67 + 68 + 69 + 70 + 71 + 72 + 73 + 74 + 75 + 76 + 77 + 78 + 79 + 80 + 81 + 82 + 83 + 84 + 85 + 86 + 87 + 88 + 89 + 90 + 91 + 92 + 93 + 94 + 95 + 96 + 97 + 98 + 99 + 100 + 101 + 102 + 103 + 104 + 105 + 106 + 107 + 108 + 109 + 110 + 111 + 112 + 113 + 114 + 115 + 116 + 117 + 118 + 119 + 120 + 121 + 122 + 123 + 124 + 125 + 126 + 127 + 128 + 129 + 130 + 131 + 132 + 133 + 134 + 135 + 136 + 137 + 138 + 139 + 140 + 141 + 142 + 143 + 144 + 145 + 146 + 147 + 148 + 149 + 150 + 151 + 152 + 153 + 154 + 155 + 156 + 157 + 158 + 159 + 160 + 161 + 162 + 163 + 164 + 165 + 166 + 167 + 168 + 169 + 170 + 171 + 172 + 173 + 174 + 175 + 176 + 177 + 178 + 179 + 180 + 181 + 182 + 183 + 184 + 185 + 186 + 187 + 188 + 189 + 190 + 191 + 192 + 193 + 194 + 195 + 196 + 197 + 198 + 199 + 200 + 201 + 202 + 203 + 204 + 205 + 206 + 207 + 208 + 209 + 210 + 211 + 212 + 213 + 214 + 215 + 216 + 217 + 218 + 219 + 220 + 221 + 222 + 223 + 224 + 225 + 226 + 227 + 228 + 229 + 230 + 231 + 232 + 233 + 234 + 235 + 236 + 237 + 238 + 239 + 240 + 241 + 242 + 243 + 244 + 245 + 246 + 247 + 248 + 249 + 250 + 251 + 252 + 253 + 254 + 255 + 256 + 257 + 258 + 259 + 260 + 261 + 262 + 263 + 264 + 265 + 266 + 267 + 268 + 269 + 270 + 271 + 272 + 273 + 274 + 275 + 276 + 277 + 278 + 279 + 280 + 281 + 282 + 283 + 284 + 285 + 286 + 287 + 288 + 289 + 290 + 291 + 292 + 293 + 294 + 295 + 296 + 297 + 298 + 299 + 300 + 301 + 302 + 303 + 304 + 305 + 306 + 307 + 308 + 309 + 310 + 311 + 312 + 313 + 314 + 315 + 316 + 317 + 318 + 319 + 320 + 321 + 322 + 323 + 324 + 325 + 326 + 327 + 328 + 329 + 330 + 331 + 332 + 333 + 334 + 335 + 336 + 337 + 338 + 339 + 340 + 341 + 342 + 343 + 344 + 345 + 346 + 347 + 348 + 349 + 350 + 351 + 352 + 353 + 354 + 355 + 356 + 357 + 358 + 359 + 360 + 361 + 362 + 363 + 364 + 365 + 366 + 367 + 368 + 369 + 370 + 371 + 372 + 373 + 374 + 375 + 376 + 377 + 378 + 379 + 380 + 381 + 382 + 383 + 384 + 385 + 386 + 387 + 388 + 389 + 390 + 391 + 392 + 393 + 394 + 395 + 396 + 397 + 398 + 399 + 400 + 401 + 402 + 403 + 404 + 405 + 406 + 407 + 408 + 409 + 410 + 411 + 412 + 413 + 414 + 415 + 416 + 417 + 418 + 419 + 420 + 421 + 422 + 423 + 424 + 425 + 426 + 427 + 428 + 429 + 430 + 431 + 432 + 433 + 434 + 435 + 436 + 437 + 438 + 439 + 440 + 441 + 442 + 443 + 444 + 445 + 446 + 447 + 448 + 449 + 450 + 451 + 452 + 453 + 454 + 455 + 456 + 457 + 458 + 459 + 460 + 461 + 462 + 463 + 464 + 465 + 466 + 467 + 468 + 469 + 470 + 471 + 472 + 473 + 474 + 475 + 476 + 477 + 478 + 479 + 480 + 481 + 482 + 483 + 484 + 485 + 486 + 487 + 488 + 489 + 490 + 491 + 492 + 493 + 494 + 495 + 496 + 497 + 498 + 499 + 500 + 501 + 502 + 503 + 504 + 505 + 506 + 507 + 508 + 509 + 510 + 511 + 512 + 513 + 514 + 515 + 516 + 517 + 518 + 519 + 520 + 521 + 522 + 523 + 524 + 525 + 526 + 527 + 528 + 529 + 530 + 531 + 532 + 533 + 534 + 535 + 536 + 537 + 538 + 539 + 540 + 541 + 542 + 543 + 544 + 545 + 546 + 547 + 548 + 549 + 550 + 551 + 552 + 553 + 554 + 555 + 556 + 557 + 558 + 559 + 560 + 561 + 562 + 563 + 564 + 565 + 566 + 567 + 568 + 569 + 570 + 571 + 572 + 573 + 574 + 575 + 576 + 577 + 578 + 579 + 580 + 581 + 582 + 583 + 584 + 585 + 586 + 587 + 588 + 589 + 590 + 591 + 592 + 593 + 594 + 595 + 596 + 597 + 598 + 599 + 600 + 601 + 602 + 603 + 604 + 605 + 606 + 607 + 608 + 609 + 610 + 611 + 612 + 613 + 614 + 615 + 616 + 617 + 618 + 619 + 620 + 621 + 622 + 623 + 624 + 625 + 626 + 627 + 628 + 629 + 630 + 631 + 632 + 633 + 634 + 635 + 636 + 637 + 638 + 639 + 640 + 641 + 642 + 643 + 644 + 645 + 646 + 647 + 648 + 649 + 650 + 651 + 652 + 653 + 654 + 655 + 656 + 657 + 658 + 659 + 660 + 661 + 662 + 663 + 664 + 665 + 666 + 667 + 668 + 669 + 670 + 671 + 672 + 673 + 674 + 675 + 676 + 677 + 678 + 679 + 680 + 681 + 682 + 683 + 684 + 685 + 686 + 687 + 688 + 689 + 690 + 691 + 692 + 693 + 694 + 695 + 696 + 697 + 698 + 699 + 700 + 701 + 702 + 703 + 704 + 705 + 706 + 707 + 708 + 709 + 710 + 711 + 712 + 713 + 714 + 715 + 716 + 717 + 718 + 719 + 720 + 721 + 722 + 723 + 724 + 725 + 726 + 727 + 728 + 729 + 730 + 731 + 732 + 733 + 734 + 735 + 736 + 737 + 738 + 739 + 740 + 741 + 742 + 743 + 744 + 745 + 746 + 747 + 748 + 749 + 750 + 751 + 752 + 753 + 754 + 755 + 756 + 757 + 758 + 759 + 760 + 761 + 762 + 763 + 764 + 765 + 766 + 767 + 768 + 769 + 770 + 771 + 772 + 773 + 774 + 775 + 776 + 777 + 778 + 779 + 780 + 781 + 782 + 783 + 784 + 785 + 786 + 787 + 788 + 789 + 790 + 791 + 792 + 793 + 794 + 795 + 796 + 797 + 798 + 799 + 800 + 801 + 802 + 803 + 804 + 805 + 806 + 807 + 808 + 809 + 810 + 811 + 812 + 813 + 814 + 815 + 816 + 817 + 818 + 819 + 820 + 821 + 822 + 823 + 824 + 825 + 826 + 827 + 828 + 829 + 830 + 831 + 832 + 833 + 834 + 835 + 836 + 837 + 838 + 839 + 840 + 841 + 842 + 843 + 844 + 845 + 846 + 847 + 848 + 849 + 850 + 851 + 852 + 853 + 854 + 855 + 856 + 857 + 858 + 859 + 860 + 861 + 862 + 863 + 864 + 865 + 866 + 867 + 868 + 869 + 870 + 871 + 872 + 873 + 874 + 875 + 876 + 877 + 878 + 879 + 880 + 881 + 882 + 883 + 884 + 885 + 886 + 887 + 888 + 889 + 890 + 891 + 892 + 893 + 894 + 895 + 896 + 897 + 898 + 899 + 900 + 901 + 902 + 903 + 904 + 905 + 906 + 907 + 908 + 909 + 910 + 911 + 912 + 913 + 914 + 915 + 916 + 917 + 918 + 919 + 920 + 921 + 922 + 923 + 924 + 925 + 926 + 927 + 928 + 929 + 930 + 931 + 932 + 933 + 934 + 935 + 936 + 937 + 938 + 939 + 940 + 941 + 942 + 943 + 944 + 945 + 946 + 947 + 948 + 949 + 950 + 951 + 952 + 953 + 954 + 955 + 956 + 957 + 958 + 959 + 960 + 961 + 962 + 963 + 964 + 965 + 966 + 967 + 968 + 969 + 970 + 971 + 972 + 973 + 974 + 975 + 976 + 977 + 978 + 979 + 980 + 981 + 982 + 983 + 984 + 985 + 986 + 987 + 988 + 989 + 990 + 991 + 992 + 993 + 994 + 995 + 996 + 997 + 998 + 999 + 1000 + 1001 + 1002 + 1003 + 1004 + 1005 + 1006 + 1007 + 1008 + 1009 + 1010 + 1011 + 1012 + 1013 + 1014 + 1015 + 1016 + 1017 + 1018 + 1019 + 1020 + 1021 + 1022 + 1023 + 1024 + 1025 + 1026 + 1027 + 1028 + 1029 + 1030 + 1031 + 1032 + 1033 + 1034 + 1035 + 1036 + 1037 + 1038 + 1039 + 1040 + 1041 + 1042 + 1043 + 1044 + 1045 + 1046 + 1047 + 1048 + 1049 + 1050 + 1051 + 1052 + 1053 + 1054 + 1055 + 1056 + 1057 + 1058 + 1059 + 1060 + 1061 + 1062 + 1063 + 1064 + 1065 + 1066 + 1067 + 1068 + 1069 + 1070 + 1071 + 1072 + 1073 + 1074 + 1075 + 1076 + 1077 + 1078 + 1079 + 1080 + 1081 + 1082 + 1083 + 1084 + 1085 + 1086 + 1087 + 1088 + 1089 + 1090 + 1091 + 1092 + 1093 + 1094 + 1095 + 1096 + 1097 + 1098 + 1099 + 1100 + 1101 + 1102 + 1103 + 1104 + 1105 + 1106 + 1107 + 1108 + 1109 + 1110 + 1111 + 1112 + 1113 + 1114 + 1115 + 1116 + 1117 + 1118 + 1119 + 1120 + 1121 + 1122 + 1123 + 1124 + 1125 + 1126 + 1127 + 1128 + 1129 + 1130 + 1131 + 1132 + 1133 + 1134 + 1135 + 1136 + 1137 + 1138 + 1139 + 1140 + 1141 + 1142 + 1143 + 1144 + 1145 + 1146 + 1147 + 1148 + 1149 + 1150 + 1151 + 1152 + 1153 + 1154 + 1155 + 1156 + 1157 + 1158 + 1159 + 1160 + 1161 + 1162 + 1163 + 1164 + 1165 + 1166 + 1167 + 1168 + 1169 + 1170 + 1171 + 1172 + 1173 + 1174 + 1175 + 1176 + 1177 + 1178 + 1179 + 1180 + 1181 + 1182 + 1183 + 1184 + 1185 + 1186 + 1187 + 1188 + 1189 + 1190 + 1191 + 1192 + 1193 + 1194 + 1195 + 1196 + 1197 + 1198 + 1199 + 1200 + 1201 + 1202 + 1203 + 1204 + 1205 + 1206 + 1207 + 1208 + 1209 + 1210 + 1211 + 1212 + 1213 + 1214 + 1215 + 1216 + 1217 + 1218 + 1219 + 1220 + 1221 + 1222 + 1223 + 1224 + 1225 + 1226 + 1227 + 1228 + 1229 + 1230 + 1231 + 1232 + 1233 + 1234 + 1235 + 1236 + 1237 + 1238 + 1239 + 1240 + 1241 + 1242 + 1243 + 1244 + 1245 + 1246 + 1247 + 1248 + 1249 + 1250 + 1251 + 1252 + 1253 + 1254 + 1255 + 1256 + 1257 + 1258 + 1259 + 1260 + 1261 + 1262 + 1263 + 1264 + 1265 + 1266 + 1267 + 1268 + 1269 + 1270 + 1271 + 1272 + 1273 + 1274 + 1275 + 1276 + 1277 + 1278 + 1279 + 1280 + 1281 + 1282 + 1283 + 1284 + 1285 + 1286 + 1287 + 1288 + 1289 + 1290 + 1291 + 1292 + 1293 + 1294 + 1295 + 1296 + 1297 + 1298 + 1299 + 1300 + 1301 + 1302 + 1303 + 1304 + 1305 + 1306 + 1307 + 1308 + 1309 + 1310 + 1311 + 1312 + 1313 + 1314 + 1315 + 1316 + 1317 + 1318 + 1319 + 1320 + 1321 + 1322 + 1323 + 1324 + 1325 + 1326 + 1327 + 1328 + 1329 + 1330 + 1331 + 1332 + 1333 + 1334 + 1335 + 1336 + 1337 + 1338 + 1339 + 1340 + 1341 + 1342 + 1343 + 1344 + 1345 + 1346 + 1347 + 1348 + 1349 + 1350 + 1351 + 1352 + 1353 + 1354 + 1355 + 1356 + 1357 + 1358 + 1359 + 1360 + 1361 + 1362 + 1363 + 1364 + 1365 + 1366 + 1367 + 1368 + 1369 + 1370 + 1371 + 1372 + 1373 + 1374 + 1375 + 1376 + 1377 + 1378 + 1379 + 1380 + 1381 + 1382 + 1383 + 1384 + 1385 + 1386 + 1387 + 1388 + 1389 + 1390 + 1391 + 1392 + 1393 + 1394 + 1395 + 1396 + 1397 + 1398 + 1399 + 1400 + 1401 + 1402 + 1403 + 1404 + 1405 + 1406 + 1407 + 1408 + 1409 + 1410 + 1411 + 1412 + 1413 + 1414 + 1415 + 1416 + 1417 + 1418 + 1419 + 1420 + 1421 + 1422 + 1423 + 1424 + 1425 + 1426 + 1427 + 1428 + 1429 + 1430 + 1431 + 1432 + 1433 + 1434 + 1435 + 1436 + 1437 + 1438 + 1439 + 1440 + 1441 + 1442 + 1443 + 1444 + 1445 + 1446 + 1447 + 1448 + 1449 + 1450 + 1451 + 1452 + 1453 + 1454 + 1455 + 1456 + 1457 + 1458 + 1459 + 1460 + 1461 + 1462 + 1463 + 1464 + 1465 + 1466 + 1467 + 1468 + 1469 + 1470 + 1471 + 1472 + 1473 + 1474 + 1475 + 1476 + 1477 + 1478 + 1479 + 1480 + 1481 + 1482 + 1483 + 1484 + 1485 + 1486 + 1487 + 1488 + 1489 + 1490 + 1491 + 1492 + 1493 + 1494 + 1495 + 1496 + 1497 + 1498 + 1499 + 1500 + 1501 + 1502 + 1503 + 1504 + 1505 + 1506 + 1507 + 1508 + 1509 + 1510 + 1511 + 1512 + 1513 + 1514 + 1515 + 1516 + 1517 + 1518 + 1519 + 1520 + 1521 + 1522 + 1523 + 1524 + 1525 + 1526 + 1527 + 1528 + 1529 + 1530 + 1531 + 1532 + 1533 + 1534 + 1535 + 1536 + 1537 + 1538 + 1539 + 1540 + 1541 + 1542 + 1543 + 1544 + 1545 + 1546 + 1547 + 1548 + 1549 + 1550 + 1551 + 1552 + 1553 + 1554 + 1555 + 1556 + 1557 + 1558 + 1559 + 1560 + 1561 + 1562 + 1563 + 1564 + 1565 + 1566 + 1567 + 1568 + 1569 + 1570 + 1571 + 1572 + 1573 + 1574 + 1575 + 1576 + 1577 + 1578 + 1579 + 1580 + 1581 + 1582 + 1583 + 1584 + 1585 + 1586 + 1587 + 1588 + 1589 + 1590 + 1591 + 1592 + 1593 + 1594 + 1595 + 1596 + 1597 + 1598 + 1599 + 1600 + 1601 + 1602 + 1603 + 1604 + 1605 + 1606 + 1607 + 1608 + 1609 + 1610 + 1611 + 1612 + 1613 + 1614 + 1615 + 1616 + 1617 + 1618 + 1619 + 1620 + 1621 + 1622 + 1623 + 1624 + 1625 + 1626 + 1627 + 1628 + 1629 + 1630 + 1631 + 1632 + 1633 + 1634 + 1635 + 1636 + 1637 + 1638 + 1639 + 1640 + 1641 + 1642 + 1643 + 1644 + 1645 + 1646 + 1647 + 1648 + 1649 + 1650 + 1651 + 1652 + 1653 + 1654 + 1655 + 1656 + 1657 + 1658 + 1659 + 1660 + 1661 + 1662 + 1663 + 1664 + 1665 + 1666 + 1667 + 1668 + 1669 + 1670 + 1671 + 1672 + 1673 + 1674 + 1675 + 1676 + 1677 + 1678 + 1679 + 1680 + 1681 + 1682 + 1683 + 1684 + 1685 + 1686 + 1687 + 1688 + 1689 + 1690 + 1691 + 1692 + 1693 + 1694 + 1695 + 1696 + 1697 + 1698 + 1699 + 1700 + 1701 + 1702 + 1703 + 1704 + 1705 + 1706 + 1707 + 1708 + 1709 + 1710 + 1711 + 1712 + 1713 + 1714 + 1715 + 1716 + 1717 + 1718 + 1719 + 1720 + 1721 + 1722 + 1723 + 1724 + 1725 + 1726 + 1727 + 1728 + 1729 + 1730 + 1731 + 1732 + 1733 + 1734 + 1735 + 1736 + 1737 + 1738 + 1739 + 1740 + 1741 + 1742 + 1743 + 1744 + 1745 + 1746 + 1747 + 1748 + 1749 + 1750 + 1751 + 1752 + 1753 + 1754 + 1755 + 1756 + 1757 + 1758 + 1759 + 1760 + 1761 + 1762 + 1763 + 1764 + 1765 + 1766 + 1767 + 1768 + 1769 + 1770 + 1771 + 1772 + 1773 + 1774 + 1775 + 1776 + 1777 + 1778 + 1779 + 1780 + 1781 + 1782 + 1783 + 1784 + 1785 + 1786 + 1787 + 1788 + 1789 + 1790 + 1791 + 1792 + 1793 + 1794 + 1795 + 1796 + 1797 + 1798 + 1799 + 1800 + 1801 + 1802 + 1803 + 1804 + 1805 + 1806 + 1807 + 1808 + 1809 + 1810 + 1811 + 1812 + 1813 + 1814 + 1815 + 1816 + 1817 + 1818 + 1819 + 1820 + 1821 + 1822 + 1823 + 1824 + 1825 + 1826 + 1827 + 1828 + 1829 + 1830 + 1831 + 1832 + 1833 + 1834 + 1835 + 1836 + 1837 + 1838 + 1839 + 1840 + 1841 + 1842 + 1843 + 1844 + 1845 + 1846 + 1847 + 1848 + 1849 + 1850 + 1851 + 1852 + 1853 + 1854 + 1855 + 1856 + 1857 + 1858 + 1859 + 1860 + 1861 + 1862 + 1863 + 1864 + 1865 + 1866 + 1867 + 1868 + 1869 + 1870 + 1871 + 1872 + 1873 + 1874 + 1875 + 1876 + 1877 + 1878 + 1879 + 1880 + 1881 + 1882 + 1883 + 1884 + 1885 + 1886 + 1887 + 1888 + 1889 + 1890 + 1891 + 1892 + 1893 + 1894 + 1895 + 1896 + 1897 + 1898 + 1899 + 1900 + 1901 + 1902 + 1903 + 1904 + 1905 + 1906 + 1907 + 1908 + 1909 + 1910 + 1911 + 1912 + 1913 + 1914 + 1915 + 1916 + 1917 + 1918 + 1919 + 1920 + 1921 + 1922 + 1923 + 1924 + 1925 + 1926 + 1927 + 1928 + 1929 + 1930 + 1931 + 1932 + 1933 + 1934 + 1935 + 1936 + 1937 + 1938 + 1939 + 1940 + 1941 + 1942 + 1943 + 1944 + 1945 + 1946 + 1947 + 1948 + 1949 + 1950 + 1951 + 1952 + 1953 + 1954 + 1955 + 1956 + 1957 + 1958 + 1959 + 1960 + 1961 + 1962 + 1963 + 1964 + 1965 + 1966 + 1967 + 1968 + 1969 + 1970 + 1971 + 1972 + 1973 + 1974 + 1975 + 1976 + 1977 + 1978 + 1979 + 1980 + 1981 + 1982 + 1983 + 1984 + 1985 + 1986 + 1987 + 1988 + 1989 + 1990 + 1991 + 1992 + 1993 + 1994 + 1995 + 1996 + 1997 + 1998 + 1999 + 2000 + 2001 + 2002 + 2003 + 2004 + 2005 + 2006 + 2007 + 2008 + 2009 + 2010 + 2011 + 2012 + 2013 + 2014 + 2015 + 2016 + 2017 + 2018 + 2019 + 2020 + 2021 + 2022 + 2023 + 2024 + 2025 + 2026 + 2027 + 2028 + 2029 + 2030 + 2031 + 2032 + 2033 + 2034 + 2035 + 2036 + 2037 + 2038 + 2039 + 2040 + 2041 + 2042 + 2043 + 2044 + 2045 + 2046 + 2047 + 2048 + 2049 + 2050 + 2051 + 2052 + 2053 + 2054 + 2055 + 2056 + 2057 + 2058 + 2059 + 2060 + 2061 + 2062 + 2063 + 2064 + 2065 + 2066 + 2067 + 2068 + 2069 + 2070 + 2071 + 2072 + 2073 + 2074 + 2075 + 2076 + 2077 + 2078 + 2079 + 2080 + 2081 + 2082 + 2083 + 2084 + 2085 + 2086 + 2087 + 2088 + 2089 + 2090 + 2091 + 2092 + 2093 + 2094 + 2095 + 2096 + 2097 + 2098 + 2099 + 2100 + 2101 + 2102 + 2103 + 2104 + 2105 + 2106 + 2107 + 2108 + 2109 + 2110 + 2111 + 2112 + 2113 + 2114 + 2115 + 2116 + 2117 + 2118 + 2119 + 2120 + 2121 + 2122 + 2123 + 2124 + 2125 + 2126 + 2127 + 2128 + 2129 + 2130 + 2131 + 2132 + 2133 + 2134 + 2135 + 2136 + 2137 + 2138 + 2139 + 2140 + 2141 + 2142 + 2143 + 2144 + 2145 + 2146 + 2147 + 2148 + 2149 + 2150 + 2151 + 2152 + 2153 + 2154 + 2155 + 2156 + 2157 + 2158 + 2159 + 2160 + 2161 + 2162 + 2163 + 2164 + 2165 + 2166 + 2167 + 2168 + 2169 + 2170 + 2171 + 2172 + 2173 + 2174 + 2175 + 2176 + 2177 + 2178 + 2179 + 2180 + 2181 + 2182 + 2183 + 2184 + 2185 + 2186 + 2187 + 2188 + 2189 + 2190 + 2191 + 2192 + 2193 + 2194 + 2195 + 2196 + 2197 + 2198 + 2199 + 2200 + 2201 + 2202 + 2203 + 2204 + 2205 + 2206 + 2207 + 2208 + 2209 + 2210 + 2211 + 2212 + 2213 + 2214 + 2215 + 2216 + 2217 + 2218 + 2219 + 2220 + 2221 + 2222 + 2223 + 2224 + 2225 + 2226 + 2227 + 2228 + 2229 + 2230 + 2231 + 2232 + 2233 + 2234 + 2235 + 2236 + 2237 + 2238 + 2239 + 2240 + 2241 + 2242 + 2243 + 2244 + 2245 + 2246 + 2247 + 2248 + 2249 + 2250 + 2251 + 2252 + 2253 + 2254 + 2255 + 2256 + 2257 + 2258 + 2259 + 2260 + 2261 + 2262 + 2263 + 2264 + 2265 + 2266 + 2267 + 2268 + 2269 + 2270 + 2271 + 2272 + 2273 + 2274 + 2275 + 2276 + 2277 + 2278 + 2279 + 2280 + 2281 + 2282 + 2283 + 2284 + 2285 + 2286 + 2287 + 2288 + 2289 + 2290 + 2291 + 2292 + 2293 + 2294 + 2295 + 2296 + 2297 + 2298 + 2299 + 2300 + 2301 + 2302 + 2303 + 2304 + 2305 + 2306 + 2307 + 2308 + 2309 + 2310 + 2311 + 2312 + 2313 + 2314 + 2315 + 2316 + 2317 + 2318 + 2319 + 2320 + 2321 + 2322 + 2323 + 2324 + 2325 + 2326 + 2327 + 2328 + 2329 + 2330 + 2331 + 2332 + 2333 + 2334 + 2335 + 2336 + 2337 + 2338 + 2339 + 2340 + 2341 + 2342 + 2343 + 2344 + 2345 + 2346 + 2347 + 2348 + 2349 + 2350 + 2351 + 2352 + 2353 + 2354 + 2355 + 2356 + 2357 + 2358 + 2359 + 2360 + 2361 + 2362 + 2363 + 2364 + 2365 + 2366 + 2367 + 2368 + 2369 + 2370 + 2371 + 2372 + 2373 + 2374 + 2375 + 2376 + 2377 + 2378 + 2379 + 2380 + 2381 + 2382 + 2383 + 2384 + 2385 + 2386 + 2387 + 2388 + 2389 + 2390 + 2391 + 2392 + 2393 + 2394 + 2395 + 2396 + 2397 + 2398 + 2399 + 2400 + 2401 + 2402 + 2403 + 2404 + 2405 + 2406 + 2407 + 2408 + 2409 + 2410 + 2411 + 2412 + 2413 + 2414 + 2415 + 2416 + 2417 + 2418 + 2419 + 2420 + 2421 + 2422 + 2423 + 2424 + 2425 + 2426 + 2427 + 2428 + 2429 + 2430 + 2431 + 2432 + 2433 + 2434 + 2435 + 2436 + 2437 + 2438 + 2439 + 2440 + 2441 + 2442 + 2443 + 2444 + 2445 + 2446 + 2447 + 2448 + 2449 + 2450 + 2451 + 2452 + 2453 + 2454 + 2455 + 2456 + 2457 + 2458 + 2459 + 2460 + 2461 + 2462 + 2463 + 2464 + 2465 + 2466 + 2467 + 2468 + 2469 + 2470 + 2471 + 2472 + 2473 + 2474 + 2475 + 2476 + 2477 + 2478 + 2479 + 2480 + 2481 + 2482 + 2483 + 2484 + 2485 + 2486 + 2487 + 2488 + 2489 + 2490 + 2491 + 2492 + 2493 + 2494 + 2495 + 2496 + 2497 + 2498 + 2499 + 2500 + 2501 + 2502 + 2503 + 2504 + 2505 + 2506 + 2507 + 2508 + 2509 + 2510 + 2511 + 2512 + 2513 + 2514 + 2515 + 2516 + 2517 + 2518 + 2519 + 2520 + 2521 + 2522 + 2523 + 2524 + 2525 + 2526 + 2527 + 2528 + 2529 + 2530 + 2531 + 2532 + 2533 + 2534 + 2535 + 2536 + 2537 + 2538 + 2539 + 2540 + 2541 + 2542 + 2543 + 2544 + 2545 + 2546 + 2547 + 2548 + 2549 + 2550 + 2551 + 2552 + 2553 + 2554 + 2555 + 2556 + 2557 + 2558 + 2559 + 2560 + 2561 + 2562 + 2563 + 2564 + 2565 + 2566 + 2567 + 2568 + 2569 + 2570 + 2571 + 2572 + 2573 + 2574 + 2575 + 2576 + 2577 + 2578 + 2579 + 2580 + 2581 + 2582 + 2583 + 2584 + 2585 + 2586 + 2587 + 2588 + 2589 + 2590 + 2591 + 2592 + 2593 + 2594 + 2595 + 2596 + 2597 + 2598 + 2599 + 2600 + 2601 + 2602 + 2603 + 2604 + 2605 + 2606 + 2607 + 2608 + 2609 + 2610 + 2611 + 2612 + 2613 + 2614 + 2615 + 2616 + 2617 + 2618 + 2619 + 2620 + 2621 + 2622 + 2623 + 2624 + 2625 + 2626 + 2627 + 2628 + 2629 + 2630 + 2631 + 2632 + 2633 + 2634 + 2635 + 2636 + 2637 + 2638 + 2639 + 2640 + 2641 + 2642 + 2643 + 2644 + 2645 + 2646 + 2647 + 2648 + 2649 + 2650 + 2651 + 2652 + 2653 + 2654 + 2655 + 2656 + 2657 + 2658 + 2659 + 2660 + 2661 + 2662 + 2663 + 2664 + 2665 + 2666 + 2667 + 2668 + 2669 + 2670 + 2671 + 2672 + 2673 + 2674 + 2675 + 2676 + 2677 + 2678 + 2679 + 2680 + 2681 + 2682 + 2683 + 2684 + 2685 + 2686 + 2687 + 2688 + 2689 + 2690 + 2691 + 2692 + 2693 + 2694 + 2695 + 2696 + 2697 + 2698 + 2699 + 2700 + 2701 + 2702 + 2703 + 2704 + 2705 + 2706 + 2707 + 2708 + 2709 + 2710 + 2711 + 2712 + 2713 + 2714 + 2715 + 2716 + 2717 + 2718 + 2719 + 2720 + 2721 + 2722 + 2723 + 2724 + 2725 + 2726 + 2727 + 2728 + 2729 + 2730 + 2731 + 2732 + 2733 + 2734 + 2735 + 2736 + 2737 + 2738 + 2739 + 2740 + 2741 + 2742 + 2743 + 2744 + 2745 + 2746 + 2747 + 2748 + 2749 + 2750 + 2751 + 2752 + 2753 + 2754 + 2755 + 2756 + 2757 + 2758 + 2759 + 2760 + 2761 + 2762 + 2763 + 2764 + 2765 + 2766 + 2767 + 2768 + 2769 + 2770 + 2771 + 2772 + 2773 + 2774 + 2775 + 2776 + 2777 + 2778 + 2779 + 2780 + 2781 + 2782 + 2783 + 2784 + 2785 + 2786 + 2787 + 2788 + 2789 + 2790 + 2791 + 2792 + 2793 + 2794 + 2795 + 2796 + 2797 + 2798 + 2799 + 2800 + 2801 + 2802 + 2803 + 2804 + 2805 + 2806 + 2807 + 2808 + 2809 + 2810 + 2811 + 2812 + 2813 + 2814 + 2815 + 2816 + 2817 + 2818 + 2819 + 2820 + 2821 + 2822 + 2823 + 2824 + 2825 + 2826 + 2827 + 2828 + 2829 + 2830 + 2831 + 2832 + 2833 + 2834 + 2835 + 2836 + 2837 + 2838 + 2839 + 2840 + 2841 + 2842 + 2843 + 2844 + 2845 + 2846 + 2847 + 2848 + 2849 + 2850 + 2851 + 2852 + 2853 + 2854 + 2855 + 2856 + 2857 + 2858 + 2859 + 2860 + 2861 + 2862 + 2863 + 2864 + 2865 + 2866 + 2867 + 2868 + 2869 + 2870 + 2871 + 2872 + 2873 + 2874 + 2875 + 2876 + 2877 + 2878 + 2879 + 2880 + 2881 + 2882 + 2883 + 2884 + 2885 + 2886 + 2887 + 2888 + 2889 + 2890 + 2891 + 2892 + 2893 + 2894 + 2895 + 2896 + 2897 + 2898 + 2899 + 2900 + 2901 + 2902 + 2903 + 2904 + 2905 + 2906 + 2907 + 2908 + 2909 + 2910 + 2911 + 2912 + 2913 + 2914 + 2915 + 2916 + 2917 + 2918 + 2919 + 2920 + 2921 + 2922 + 2923 + 2924 + 2925 + 2926 + 2927 + 2928 + 2929 + 2930 + 2931 + 2932 + 2933 + 2934 + 2935 + 2936 + 2937 + 2938 + 2939 + 2940 + 2941 + 2942 + 2943 + 2944 + 2945 + 2946 + 2947 + 2948 + 2949 + 2950 + 2951 + 2952 + 2953 + 2954 + 2955 + 2956 + 2957 + 2958 + 2959 + 2960 + 2961 + 2962 + 2963 + 2964 + 2965 + 2966 + 2967 + 2968 + 2969 + 2970 + 2971 + 2972 + 2973 + 2974 + 2975 + 2976 + 2977 + 2978 + 2979 + 2980 + 2981 + 2982 + 2983 + 2984 + 2985 + 2986 + 2987 + 2988 + 2989 + 2990 + 2991 + 2992 + 2993 + 2994 + 2995 + 2996 + 2997 + 2998 + 2999 + 3000 + 3001 + 3002 + 3003 + 3004 + 3005 + 3006 + 3007 + 3008 + 3009 + 3010 + 3011 + 3012 + 3013 + 3014 + 3015 + End SubModelPartNodes + Begin SubModelPartElements + 156 + 157 + 158 + 159 + 160 + 161 + 162 + 163 + 164 + 165 + 166 + 167 + 168 + 169 + 170 + 171 + 172 + 173 + 174 + 175 + 176 + 177 + 178 + 179 + 180 + 181 + 182 + 183 + 184 + 185 + 186 + 187 + 188 + 189 + 190 + 191 + 192 + 193 + 194 + 195 + 196 + 197 + 198 + 199 + 200 + 201 + 202 + 203 + 204 + 205 + 206 + 207 + 208 + 209 + 210 + 211 + 212 + 213 + 214 + 215 + 216 + 217 + 218 + 219 + 220 + 221 + 222 + 223 + 224 + 225 + 226 + 227 + 228 + 229 + 230 + 231 + 232 + 233 + 234 + 235 + 236 + 237 + 238 + 239 + 240 + 241 + 242 + 243 + 244 + 245 + 246 + 247 + 248 + 249 + 250 + 251 + 252 + 253 + 254 + 255 + 256 + 257 + 258 + 259 + 260 + 261 + 262 + 263 + 264 + 265 + 266 + 267 + 268 + 269 + 270 + 271 + 272 + 273 + 274 + 275 + 276 + 277 + 278 + 279 + 280 + 281 + 282 + 283 + 284 + 285 + 286 + 287 + 288 + 289 + 290 + 291 + 292 + 293 + 294 + 295 + 296 + 297 + 298 + 299 + 300 + 301 + 302 + 303 + 304 + 305 + 306 + 307 + 308 + 309 + 310 + 311 + 312 + 313 + 314 + 315 + 316 + 317 + 318 + 319 + 320 + 321 + 322 + 323 + 324 + 325 + 326 + 327 + 328 + 329 + 330 + 331 + 332 + 333 + 334 + 335 + 336 + 337 + 338 + 339 + 340 + 341 + 342 + 343 + 344 + 345 + 346 + 347 + 348 + 349 + 350 + 351 + 352 + 353 + 354 + 355 + 356 + 357 + 358 + 359 + 360 + 361 + 362 + 363 + 364 + 365 + 366 + 367 + 368 + 369 + 370 + 371 + 372 + 373 + 374 + 375 + 376 + 377 + 378 + 379 + 380 + 381 + 382 + 383 + 384 + 385 + 386 + 387 + 388 + 389 + 390 + 391 + 392 + 393 + 394 + 395 + 396 + 397 + 398 + 399 + 400 + 401 + 402 + 403 + 404 + 405 + 406 + 407 + 408 + 409 + 410 + 411 + 412 + 413 + 414 + 415 + 416 + 417 + 418 + 419 + 420 + 421 + 422 + 423 + 424 + 425 + 426 + 427 + 428 + 429 + 430 + 431 + 432 + 433 + 434 + 435 + 436 + 437 + 438 + 439 + 440 + 441 + 442 + 443 + 444 + 445 + 446 + 447 + 448 + 449 + 450 + 451 + 452 + 453 + 454 + 455 + 456 + 457 + 458 + 459 + 460 + 461 + 462 + 463 + 464 + 465 + 466 + 467 + 468 + 469 + 470 + 471 + 472 + 473 + 474 + 475 + 476 + 477 + 478 + 479 + 480 + 481 + 482 + 483 + 484 + 485 + 486 + 487 + 488 + 489 + 490 + 491 + 492 + 493 + 494 + 495 + 496 + 497 + 498 + 499 + 500 + 501 + 502 + 503 + 504 + 505 + 506 + 507 + 508 + 509 + 510 + 511 + 512 + 513 + 514 + 515 + 516 + 517 + 518 + 519 + 520 + 521 + 522 + 523 + 524 + 525 + 526 + 527 + 528 + 529 + 530 + 531 + 532 + 533 + 534 + 535 + 536 + 537 + 538 + 539 + 540 + 541 + 542 + 543 + 544 + 545 + 546 + 547 + 548 + 549 + 550 + 551 + 552 + 553 + 554 + 555 + 556 + 557 + 558 + 559 + 560 + 561 + 562 + 563 + 564 + 565 + 566 + 567 + 568 + 569 + 570 + 571 + 572 + 573 + 574 + 575 + 576 + 577 + 578 + 579 + 580 + 581 + 582 + 583 + 584 + 585 + 586 + 587 + 588 + 589 + 590 + 591 + 592 + 593 + 594 + 595 + 596 + 597 + 598 + 599 + 600 + 601 + 602 + 603 + 604 + 605 + 606 + 607 + 608 + 609 + 610 + 611 + 612 + 613 + 614 + 615 + 616 + 617 + 618 + 619 + 620 + 621 + 622 + 623 + 624 + 625 + 626 + 627 + 628 + 629 + 630 + 631 + 632 + 633 + 634 + 635 + 636 + 637 + 638 + 639 + 640 + 641 + 642 + 643 + 644 + 645 + 646 + 647 + 648 + 649 + 650 + 651 + 652 + 653 + 654 + 655 + 656 + 657 + 658 + 659 + 660 + 661 + 662 + 663 + 664 + 665 + 666 + 667 + 668 + 669 + 670 + 671 + 672 + 673 + 674 + 675 + 676 + 677 + 678 + 679 + 680 + 681 + 682 + 683 + 684 + 685 + 686 + 687 + 688 + 689 + 690 + 691 + 692 + 693 + 694 + 695 + 696 + 697 + 698 + 699 + 700 + 701 + 702 + 703 + 704 + 705 + 706 + 707 + 708 + 709 + 710 + 711 + 712 + 713 + 714 + 715 + 716 + 717 + 718 + 719 + 720 + 721 + 722 + 723 + 724 + 725 + 726 + 727 + 728 + 729 + 730 + 731 + 732 + 733 + 734 + 735 + 736 + 737 + 738 + 739 + 740 + 741 + 742 + 743 + 744 + 745 + 746 + 747 + 748 + 749 + 750 + 751 + 752 + 753 + 754 + 755 + 756 + 757 + 758 + 759 + 760 + 761 + 762 + 763 + 764 + 765 + 766 + 767 + 768 + 769 + 770 + 771 + 772 + 773 + 774 + 775 + 776 + 777 + 778 + 779 + 780 + 781 + 782 + 783 + 784 + 785 + 786 + 787 + 788 + 789 + 790 + 791 + 792 + 793 + 794 + 795 + 796 + 797 + 798 + 799 + 800 + 801 + 802 + 803 + 804 + 805 + 806 + 807 + 808 + 809 + 810 + 811 + 812 + 813 + 814 + 815 + 816 + 817 + 818 + 819 + 820 + 821 + 822 + 823 + 824 + 825 + 826 + 827 + 828 + 829 + 830 + 831 + 832 + 833 + 834 + 835 + 836 + 837 + 838 + 839 + 840 + 841 + 842 + 843 + 844 + 845 + 846 + 847 + 848 + 849 + 850 + 851 + 852 + 853 + 854 + 855 + 856 + 857 + 858 + 859 + 860 + 861 + 862 + 863 + 864 + 865 + 866 + 867 + 868 + 869 + 870 + 871 + 872 + 873 + 874 + 875 + 876 + 877 + 878 + 879 + 880 + 881 + 882 + 883 + 884 + 885 + 886 + 887 + 888 + 889 + 890 + 891 + 892 + 893 + 894 + 895 + 896 + 897 + 898 + 899 + 900 + 901 + 902 + 903 + 904 + 905 + 906 + 907 + 908 + 909 + 910 + 911 + 912 + 913 + 914 + 915 + 916 + 917 + 918 + 919 + 920 + 921 + 922 + 923 + 924 + 925 + 926 + 927 + 928 + 929 + 930 + 931 + 932 + 933 + 934 + 935 + 936 + 937 + 938 + 939 + 940 + 941 + 942 + 943 + 944 + 945 + 946 + 947 + 948 + 949 + 950 + 951 + 952 + 953 + 954 + 955 + 956 + 957 + 958 + 959 + 960 + 961 + 962 + 963 + 964 + 965 + 966 + 967 + 968 + 969 + 970 + 971 + 972 + 973 + 974 + 975 + 976 + 977 + 978 + 979 + 980 + 981 + 982 + 983 + 984 + 985 + 986 + 987 + 988 + 989 + 990 + 991 + 992 + 993 + 994 + 995 + 996 + 997 + 998 + 999 + 1000 + 1001 + 1002 + 1003 + 1004 + 1005 + 1006 + 1007 + 1008 + 1009 + 1010 + 1011 + 1012 + 1013 + 1014 + 1015 + 1016 + 1017 + 1018 + 1019 + 1020 + 1021 + 1022 + 1023 + 1024 + 1025 + 1026 + 1027 + 1028 + 1029 + 1030 + 1031 + 1032 + 1033 + 1034 + 1035 + 1036 + 1037 + 1038 + 1039 + 1040 + 1041 + 1042 + 1043 + 1044 + 1045 + 1046 + 1047 + 1048 + 1049 + 1050 + 1051 + 1052 + 1053 + 1054 + 1055 + 1056 + 1057 + 1058 + 1059 + 1060 + 1061 + 1062 + 1063 + 1064 + 1065 + 1066 + 1067 + 1068 + 1069 + 1070 + 1071 + 1072 + 1073 + 1074 + 1075 + 1076 + 1077 + 1078 + 1079 + 1080 + 1081 + 1082 + 1083 + 1084 + 1085 + 1086 + 1087 + 1088 + 1089 + 1090 + 1091 + 1092 + 1093 + 1094 + 1095 + 1096 + 1097 + 1098 + 1099 + 1100 + 1101 + 1102 + 1103 + 1104 + 1105 + 1106 + 1107 + 1108 + 1109 + 1110 + 1111 + 1112 + 1113 + 1114 + 1115 + 1116 + 1117 + 1118 + 1119 + 1120 + 1121 + 1122 + 1123 + 1124 + 1125 + 1126 + 1127 + 1128 + 1129 + 1130 + 1131 + 1132 + 1133 + 1134 + 1135 + 1136 + 1137 + 1138 + 1139 + 1140 + 1141 + 1142 + 1143 + 1144 + 1145 + 1146 + 1147 + 1148 + 1149 + 1150 + 1151 + 1152 + 1153 + 1154 + 1155 + 1156 + 1157 + 1158 + 1159 + 1160 + 1161 + 1162 + 1163 + 1164 + 1165 + 1166 + 1167 + 1168 + 1169 + 1170 + 1171 + 1172 + 1173 + 1174 + 1175 + 1176 + 1177 + 1178 + 1179 + 1180 + 1181 + 1182 + 1183 + 1184 + 1185 + 1186 + 1187 + 1188 + 1189 + 1190 + 1191 + 1192 + 1193 + 1194 + 1195 + 1196 + 1197 + 1198 + 1199 + 1200 + 1201 + 1202 + 1203 + 1204 + 1205 + 1206 + 1207 + 1208 + 1209 + 1210 + 1211 + 1212 + 1213 + 1214 + 1215 + 1216 + 1217 + 1218 + 1219 + 1220 + 1221 + 1222 + 1223 + 1224 + 1225 + 1226 + 1227 + 1228 + 1229 + 1230 + 1231 + 1232 + 1233 + 1234 + 1235 + 1236 + 1237 + 1238 + 1239 + 1240 + 1241 + 1242 + 1243 + 1244 + 1245 + 1246 + 1247 + 1248 + 1249 + 1250 + 1251 + 1252 + 1253 + 1254 + 1255 + 1256 + 1257 + 1258 + 1259 + 1260 + 1261 + 1262 + 1263 + 1264 + 1265 + 1266 + 1267 + 1268 + 1269 + 1270 + 1271 + 1272 + 1273 + 1274 + 1275 + 1276 + 1277 + 1278 + 1279 + 1280 + 1281 + 1282 + 1283 + 1284 + 1285 + 1286 + 1287 + 1288 + 1289 + 1290 + 1291 + 1292 + 1293 + 1294 + 1295 + 1296 + 1297 + 1298 + 1299 + 1300 + 1301 + 1302 + 1303 + 1304 + 1305 + 1306 + 1307 + 1308 + 1309 + 1310 + 1311 + 1312 + 1313 + 1314 + 1315 + 1316 + 1317 + 1318 + 1319 + 1320 + 1321 + 1322 + 1323 + 1324 + 1325 + 1326 + 1327 + 1328 + 1329 + 1330 + 1331 + 1332 + 1333 + 1334 + 1335 + 1336 + 1337 + 1338 + 1339 + 1340 + 1341 + 1342 + 1343 + 1344 + 1345 + 1346 + 1347 + 1348 + 1349 + 1350 + 1351 + 1352 + 1353 + 1354 + 1355 + 1356 + 1357 + 1358 + 1359 + 1360 + 1361 + 1362 + 1363 + 1364 + 1365 + 1366 + 1367 + 1368 + 1369 + 1370 + 1371 + 1372 + 1373 + 1374 + 1375 + 1376 + 1377 + 1378 + 1379 + 1380 + 1381 + 1382 + 1383 + 1384 + 1385 + 1386 + 1387 + 1388 + 1389 + 1390 + 1391 + 1392 + 1393 + 1394 + 1395 + 1396 + 1397 + 1398 + 1399 + 1400 + 1401 + 1402 + 1403 + 1404 + 1405 + 1406 + 1407 + 1408 + 1409 + 1410 + 1411 + 1412 + 1413 + 1414 + 1415 + 1416 + 1417 + 1418 + 1419 + 1420 + 1421 + 1422 + 1423 + 1424 + 1425 + 1426 + 1427 + 1428 + 1429 + 1430 + 1431 + 1432 + 1433 + 1434 + 1435 + 1436 + 1437 + 1438 + 1439 + 1440 + 1441 + 1442 + 1443 + 1444 + 1445 + 1446 + 1447 + 1448 + 1449 + 1450 + 1451 + 1452 + 1453 + 1454 + 1455 + 1456 + 1457 + 1458 + 1459 + 1460 + 1461 + 1462 + 1463 + 1464 + 1465 + 1466 + 1467 + 1468 + 1469 + 1470 + 1471 + 1472 + 1473 + 1474 + 1475 + 1476 + 1477 + 1478 + 1479 + 1480 + 1481 + 1482 + 1483 + 1484 + 1485 + 1486 + 1487 + 1488 + 1489 + 1490 + 1491 + 1492 + 1493 + 1494 + 1495 + 1496 + 1497 + 1498 + 1499 + 1500 + 1501 + 1502 + 1503 + 1504 + 1505 + 1506 + 1507 + 1508 + 1509 + 1510 + 1511 + 1512 + 1513 + 1514 + 1515 + 1516 + 1517 + 1518 + 1519 + 1520 + 1521 + 1522 + 1523 + 1524 + 1525 + 1526 + 1527 + 1528 + 1529 + 1530 + 1531 + 1532 + 1533 + 1534 + 1535 + 1536 + 1537 + 1538 + 1539 + 1540 + 1541 + 1542 + 1543 + 1544 + 1545 + 1546 + 1547 + 1548 + 1549 + 1550 + 1551 + 1552 + 1553 + 1554 + 1555 + 1556 + 1557 + 1558 + 1559 + 1560 + 1561 + 1562 + 1563 + 1564 + 1565 + 1566 + 1567 + 1568 + 1569 + 1570 + 1571 + 1572 + 1573 + 1574 + 1575 + 1576 + 1577 + 1578 + 1579 + 1580 + 1581 + 1582 + 1583 + 1584 + 1585 + 1586 + 1587 + 1588 + 1589 + 1590 + 1591 + 1592 + 1593 + 1594 + 1595 + 1596 + 1597 + 1598 + 1599 + 1600 + 1601 + 1602 + 1603 + 1604 + 1605 + 1606 + 1607 + 1608 + 1609 + 1610 + 1611 + 1612 + 1613 + 1614 + 1615 + 1616 + 1617 + 1618 + 1619 + 1620 + 1621 + 1622 + 1623 + 1624 + 1625 + 1626 + 1627 + 1628 + 1629 + 1630 + 1631 + 1632 + 1633 + 1634 + 1635 + 1636 + 1637 + 1638 + 1639 + 1640 + 1641 + 1642 + 1643 + 1644 + 1645 + 1646 + 1647 + 1648 + 1649 + 1650 + 1651 + 1652 + 1653 + 1654 + 1655 + 1656 + 1657 + 1658 + 1659 + 1660 + 1661 + 1662 + 1663 + 1664 + 1665 + 1666 + 1667 + 1668 + 1669 + 1670 + 1671 + 1672 + 1673 + 1674 + 1675 + 1676 + 1677 + 1678 + 1679 + 1680 + 1681 + 1682 + 1683 + 1684 + 1685 + 1686 + 1687 + 1688 + 1689 + 1690 + 1691 + 1692 + 1693 + 1694 + 1695 + 1696 + 1697 + 1698 + 1699 + 1700 + 1701 + 1702 + 1703 + 1704 + 1705 + 1706 + 1707 + 1708 + 1709 + 1710 + 1711 + 1712 + 1713 + 1714 + 1715 + 1716 + 1717 + 1718 + 1719 + 1720 + 1721 + 1722 + 1723 + 1724 + 1725 + 1726 + 1727 + 1728 + 1729 + 1730 + 1731 + 1732 + 1733 + 1734 + 1735 + 1736 + 1737 + 1738 + 1739 + 1740 + 1741 + 1742 + 1743 + 1744 + 1745 + 1746 + 1747 + 1748 + 1749 + 1750 + 1751 + 1752 + 1753 + 1754 + 1755 + 1756 + 1757 + 1758 + 1759 + 1760 + 1761 + 1762 + 1763 + 1764 + 1765 + 1766 + 1767 + 1768 + 1769 + 1770 + 1771 + 1772 + 1773 + 1774 + 1775 + 1776 + 1777 + 1778 + 1779 + 1780 + 1781 + 1782 + 1783 + 1784 + 1785 + 1786 + 1787 + 1788 + 1789 + 1790 + 1791 + 1792 + 1793 + 1794 + 1795 + 1796 + 1797 + 1798 + 1799 + 1800 + 1801 + 1802 + 1803 + 1804 + 1805 + 1806 + 1807 + 1808 + 1809 + 1810 + 1811 + 1812 + 1813 + 1814 + 1815 + 1816 + 1817 + 1818 + 1819 + 1820 + 1821 + 1822 + 1823 + 1824 + 1825 + 1826 + 1827 + 1828 + 1829 + 1830 + 1831 + 1832 + 1833 + 1834 + 1835 + 1836 + 1837 + 1838 + 1839 + 1840 + 1841 + 1842 + 1843 + 1844 + 1845 + 1846 + 1847 + 1848 + 1849 + 1850 + 1851 + 1852 + 1853 + 1854 + 1855 + 1856 + 1857 + 1858 + 1859 + 1860 + 1861 + 1862 + 1863 + 1864 + 1865 + 1866 + 1867 + 1868 + 1869 + 1870 + 1871 + 1872 + 1873 + 1874 + 1875 + 1876 + 1877 + 1878 + 1879 + 1880 + 1881 + 1882 + 1883 + 1884 + 1885 + 1886 + 1887 + 1888 + 1889 + 1890 + 1891 + 1892 + 1893 + 1894 + 1895 + 1896 + 1897 + 1898 + 1899 + 1900 + 1901 + 1902 + 1903 + 1904 + 1905 + 1906 + 1907 + 1908 + 1909 + 1910 + 1911 + 1912 + 1913 + 1914 + 1915 + 1916 + 1917 + 1918 + 1919 + 1920 + 1921 + 1922 + 1923 + 1924 + 1925 + 1926 + 1927 + 1928 + 1929 + 1930 + 1931 + 1932 + 1933 + 1934 + 1935 + 1936 + 1937 + 1938 + 1939 + 1940 + 1941 + 1942 + 1943 + 1944 + 1945 + 1946 + 1947 + 1948 + 1949 + 1950 + 1951 + 1952 + 1953 + 1954 + 1955 + 1956 + 1957 + 1958 + 1959 + 1960 + 1961 + 1962 + 1963 + 1964 + 1965 + 1966 + 1967 + 1968 + 1969 + 1970 + 1971 + 1972 + 1973 + 1974 + 1975 + 1976 + 1977 + 1978 + 1979 + 1980 + 1981 + 1982 + 1983 + 1984 + 1985 + 1986 + 1987 + 1988 + 1989 + 1990 + 1991 + 1992 + 1993 + 1994 + 1995 + 1996 + 1997 + 1998 + 1999 + 2000 + 2001 + 2002 + 2003 + 2004 + 2005 + 2006 + 2007 + 2008 + 2009 + 2010 + 2011 + 2012 + 2013 + 2014 + 2015 + 2016 + 2017 + 2018 + 2019 + 2020 + 2021 + 2022 + 2023 + 2024 + 2025 + 2026 + 2027 + 2028 + 2029 + 2030 + 2031 + 2032 + 2033 + 2034 + 2035 + 2036 + 2037 + 2038 + 2039 + 2040 + 2041 + 2042 + 2043 + 2044 + 2045 + 2046 + 2047 + 2048 + 2049 + 2050 + 2051 + 2052 + 2053 + 2054 + 2055 + 2056 + 2057 + 2058 + 2059 + 2060 + 2061 + 2062 + 2063 + 2064 + 2065 + 2066 + 2067 + 2068 + 2069 + 2070 + 2071 + 2072 + 2073 + 2074 + 2075 + 2076 + 2077 + 2078 + 2079 + 2080 + 2081 + 2082 + 2083 + 2084 + 2085 + 2086 + 2087 + 2088 + 2089 + 2090 + 2091 + 2092 + 2093 + 2094 + 2095 + 2096 + 2097 + 2098 + 2099 + 2100 + 2101 + 2102 + 2103 + 2104 + 2105 + 2106 + 2107 + 2108 + 2109 + 2110 + 2111 + 2112 + 2113 + 2114 + 2115 + 2116 + 2117 + 2118 + 2119 + 2120 + 2121 + 2122 + 2123 + 2124 + 2125 + 2126 + 2127 + 2128 + 2129 + 2130 + 2131 + 2132 + 2133 + 2134 + 2135 + 2136 + 2137 + 2138 + 2139 + 2140 + 2141 + 2142 + 2143 + 2144 + 2145 + 2146 + 2147 + 2148 + 2149 + 2150 + 2151 + 2152 + 2153 + 2154 + 2155 + 2156 + 2157 + 2158 + 2159 + 2160 + 2161 + 2162 + 2163 + 2164 + 2165 + 2166 + 2167 + 2168 + 2169 + 2170 + 2171 + 2172 + 2173 + 2174 + 2175 + 2176 + 2177 + 2178 + 2179 + 2180 + 2181 + 2182 + 2183 + 2184 + 2185 + 2186 + 2187 + 2188 + 2189 + 2190 + 2191 + 2192 + 2193 + 2194 + 2195 + 2196 + 2197 + 2198 + 2199 + 2200 + 2201 + 2202 + 2203 + 2204 + 2205 + 2206 + 2207 + 2208 + 2209 + 2210 + 2211 + 2212 + 2213 + 2214 + 2215 + 2216 + 2217 + 2218 + 2219 + 2220 + 2221 + 2222 + 2223 + 2224 + 2225 + 2226 + 2227 + 2228 + 2229 + 2230 + 2231 + 2232 + 2233 + 2234 + 2235 + 2236 + 2237 + 2238 + 2239 + 2240 + 2241 + 2242 + 2243 + 2244 + 2245 + 2246 + 2247 + 2248 + 2249 + 2250 + 2251 + 2252 + 2253 + 2254 + 2255 + 2256 + 2257 + 2258 + 2259 + 2260 + 2261 + 2262 + 2263 + 2264 + 2265 + 2266 + 2267 + 2268 + 2269 + 2270 + 2271 + 2272 + 2273 + 2274 + 2275 + 2276 + 2277 + 2278 + 2279 + 2280 + 2281 + 2282 + 2283 + 2284 + 2285 + 2286 + 2287 + 2288 + 2289 + 2290 + 2291 + 2292 + 2293 + 2294 + 2295 + 2296 + 2297 + 2298 + 2299 + 2300 + 2301 + 2302 + 2303 + 2304 + 2305 + 2306 + 2307 + 2308 + 2309 + 2310 + 2311 + 2312 + 2313 + 2314 + 2315 + 2316 + 2317 + 2318 + 2319 + 2320 + 2321 + 2322 + 2323 + 2324 + 2325 + 2326 + 2327 + 2328 + 2329 + 2330 + 2331 + 2332 + 2333 + 2334 + 2335 + 2336 + 2337 + 2338 + 2339 + 2340 + 2341 + 2342 + 2343 + 2344 + 2345 + 2346 + 2347 + 2348 + 2349 + 2350 + 2351 + 2352 + 2353 + 2354 + 2355 + 2356 + 2357 + 2358 + 2359 + 2360 + 2361 + 2362 + 2363 + 2364 + 2365 + 2366 + 2367 + 2368 + 2369 + 2370 + 2371 + 2372 + 2373 + 2374 + 2375 + 2376 + 2377 + 2378 + 2379 + 2380 + 2381 + 2382 + 2383 + 2384 + 2385 + 2386 + 2387 + 2388 + 2389 + 2390 + 2391 + 2392 + 2393 + 2394 + 2395 + 2396 + 2397 + 2398 + 2399 + 2400 + 2401 + 2402 + 2403 + 2404 + 2405 + 2406 + 2407 + 2408 + 2409 + 2410 + 2411 + 2412 + 2413 + 2414 + 2415 + 2416 + 2417 + 2418 + 2419 + 2420 + 2421 + 2422 + 2423 + 2424 + 2425 + 2426 + 2427 + 2428 + 2429 + 2430 + 2431 + 2432 + 2433 + 2434 + 2435 + 2436 + 2437 + 2438 + 2439 + 2440 + 2441 + 2442 + 2443 + 2444 + 2445 + 2446 + 2447 + 2448 + 2449 + 2450 + 2451 + 2452 + 2453 + 2454 + 2455 + 2456 + 2457 + 2458 + 2459 + 2460 + 2461 + 2462 + 2463 + 2464 + 2465 + 2466 + 2467 + 2468 + 2469 + 2470 + 2471 + 2472 + 2473 + 2474 + 2475 + 2476 + 2477 + 2478 + 2479 + 2480 + 2481 + 2482 + 2483 + 2484 + 2485 + 2486 + 2487 + 2488 + 2489 + 2490 + 2491 + 2492 + 2493 + 2494 + 2495 + 2496 + 2497 + 2498 + 2499 + 2500 + 2501 + 2502 + 2503 + 2504 + 2505 + 2506 + 2507 + 2508 + 2509 + 2510 + 2511 + 2512 + 2513 + 2514 + 2515 + 2516 + 2517 + 2518 + 2519 + 2520 + 2521 + 2522 + 2523 + 2524 + 2525 + 2526 + 2527 + 2528 + 2529 + 2530 + 2531 + 2532 + 2533 + 2534 + 2535 + 2536 + 2537 + 2538 + 2539 + 2540 + 2541 + 2542 + 2543 + 2544 + 2545 + 2546 + 2547 + 2548 + 2549 + 2550 + 2551 + 2552 + 2553 + 2554 + 2555 + 2556 + 2557 + 2558 + 2559 + 2560 + 2561 + 2562 + 2563 + 2564 + 2565 + 2566 + 2567 + 2568 + 2569 + 2570 + 2571 + 2572 + 2573 + 2574 + 2575 + 2576 + 2577 + 2578 + 2579 + 2580 + 2581 + 2582 + 2583 + 2584 + 2585 + 2586 + 2587 + 2588 + 2589 + 2590 + 2591 + 2592 + 2593 + 2594 + 2595 + 2596 + 2597 + 2598 + 2599 + 2600 + 2601 + 2602 + 2603 + 2604 + 2605 + 2606 + 2607 + 2608 + 2609 + 2610 + 2611 + 2612 + 2613 + 2614 + 2615 + 2616 + 2617 + 2618 + 2619 + 2620 + 2621 + 2622 + 2623 + 2624 + 2625 + 2626 + 2627 + 2628 + 2629 + 2630 + 2631 + 2632 + 2633 + 2634 + 2635 + 2636 + 2637 + 2638 + 2639 + 2640 + 2641 + 2642 + 2643 + 2644 + 2645 + 2646 + 2647 + 2648 + 2649 + 2650 + 2651 + 2652 + 2653 + 2654 + 2655 + 2656 + 2657 + 2658 + 2659 + 2660 + 2661 + 2662 + 2663 + 2664 + 2665 + 2666 + 2667 + 2668 + 2669 + 2670 + 2671 + 2672 + 2673 + 2674 + 2675 + 2676 + 2677 + 2678 + 2679 + 2680 + 2681 + 2682 + 2683 + 2684 + 2685 + 2686 + 2687 + 2688 + 2689 + 2690 + 2691 + 2692 + 2693 + 2694 + 2695 + 2696 + 2697 + 2698 + 2699 + 2700 + 2701 + 2702 + 2703 + 2704 + 2705 + 2706 + 2707 + 2708 + 2709 + 2710 + 2711 + 2712 + 2713 + 2714 + 2715 + 2716 + 2717 + 2718 + 2719 + 2720 + 2721 + 2722 + 2723 + 2724 + 2725 + 2726 + 2727 + 2728 + 2729 + 2730 + 2731 + 2732 + 2733 + 2734 + 2735 + 2736 + 2737 + 2738 + 2739 + 2740 + 2741 + 2742 + 2743 + 2744 + 2745 + 2746 + 2747 + 2748 + 2749 + 2750 + 2751 + 2752 + 2753 + 2754 + 2755 + 2756 + 2757 + 2758 + 2759 + 2760 + 2761 + 2762 + 2763 + 2764 + 2765 + 2766 + 2767 + 2768 + 2769 + 2770 + 2771 + 2772 + 2773 + 2774 + 2775 + 2776 + 2777 + 2778 + 2779 + 2780 + 2781 + 2782 + 2783 + 2784 + 2785 + 2786 + 2787 + 2788 + 2789 + 2790 + 2791 + 2792 + 2793 + 2794 + 2795 + 2796 + 2797 + 2798 + 2799 + 2800 + 2801 + 2802 + 2803 + 2804 + 2805 + 2806 + 2807 + 2808 + 2809 + 2810 + 2811 + 2812 + 2813 + 2814 + 2815 + 2816 + 2817 + 2818 + 2819 + 2820 + 2821 + 2822 + 2823 + 2824 + 2825 + 2826 + 2827 + 2828 + 2829 + 2830 + 2831 + 2832 + 2833 + 2834 + 2835 + 2836 + 2837 + 2838 + 2839 + 2840 + 2841 + 2842 + 2843 + 2844 + 2845 + 2846 + 2847 + 2848 + 2849 + 2850 + 2851 + 2852 + 2853 + 2854 + 2855 + 2856 + 2857 + 2858 + 2859 + 2860 + 2861 + 2862 + 2863 + 2864 + 2865 + 2866 + 2867 + 2868 + 2869 + 2870 + 2871 + 2872 + 2873 + 2874 + 2875 + 2876 + 2877 + 2878 + 2879 + 2880 + 2881 + 2882 + 2883 + 2884 + 2885 + 2886 + 2887 + 2888 + 2889 + 2890 + 2891 + 2892 + 2893 + 2894 + 2895 + 2896 + 2897 + 2898 + 2899 + 2900 + 2901 + 2902 + 2903 + 2904 + 2905 + 2906 + 2907 + 2908 + 2909 + 2910 + 2911 + 2912 + 2913 + 2914 + 2915 + 2916 + 2917 + 2918 + 2919 + 2920 + 2921 + 2922 + 2923 + 2924 + 2925 + 2926 + 2927 + 2928 + 2929 + 2930 + 2931 + 2932 + 2933 + 2934 + 2935 + 2936 + 2937 + 2938 + 2939 + 2940 + 2941 + 2942 + 2943 + 2944 + 2945 + 2946 + 2947 + 2948 + 2949 + 2950 + 2951 + 2952 + 2953 + 2954 + 2955 + 2956 + 2957 + 2958 + 2959 + 2960 + 2961 + 2962 + 2963 + 2964 + 2965 + 2966 + 2967 + 2968 + 2969 + 2970 + 2971 + 2972 + 2973 + 2974 + 2975 + 2976 + 2977 + 2978 + 2979 + 2980 + 2981 + 2982 + 2983 + 2984 + 2985 + 2986 + 2987 + 2988 + 2989 + 2990 + 2991 + 2992 + 2993 + 2994 + 2995 + 2996 + 2997 + 2998 + 2999 + 3000 + 3001 + 3002 + 3003 + 3004 + 3005 + 3006 + 3007 + 3008 + 3009 + 3010 + 3011 + 3012 + 3013 + 3014 + 3015 + 3016 + 3017 + 3018 + 3019 + 3020 + 3021 + 3022 + 3023 + 3024 + 3025 + 3026 + 3027 + 3028 + 3029 + 3030 + 3031 + 3032 + 3033 + 3034 + 3035 + 3036 + 3037 + 3038 + 3039 + 3040 + 3041 + 3042 + 3043 + 3044 + 3045 + 3046 + 3047 + 3048 + 3049 + 3050 + 3051 + 3052 + 3053 + 3054 + 3055 + 3056 + 3057 + 3058 + 3059 + 3060 + 3061 + 3062 + 3063 + 3064 + 3065 + 3066 + 3067 + 3068 + 3069 + 3070 + 3071 + 3072 + 3073 + 3074 + 3075 + 3076 + 3077 + 3078 + 3079 + 3080 + 3081 + 3082 + 3083 + 3084 + 3085 + 3086 + 3087 + 3088 + 3089 + 3090 + 3091 + 3092 + 3093 + 3094 + 3095 + 3096 + 3097 + 3098 + 3099 + 3100 + 3101 + 3102 + 3103 + 3104 + 3105 + 3106 + 3107 + 3108 + 3109 + 3110 + 3111 + 3112 + 3113 + 3114 + 3115 + 3116 + 3117 + 3118 + 3119 + 3120 + 3121 + 3122 + 3123 + 3124 + 3125 + 3126 + 3127 + 3128 + 3129 + 3130 + 3131 + 3132 + 3133 + 3134 + 3135 + 3136 + 3137 + 3138 + 3139 + 3140 + 3141 + 3142 + 3143 + 3144 + 3145 + 3146 + 3147 + 3148 + 3149 + 3150 + 3151 + 3152 + 3153 + 3154 + 3155 + 3156 + 3157 + 3158 + 3159 + 3160 + 3161 + 3162 + 3163 + 3164 + 3165 + 3166 + 3167 + 3168 + 3169 + 3170 + 3171 + 3172 + 3173 + 3174 + 3175 + 3176 + 3177 + 3178 + 3179 + 3180 + 3181 + 3182 + 3183 + 3184 + 3185 + 3186 + 3187 + 3188 + 3189 + 3190 + 3191 + 3192 + 3193 + 3194 + 3195 + 3196 + 3197 + 3198 + 3199 + 3200 + 3201 + 3202 + 3203 + 3204 + 3205 + 3206 + 3207 + 3208 + 3209 + 3210 + 3211 + 3212 + 3213 + 3214 + 3215 + 3216 + 3217 + 3218 + 3219 + 3220 + 3221 + 3222 + 3223 + 3224 + 3225 + 3226 + 3227 + 3228 + 3229 + 3230 + 3231 + 3232 + 3233 + 3234 + 3235 + 3236 + 3237 + 3238 + 3239 + 3240 + 3241 + 3242 + 3243 + 3244 + 3245 + 3246 + 3247 + 3248 + 3249 + 3250 + 3251 + 3252 + 3253 + 3254 + 3255 + 3256 + 3257 + 3258 + 3259 + 3260 + 3261 + 3262 + 3263 + 3264 + 3265 + 3266 + 3267 + 3268 + 3269 + 3270 + 3271 + 3272 + 3273 + 3274 + 3275 + 3276 + 3277 + 3278 + 3279 + 3280 + 3281 + 3282 + 3283 + 3284 + 3285 + 3286 + 3287 + 3288 + 3289 + 3290 + 3291 + 3292 + 3293 + 3294 + 3295 + 3296 + 3297 + 3298 + 3299 + 3300 + 3301 + 3302 + 3303 + 3304 + 3305 + 3306 + 3307 + 3308 + 3309 + 3310 + 3311 + 3312 + 3313 + 3314 + 3315 + 3316 + 3317 + 3318 + 3319 + 3320 + 3321 + 3322 + 3323 + 3324 + 3325 + 3326 + 3327 + 3328 + 3329 + 3330 + 3331 + 3332 + 3333 + 3334 + 3335 + 3336 + 3337 + 3338 + 3339 + 3340 + 3341 + 3342 + 3343 + 3344 + 3345 + 3346 + 3347 + 3348 + 3349 + 3350 + 3351 + 3352 + 3353 + 3354 + 3355 + 3356 + 3357 + 3358 + 3359 + 3360 + 3361 + 3362 + 3363 + 3364 + 3365 + 3366 + 3367 + 3368 + 3369 + 3370 + 3371 + 3372 + 3373 + 3374 + 3375 + 3376 + 3377 + 3378 + 3379 + 3380 + 3381 + 3382 + 3383 + 3384 + 3385 + 3386 + 3387 + 3388 + 3389 + 3390 + 3391 + 3392 + 3393 + 3394 + 3395 + 3396 + 3397 + 3398 + 3399 + 3400 + 3401 + 3402 + 3403 + 3404 + 3405 + 3406 + 3407 + 3408 + 3409 + 3410 + 3411 + 3412 + 3413 + 3414 + 3415 + 3416 + 3417 + 3418 + 3419 + 3420 + 3421 + 3422 + 3423 + 3424 + 3425 + 3426 + 3427 + 3428 + 3429 + 3430 + 3431 + 3432 + 3433 + 3434 + 3435 + 3436 + 3437 + 3438 + 3439 + 3440 + 3441 + 3442 + 3443 + 3444 + 3445 + 3446 + 3447 + 3448 + 3449 + 3450 + 3451 + 3452 + 3453 + 3454 + 3455 + 3456 + 3457 + 3458 + 3459 + 3460 + 3461 + 3462 + 3463 + 3464 + 3465 + 3466 + 3467 + 3468 + 3469 + 3470 + 3471 + 3472 + 3473 + 3474 + 3475 + 3476 + 3477 + 3478 + 3479 + 3480 + 3481 + 3482 + 3483 + 3484 + 3485 + 3486 + 3487 + 3488 + 3489 + 3490 + 3491 + 3492 + 3493 + 3494 + 3495 + 3496 + 3497 + 3498 + 3499 + 3500 + 3501 + 3502 + 3503 + 3504 + 3505 + 3506 + 3507 + 3508 + 3509 + 3510 + 3511 + 3512 + 3513 + 3514 + 3515 + 3516 + 3517 + 3518 + 3519 + 3520 + 3521 + 3522 + 3523 + 3524 + 3525 + 3526 + 3527 + 3528 + 3529 + 3530 + 3531 + 3532 + 3533 + 3534 + 3535 + 3536 + 3537 + 3538 + 3539 + 3540 + 3541 + 3542 + 3543 + 3544 + 3545 + 3546 + 3547 + 3548 + 3549 + 3550 + 3551 + 3552 + 3553 + 3554 + 3555 + 3556 + 3557 + 3558 + 3559 + 3560 + 3561 + 3562 + 3563 + 3564 + 3565 + 3566 + 3567 + 3568 + 3569 + 3570 + 3571 + 3572 + 3573 + 3574 + 3575 + 3576 + 3577 + 3578 + 3579 + 3580 + 3581 + 3582 + 3583 + 3584 + 3585 + 3586 + 3587 + 3588 + 3589 + 3590 + 3591 + 3592 + 3593 + 3594 + 3595 + 3596 + 3597 + 3598 + 3599 + 3600 + 3601 + 3602 + 3603 + 3604 + 3605 + 3606 + 3607 + 3608 + 3609 + 3610 + 3611 + 3612 + 3613 + 3614 + 3615 + 3616 + 3617 + 3618 + 3619 + 3620 + 3621 + 3622 + 3623 + 3624 + 3625 + 3626 + 3627 + 3628 + 3629 + 3630 + 3631 + 3632 + 3633 + 3634 + 3635 + 3636 + 3637 + 3638 + 3639 + 3640 + 3641 + 3642 + 3643 + 3644 + 3645 + 3646 + 3647 + 3648 + 3649 + 3650 + 3651 + 3652 + 3653 + 3654 + 3655 + 3656 + 3657 + 3658 + 3659 + 3660 + 3661 + 3662 + 3663 + 3664 + 3665 + 3666 + 3667 + 3668 + 3669 + 3670 + 3671 + 3672 + 3673 + 3674 + 3675 + 3676 + 3677 + 3678 + 3679 + 3680 + 3681 + 3682 + 3683 + 3684 + 3685 + 3686 + 3687 + 3688 + 3689 + 3690 + 3691 + 3692 + 3693 + 3694 + 3695 + 3696 + 3697 + 3698 + 3699 + 3700 + 3701 + 3702 + 3703 + 3704 + 3705 + 3706 + 3707 + 3708 + 3709 + 3710 + 3711 + 3712 + 3713 + 3714 + 3715 + 3716 + 3717 + 3718 + 3719 + 3720 + 3721 + 3722 + 3723 + 3724 + 3725 + 3726 + 3727 + 3728 + 3729 + 3730 + 3731 + 3732 + 3733 + 3734 + 3735 + 3736 + 3737 + 3738 + 3739 + 3740 + 3741 + 3742 + 3743 + 3744 + 3745 + 3746 + 3747 + 3748 + 3749 + 3750 + 3751 + 3752 + 3753 + 3754 + 3755 + 3756 + 3757 + 3758 + 3759 + 3760 + 3761 + 3762 + 3763 + 3764 + 3765 + 3766 + 3767 + 3768 + 3769 + 3770 + 3771 + 3772 + 3773 + 3774 + 3775 + 3776 + 3777 + 3778 + 3779 + 3780 + 3781 + 3782 + 3783 + 3784 + 3785 + 3786 + 3787 + 3788 + 3789 + 3790 + 3791 + 3792 + 3793 + 3794 + 3795 + 3796 + 3797 + 3798 + 3799 + 3800 + 3801 + 3802 + 3803 + 3804 + 3805 + 3806 + 3807 + 3808 + 3809 + 3810 + 3811 + 3812 + 3813 + 3814 + 3815 + 3816 + 3817 + 3818 + 3819 + 3820 + 3821 + 3822 + 3823 + 3824 + 3825 + 3826 + 3827 + 3828 + 3829 + 3830 + 3831 + 3832 + 3833 + 3834 + 3835 + 3836 + 3837 + 3838 + 3839 + 3840 + 3841 + 3842 + 3843 + 3844 + 3845 + 3846 + 3847 + 3848 + 3849 + 3850 + 3851 + 3852 + 3853 + 3854 + 3855 + 3856 + 3857 + 3858 + 3859 + 3860 + 3861 + 3862 + 3863 + 3864 + 3865 + 3866 + 3867 + 3868 + 3869 + 3870 + 3871 + 3872 + 3873 + 3874 + 3875 + 3876 + 3877 + 3878 + 3879 + 3880 + 3881 + 3882 + 3883 + 3884 + 3885 + 3886 + 3887 + 3888 + 3889 + 3890 + 3891 + 3892 + 3893 + 3894 + 3895 + 3896 + 3897 + 3898 + 3899 + 3900 + 3901 + 3902 + 3903 + 3904 + 3905 + 3906 + 3907 + 3908 + 3909 + 3910 + 3911 + 3912 + 3913 + 3914 + 3915 + 3916 + 3917 + 3918 + 3919 + 3920 + 3921 + 3922 + 3923 + 3924 + 3925 + 3926 + 3927 + 3928 + 3929 + 3930 + 3931 + 3932 + 3933 + 3934 + 3935 + 3936 + 3937 + 3938 + 3939 + 3940 + 3941 + 3942 + 3943 + 3944 + 3945 + 3946 + 3947 + 3948 + 3949 + 3950 + 3951 + 3952 + 3953 + 3954 + 3955 + 3956 + 3957 + 3958 + 3959 + 3960 + 3961 + 3962 + 3963 + 3964 + 3965 + 3966 + 3967 + 3968 + 3969 + 3970 + 3971 + 3972 + 3973 + 3974 + 3975 + 3976 + 3977 + 3978 + 3979 + 3980 + 3981 + 3982 + 3983 + 3984 + 3985 + 3986 + 3987 + 3988 + 3989 + 3990 + 3991 + 3992 + 3993 + 3994 + 3995 + 3996 + 3997 + 3998 + 3999 + 4000 + 4001 + 4002 + 4003 + 4004 + 4005 + 4006 + 4007 + 4008 + 4009 + 4010 + 4011 + 4012 + 4013 + 4014 + 4015 + 4016 + 4017 + 4018 + 4019 + 4020 + 4021 + 4022 + 4023 + 4024 + 4025 + 4026 + 4027 + 4028 + 4029 + 4030 + 4031 + 4032 + 4033 + 4034 + 4035 + 4036 + 4037 + 4038 + 4039 + 4040 + 4041 + 4042 + 4043 + 4044 + 4045 + 4046 + 4047 + 4048 + 4049 + 4050 + 4051 + 4052 + 4053 + 4054 + 4055 + 4056 + 4057 + 4058 + 4059 + 4060 + 4061 + 4062 + 4063 + 4064 + 4065 + 4066 + 4067 + 4068 + 4069 + 4070 + 4071 + 4072 + 4073 + 4074 + 4075 + 4076 + 4077 + 4078 + 4079 + 4080 + 4081 + 4082 + 4083 + 4084 + 4085 + 4086 + 4087 + 4088 + 4089 + 4090 + 4091 + 4092 + 4093 + 4094 + 4095 + 4096 + 4097 + 4098 + 4099 + 4100 + 4101 + 4102 + 4103 + 4104 + 4105 + 4106 + 4107 + 4108 + 4109 + 4110 + 4111 + 4112 + 4113 + 4114 + 4115 + 4116 + 4117 + 4118 + 4119 + 4120 + 4121 + 4122 + 4123 + 4124 + 4125 + 4126 + 4127 + 4128 + 4129 + 4130 + 4131 + 4132 + 4133 + 4134 + 4135 + 4136 + 4137 + 4138 + 4139 + 4140 + 4141 + 4142 + 4143 + 4144 + 4145 + 4146 + 4147 + 4148 + 4149 + 4150 + 4151 + 4152 + 4153 + 4154 + 4155 + 4156 + 4157 + 4158 + 4159 + 4160 + 4161 + 4162 + 4163 + 4164 + 4165 + 4166 + 4167 + 4168 + 4169 + 4170 + 4171 + 4172 + 4173 + 4174 + 4175 + 4176 + 4177 + 4178 + 4179 + 4180 + 4181 + 4182 + 4183 + 4184 + 4185 + 4186 + 4187 + 4188 + 4189 + 4190 + 4191 + 4192 + 4193 + 4194 + 4195 + 4196 + 4197 + 4198 + 4199 + 4200 + 4201 + 4202 + 4203 + 4204 + 4205 + 4206 + 4207 + 4208 + 4209 + 4210 + 4211 + 4212 + 4213 + 4214 + 4215 + 4216 + 4217 + 4218 + 4219 + 4220 + 4221 + 4222 + 4223 + 4224 + 4225 + 4226 + 4227 + 4228 + 4229 + 4230 + 4231 + 4232 + 4233 + 4234 + 4235 + 4236 + 4237 + 4238 + 4239 + 4240 + 4241 + 4242 + 4243 + 4244 + 4245 + 4246 + 4247 + 4248 + 4249 + 4250 + 4251 + 4252 + 4253 + 4254 + 4255 + 4256 + 4257 + 4258 + 4259 + 4260 + 4261 + 4262 + 4263 + 4264 + 4265 + 4266 + 4267 + 4268 + 4269 + 4270 + 4271 + 4272 + 4273 + 4274 + 4275 + 4276 + 4277 + 4278 + 4279 + 4280 + 4281 + 4282 + 4283 + 4284 + 4285 + 4286 + 4287 + 4288 + 4289 + 4290 + 4291 + 4292 + 4293 + 4294 + 4295 + 4296 + 4297 + 4298 + 4299 + 4300 + 4301 + 4302 + 4303 + 4304 + 4305 + 4306 + 4307 + 4308 + 4309 + 4310 + 4311 + 4312 + 4313 + 4314 + 4315 + 4316 + 4317 + 4318 + 4319 + 4320 + 4321 + 4322 + 4323 + 4324 + 4325 + 4326 + 4327 + 4328 + 4329 + 4330 + 4331 + 4332 + 4333 + 4334 + 4335 + 4336 + 4337 + 4338 + 4339 + 4340 + 4341 + 4342 + 4343 + 4344 + 4345 + 4346 + 4347 + 4348 + 4349 + 4350 + 4351 + 4352 + 4353 + 4354 + 4355 + 4356 + 4357 + 4358 + 4359 + 4360 + 4361 + 4362 + 4363 + 4364 + 4365 + 4366 + 4367 + 4368 + 4369 + 4370 + 4371 + 4372 + 4373 + 4374 + 4375 + 4376 + 4377 + 4378 + 4379 + 4380 + 4381 + 4382 + 4383 + 4384 + 4385 + 4386 + 4387 + 4388 + 4389 + 4390 + 4391 + 4392 + 4393 + 4394 + 4395 + 4396 + 4397 + 4398 + 4399 + 4400 + 4401 + 4402 + 4403 + 4404 + 4405 + 4406 + 4407 + 4408 + 4409 + 4410 + 4411 + 4412 + 4413 + 4414 + 4415 + 4416 + 4417 + 4418 + 4419 + 4420 + 4421 + 4422 + 4423 + 4424 + 4425 + 4426 + 4427 + 4428 + 4429 + 4430 + 4431 + 4432 + 4433 + 4434 + 4435 + 4436 + 4437 + 4438 + 4439 + 4440 + 4441 + 4442 + 4443 + 4444 + 4445 + 4446 + 4447 + 4448 + 4449 + 4450 + 4451 + 4452 + 4453 + 4454 + 4455 + 4456 + 4457 + 4458 + 4459 + 4460 + 4461 + 4462 + 4463 + 4464 + 4465 + 4466 + 4467 + 4468 + 4469 + 4470 + 4471 + 4472 + 4473 + 4474 + 4475 + 4476 + 4477 + 4478 + 4479 + 4480 + 4481 + 4482 + 4483 + 4484 + 4485 + 4486 + 4487 + 4488 + 4489 + 4490 + 4491 + 4492 + 4493 + 4494 + 4495 + 4496 + 4497 + 4498 + 4499 + 4500 + 4501 + 4502 + 4503 + 4504 + 4505 + 4506 + 4507 + 4508 + 4509 + 4510 + 4511 + 4512 + 4513 + 4514 + 4515 + 4516 + 4517 + 4518 + 4519 + 4520 + 4521 + 4522 + 4523 + 4524 + 4525 + 4526 + 4527 + 4528 + 4529 + 4530 + 4531 + 4532 + 4533 + 4534 + 4535 + 4536 + 4537 + 4538 + 4539 + 4540 + 4541 + 4542 + 4543 + 4544 + 4545 + 4546 + 4547 + 4548 + 4549 + 4550 + 4551 + 4552 + 4553 + 4554 + 4555 + 4556 + 4557 + 4558 + 4559 + 4560 + 4561 + 4562 + 4563 + 4564 + 4565 + 4566 + 4567 + 4568 + 4569 + 4570 + 4571 + 4572 + 4573 + 4574 + 4575 + 4576 + 4577 + 4578 + 4579 + 4580 + 4581 + 4582 + 4583 + 4584 + 4585 + 4586 + 4587 + 4588 + 4589 + 4590 + 4591 + 4592 + 4593 + 4594 + 4595 + 4596 + 4597 + 4598 + 4599 + 4600 + 4601 + 4602 + 4603 + 4604 + 4605 + 4606 + 4607 + 4608 + 4609 + 4610 + 4611 + 4612 + 4613 + 4614 + 4615 + 4616 + 4617 + 4618 + 4619 + 4620 + 4621 + 4622 + 4623 + 4624 + 4625 + 4626 + 4627 + 4628 + 4629 + 4630 + 4631 + 4632 + 4633 + 4634 + 4635 + 4636 + 4637 + 4638 + 4639 + 4640 + 4641 + 4642 + 4643 + 4644 + 4645 + 4646 + 4647 + 4648 + 4649 + 4650 + 4651 + 4652 + 4653 + 4654 + 4655 + 4656 + 4657 + 4658 + 4659 + 4660 + 4661 + 4662 + 4663 + 4664 + 4665 + 4666 + 4667 + 4668 + 4669 + 4670 + 4671 + 4672 + 4673 + 4674 + 4675 + 4676 + 4677 + 4678 + 4679 + 4680 + 4681 + 4682 + 4683 + 4684 + 4685 + 4686 + 4687 + 4688 + 4689 + 4690 + 4691 + 4692 + 4693 + 4694 + 4695 + 4696 + 4697 + 4698 + 4699 + 4700 + 4701 + 4702 + 4703 + 4704 + 4705 + 4706 + 4707 + 4708 + 4709 + 4710 + 4711 + 4712 + 4713 + 4714 + 4715 + 4716 + 4717 + 4718 + 4719 + 4720 + 4721 + 4722 + 4723 + 4724 + 4725 + 4726 + 4727 + 4728 + 4729 + 4730 + 4731 + 4732 + 4733 + 4734 + 4735 + 4736 + 4737 + 4738 + 4739 + 4740 + 4741 + 4742 + 4743 + 4744 + 4745 + 4746 + 4747 + 4748 + 4749 + 4750 + 4751 + 4752 + 4753 + 4754 + 4755 + 4756 + 4757 + 4758 + 4759 + 4760 + 4761 + 4762 + 4763 + 4764 + 4765 + 4766 + 4767 + 4768 + 4769 + 4770 + 4771 + 4772 + 4773 + 4774 + 4775 + 4776 + 4777 + 4778 + 4779 + 4780 + 4781 + 4782 + 4783 + 4784 + 4785 + 4786 + 4787 + 4788 + 4789 + 4790 + 4791 + 4792 + 4793 + 4794 + 4795 + 4796 + 4797 + 4798 + 4799 + 4800 + 4801 + 4802 + 4803 + 4804 + 4805 + 4806 + 4807 + 4808 + 4809 + 4810 + 4811 + 4812 + 4813 + 4814 + 4815 + 4816 + 4817 + 4818 + 4819 + 4820 + 4821 + 4822 + 4823 + 4824 + 4825 + 4826 + 4827 + 4828 + 4829 + 4830 + 4831 + 4832 + 4833 + 4834 + 4835 + 4836 + 4837 + 4838 + 4839 + 4840 + 4841 + 4842 + 4843 + 4844 + 4845 + 4846 + 4847 + 4848 + 4849 + 4850 + 4851 + 4852 + 4853 + 4854 + 4855 + 4856 + 4857 + 4858 + 4859 + 4860 + 4861 + 4862 + 4863 + 4864 + 4865 + 4866 + 4867 + 4868 + 4869 + 4870 + 4871 + 4872 + 4873 + 4874 + 4875 + 4876 + 4877 + 4878 + 4879 + 4880 + 4881 + 4882 + 4883 + 4884 + 4885 + 4886 + 4887 + 4888 + 4889 + 4890 + 4891 + 4892 + 4893 + 4894 + 4895 + 4896 + 4897 + 4898 + 4899 + 4900 + 4901 + 4902 + 4903 + 4904 + 4905 + 4906 + 4907 + 4908 + 4909 + 4910 + 4911 + 4912 + 4913 + 4914 + 4915 + 4916 + 4917 + 4918 + 4919 + 4920 + 4921 + 4922 + 4923 + 4924 + 4925 + 4926 + 4927 + 4928 + 4929 + 4930 + 4931 + 4932 + 4933 + 4934 + 4935 + 4936 + 4937 + 4938 + 4939 + 4940 + 4941 + 4942 + 4943 + 4944 + 4945 + 4946 + 4947 + 4948 + 4949 + 4950 + 4951 + 4952 + 4953 + 4954 + 4955 + 4956 + 4957 + 4958 + 4959 + 4960 + 4961 + 4962 + 4963 + 4964 + 4965 + 4966 + 4967 + 4968 + 4969 + 4970 + 4971 + 4972 + 4973 + 4974 + 4975 + 4976 + 4977 + 4978 + 4979 + 4980 + 4981 + 4982 + 4983 + 4984 + 4985 + 4986 + 4987 + 4988 + 4989 + 4990 + 4991 + 4992 + 4993 + 4994 + 4995 + 4996 + 4997 + 4998 + 4999 + 5000 + 5001 + 5002 + 5003 + 5004 + 5005 + 5006 + 5007 + 5008 + 5009 + 5010 + 5011 + 5012 + 5013 + 5014 + 5015 + 5016 + 5017 + 5018 + 5019 + 5020 + 5021 + 5022 + 5023 + 5024 + 5025 + 5026 + 5027 + 5028 + 5029 + 5030 + 5031 + 5032 + 5033 + 5034 + 5035 + 5036 + 5037 + 5038 + 5039 + 5040 + 5041 + 5042 + 5043 + 5044 + 5045 + 5046 + 5047 + 5048 + 5049 + 5050 + 5051 + 5052 + 5053 + 5054 + 5055 + 5056 + 5057 + 5058 + 5059 + 5060 + 5061 + 5062 + 5063 + 5064 + 5065 + 5066 + 5067 + 5068 + 5069 + 5070 + 5071 + 5072 + 5073 + 5074 + 5075 + 5076 + 5077 + 5078 + 5079 + 5080 + 5081 + 5082 + 5083 + 5084 + 5085 + 5086 + 5087 + 5088 + 5089 + 5090 + 5091 + 5092 + 5093 + 5094 + 5095 + 5096 + 5097 + 5098 + 5099 + 5100 + 5101 + 5102 + 5103 + 5104 + 5105 + 5106 + 5107 + 5108 + 5109 + 5110 + 5111 + 5112 + 5113 + 5114 + 5115 + 5116 + 5117 + 5118 + 5119 + 5120 + 5121 + 5122 + 5123 + 5124 + 5125 + 5126 + 5127 + 5128 + 5129 + 5130 + 5131 + 5132 + 5133 + 5134 + 5135 + 5136 + 5137 + 5138 + 5139 + 5140 + 5141 + 5142 + 5143 + 5144 + 5145 + 5146 + 5147 + 5148 + 5149 + 5150 + 5151 + 5152 + 5153 + 5154 + 5155 + 5156 + 5157 + 5158 + 5159 + 5160 + 5161 + 5162 + 5163 + 5164 + 5165 + 5166 + 5167 + 5168 + 5169 + 5170 + 5171 + 5172 + 5173 + 5174 + 5175 + 5176 + 5177 + 5178 + 5179 + 5180 + 5181 + 5182 + 5183 + 5184 + 5185 + 5186 + 5187 + 5188 + 5189 + 5190 + 5191 + 5192 + 5193 + 5194 + 5195 + 5196 + 5197 + 5198 + 5199 + 5200 + 5201 + 5202 + 5203 + 5204 + 5205 + 5206 + 5207 + 5208 + 5209 + 5210 + 5211 + 5212 + 5213 + 5214 + 5215 + 5216 + 5217 + 5218 + 5219 + 5220 + 5221 + 5222 + 5223 + 5224 + 5225 + 5226 + 5227 + 5228 + 5229 + 5230 + 5231 + 5232 + 5233 + 5234 + 5235 + 5236 + 5237 + 5238 + 5239 + 5240 + 5241 + 5242 + 5243 + 5244 + 5245 + 5246 + 5247 + 5248 + 5249 + 5250 + 5251 + 5252 + 5253 + 5254 + 5255 + 5256 + 5257 + 5258 + 5259 + 5260 + 5261 + 5262 + 5263 + 5264 + 5265 + 5266 + 5267 + 5268 + 5269 + 5270 + 5271 + 5272 + 5273 + 5274 + 5275 + 5276 + 5277 + 5278 + 5279 + 5280 + 5281 + 5282 + 5283 + 5284 + 5285 + 5286 + 5287 + 5288 + 5289 + 5290 + 5291 + 5292 + 5293 + 5294 + 5295 + 5296 + 5297 + 5298 + 5299 + 5300 + 5301 + 5302 + 5303 + 5304 + 5305 + 5306 + 5307 + 5308 + 5309 + 5310 + 5311 + 5312 + 5313 + 5314 + 5315 + 5316 + 5317 + 5318 + 5319 + 5320 + 5321 + 5322 + 5323 + 5324 + 5325 + 5326 + 5327 + 5328 + 5329 + 5330 + 5331 + 5332 + 5333 + 5334 + 5335 + 5336 + 5337 + 5338 + 5339 + 5340 + 5341 + 5342 + 5343 + 5344 + 5345 + 5346 + 5347 + 5348 + 5349 + 5350 + 5351 + 5352 + 5353 + 5354 + 5355 + 5356 + 5357 + 5358 + 5359 + 5360 + 5361 + 5362 + 5363 + 5364 + 5365 + 5366 + 5367 + 5368 + 5369 + 5370 + 5371 + 5372 + 5373 + 5374 + 5375 + 5376 + 5377 + 5378 + 5379 + 5380 + 5381 + 5382 + 5383 + 5384 + 5385 + 5386 + 5387 + 5388 + 5389 + 5390 + 5391 + 5392 + 5393 + 5394 + 5395 + 5396 + 5397 + 5398 + 5399 + 5400 + 5401 + 5402 + 5403 + 5404 + 5405 + 5406 + 5407 + 5408 + 5409 + 5410 + 5411 + 5412 + 5413 + 5414 + 5415 + 5416 + 5417 + 5418 + 5419 + 5420 + 5421 + 5422 + 5423 + 5424 + 5425 + 5426 + 5427 + 5428 + 5429 + 5430 + 5431 + 5432 + 5433 + 5434 + 5435 + 5436 + 5437 + 5438 + 5439 + 5440 + 5441 + 5442 + 5443 + 5444 + 5445 + 5446 + 5447 + 5448 + 5449 + 5450 + 5451 + 5452 + 5453 + 5454 + 5455 + 5456 + 5457 + 5458 + 5459 + 5460 + 5461 + 5462 + 5463 + 5464 + 5465 + 5466 + 5467 + 5468 + 5469 + 5470 + 5471 + 5472 + 5473 + 5474 + 5475 + 5476 + 5477 + 5478 + 5479 + 5480 + 5481 + 5482 + 5483 + 5484 + 5485 + 5486 + 5487 + 5488 + 5489 + 5490 + 5491 + 5492 + 5493 + 5494 + 5495 + 5496 + 5497 + 5498 + 5499 + 5500 + 5501 + 5502 + 5503 + 5504 + 5505 + 5506 + 5507 + 5508 + 5509 + 5510 + 5511 + 5512 + 5513 + 5514 + 5515 + 5516 + 5517 + 5518 + 5519 + 5520 + 5521 + 5522 + 5523 + 5524 + 5525 + 5526 + 5527 + 5528 + 5529 + 5530 + 5531 + 5532 + 5533 + 5534 + 5535 + 5536 + 5537 + 5538 + 5539 + 5540 + 5541 + 5542 + 5543 + 5544 + 5545 + 5546 + 5547 + 5548 + 5549 + 5550 + 5551 + 5552 + 5553 + 5554 + 5555 + 5556 + 5557 + 5558 + 5559 + 5560 + 5561 + 5562 + 5563 + 5564 + 5565 + 5566 + 5567 + 5568 + 5569 + 5570 + 5571 + 5572 + 5573 + 5574 + 5575 + 5576 + 5577 + 5578 + 5579 + 5580 + 5581 + 5582 + 5583 + 5584 + 5585 + 5586 + 5587 + 5588 + 5589 + 5590 + 5591 + 5592 + 5593 + 5594 + 5595 + 5596 + 5597 + 5598 + 5599 + 5600 + 5601 + 5602 + 5603 + 5604 + 5605 + 5606 + 5607 + 5608 + 5609 + 5610 + 5611 + 5612 + 5613 + 5614 + 5615 + 5616 + 5617 + 5618 + 5619 + 5620 + 5621 + 5622 + 5623 + 5624 + 5625 + 5626 + 5627 + 5628 + 5629 + 5630 + 5631 + 5632 + 5633 + 5634 + 5635 + 5636 + 5637 + 5638 + 5639 + 5640 + 5641 + 5642 + 5643 + 5644 + 5645 + 5646 + 5647 + 5648 + 5649 + 5650 + 5651 + 5652 + 5653 + 5654 + 5655 + 5656 + 5657 + 5658 + 5659 + 5660 + 5661 + 5662 + 5663 + 5664 + 5665 + 5666 + 5667 + 5668 + 5669 + 5670 + 5671 + 5672 + 5673 + 5674 + 5675 + 5676 + 5677 + 5678 + 5679 + 5680 + 5681 + 5682 + 5683 + 5684 + 5685 + 5686 + 5687 + 5688 + 5689 + 5690 + 5691 + 5692 + 5693 + 5694 + 5695 + 5696 + 5697 + 5698 + 5699 + 5700 + 5701 + 5702 + 5703 + 5704 + 5705 + 5706 + 5707 + 5708 + 5709 + 5710 + 5711 + 5712 + 5713 + 5714 + 5715 + 5716 + 5717 + 5718 + 5719 + 5720 + 5721 + 5722 + 5723 + 5724 + 5725 + 5726 + 5727 + 5728 + 5729 + 5730 + 5731 + 5732 + 5733 + 5734 + 5735 + 5736 + 5737 + 5738 + 5739 + 5740 + 5741 + 5742 + 5743 + 5744 + 5745 + 5746 + 5747 + 5748 + 5749 + 5750 + 5751 + 5752 + 5753 + 5754 + 5755 + 5756 + 5757 + 5758 + 5759 + 5760 + 5761 + 5762 + 5763 + 5764 + 5765 + 5766 + 5767 + 5768 + 5769 + 5770 + 5771 + 5772 + 5773 + 5774 + 5775 + 5776 + 5777 + 5778 + 5779 + 5780 + 5781 + 5782 + 5783 + 5784 + 5785 + 5786 + 5787 + 5788 + 5789 + 5790 + 5791 + 5792 + 5793 + 5794 + 5795 + 5796 + 5797 + 5798 + 5799 + 5800 + 5801 + 5802 + 5803 + 5804 + 5805 + 5806 + 5807 + 5808 + 5809 + 5810 + 5811 + 5812 + 5813 + 5814 + 5815 + 5816 + 5817 + 5818 + 5819 + 5820 + 5821 + 5822 + 5823 + 5824 + 5825 + 5826 + 5827 + 5828 + 5829 + 5830 + 5831 + 5832 + 5833 + 5834 + 5835 + 5836 + 5837 + 5838 + 5839 + 5840 + 5841 + 5842 + 5843 + 5844 + 5845 + 5846 + 5847 + 5848 + 5849 + 5850 + 5851 + 5852 + 5853 + 5854 + 5855 + 5856 + 5857 + 5858 + 5859 + 5860 + 5861 + 5862 + 5863 + 5864 + 5865 + 5866 + 5867 + 5868 + 5869 + 5870 + 5871 + 5872 + 5873 + 5874 + 5875 + 5876 + 5877 + 5878 + 5879 + 5880 + 5881 + 5882 + 5883 + 5884 + 5885 + 5886 + 5887 + 5888 + 5889 + 5890 + 5891 + 5892 + 5893 + 5894 + 5895 + 5896 + 5897 + 5898 + 5899 + 5900 + 5901 + 5902 + 5903 + 5904 + 5905 + 5906 + 5907 + 5908 + 5909 + 5910 + 5911 + 5912 + 5913 + 5914 + 5915 + 5916 + 5917 + 5918 + 5919 + 5920 + 5921 + 5922 + 5923 + 5924 + 5925 + 5926 + 5927 + 5928 + 5929 + 5930 + 5931 + 5932 + 5933 + 5934 + 5935 + 5936 + 5937 + 5938 + 5939 + 5940 + 5941 + 5942 + 5943 + 5944 + 5945 + 5946 + 5947 + 5948 + 5949 + 5950 + 5951 + 5952 + 5953 + 5954 + 5955 + 5956 + 5957 + 5958 + 5959 + 5960 + 5961 + 5962 + 5963 + 5964 + 5965 + 5966 + 5967 + 5968 + 5969 + 5970 + 5971 + 5972 + 5973 + 5974 + 5975 + 5976 + 5977 + 5978 + 5979 + 5980 + 5981 + 5982 + 5983 + End SubModelPartElements +End SubModelPart + + +Begin SubModelPart load + Begin SubModelPartTables + 1 + End SubModelPartTables + Begin SubModelPartNodes + 4 + 5 + 153 + 154 + 155 + 156 + End SubModelPartNodes + Begin SubModelPartConditions + 1 + 2 + 3 + 4 + 5 + End SubModelPartConditions +End SubModelPart + + +Begin SubModelPart json_output + Begin SubModelPartElements + 5842 +324 +5575 +324 +5547 +5547 +1487 +3641 +3641 +3181 +3181 +2910 +1902 +1902 +2613 +2613 +2449 +2449 +3151 +5073 +5073 +4743 +4743 +975 +975 +860 +4661 +4661 +958 +958 +4964 +3329 +3329 +2501 +2501 +4699 +4699 +3852 +4513 +4513 +983 +983 +1039 +1039 +2448 +4240 +4240 +4386 +4386 +4618 +4618 +5391 +5319 +5319 +5386 +5386 +749 +4822 +4822 +5274 +5274 +934 +934 +1638 +3860 +3860 +2284 +2284 +3039 +3039 +2283 +908 +908 +2352 +2352 +4856 +4856 +2022 +4729 +4729 +1950 +1950 +3559 +3388 +3388 +4451 +4451 +3632 +3632 +1729 +4435 +4435 +3483 +3483 +4397 +4397 +3046 +5489 +5489 +5450 +5450 +1009 +1419 +1009 +2958 + End SubModelPartElements +End SubModelPart + + +Begin SubModelPart base_fixed + Begin SubModelPartTables + End SubModelPartTables + Begin SubModelPartNodes + 1 + 2 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + 13 + 14 + 15 + 16 + 17 + 18 + 19 + 20 + 21 + 22 + 23 + 24 + 25 + 26 + 27 + 28 + 29 + 30 + 31 + 32 + 33 + 34 + 35 + 36 + 37 + 38 + 39 + 40 + 41 + 42 + 43 + 44 + 45 + 46 + 47 + 48 + 49 + 50 + 51 + 52 + 53 + 54 + End SubModelPartNodes +End SubModelPart + + +Begin SubModelPart side_rollers + Begin SubModelPartTables + End SubModelPartTables + Begin SubModelPartNodes + 1 + 2 + 3 + 4 + 55 + 56 + 57 + 58 + 59 + 60 + 61 + 62 + 63 + 64 + 65 + 66 + 67 + 68 + 69 + 70 + 71 + 72 + 73 + 74 + 75 + 76 + 77 + 78 + 79 + 80 + 81 + 82 + 83 + 84 + 85 + 86 + 87 + 88 + 89 + 90 + 91 + 92 + 93 + 94 + 95 + 96 + 97 + 98 + 99 + 100 + 101 + 102 + 103 + 104 + 105 + 106 + 107 + 108 + 109 + 110 + 111 + 112 + 113 + 114 + 115 + 116 + 117 + 118 + 119 + 120 + 121 + 122 + 123 + 124 + 125 + 126 + 127 + 128 + 129 + 130 + 131 + 132 + 133 + 134 + 135 + 136 + 137 + 138 + 139 + 140 + 141 + 142 + 143 + 144 + 145 + 146 + 147 + 148 + 149 + 150 + 151 + 152 + End SubModelPartNodes +End SubModelPart + + +Begin SubModelPart zero_water_pressure + Begin SubModelPartTables + End SubModelPartTables + Begin SubModelPartNodes + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + 13 + 14 + 15 + 16 + 17 + 18 + 19 + 20 + 21 + 22 + 23 + 24 + 25 + 26 + 27 + 28 + 29 + 30 + 31 + 32 + 33 + 34 + 35 + 36 + 37 + 38 + 39 + 40 + 41 + 42 + 43 + 44 + 45 + 46 + 47 + 48 + 49 + 50 + 51 + 52 + 53 + 54 + 55 + 56 + 57 + 58 + 59 + 60 + 61 + 62 + 63 + 64 + 65 + 66 + 67 + 68 + 69 + 70 + 71 + 72 + 73 + 74 + 75 + 76 + 77 + 78 + 79 + 80 + 81 + 82 + 83 + 84 + 85 + 86 + 87 + 88 + 89 + 90 + 91 + 92 + 93 + 94 + 95 + 96 + 97 + 98 + 99 + 100 + 101 + 102 + 103 + 104 + 105 + 106 + 107 + 108 + 109 + 110 + 111 + 112 + 113 + 114 + 115 + 116 + 117 + 118 + 119 + 120 + 121 + 122 + 123 + 124 + 125 + 126 + 127 + 128 + 129 + 130 + 131 + 132 + 133 + 134 + 135 + 136 + 137 + 138 + 139 + 140 + 141 + 142 + 143 + 144 + 145 + 146 + 147 + 148 + 149 + 150 + 151 + 152 + 153 + 154 + 155 + 156 + 157 + 158 + 159 + 160 + 161 + 162 + 163 + 164 + 165 + 166 + 167 + 168 + 169 + 170 + 171 + 172 + 173 + 174 + 175 + 176 + 177 + 178 + 179 + 180 + 181 + 182 + 183 + 184 + 185 + 186 + 187 + 188 + 189 + 190 + 191 + 192 + 193 + 194 + 195 + 196 + 197 + 198 + 199 + 200 + 201 + 202 + 203 + 204 + 205 + 206 + 207 + 208 + 209 + 210 + 211 + 212 + 213 + 214 + 215 + 216 + 217 + 218 + 219 + 220 + 221 + 222 + 223 + 224 + 225 + 226 + 227 + 228 + 229 + 230 + 231 + 232 + 233 + 234 + 235 + 236 + 237 + 238 + 239 + 240 + 241 + 242 + 243 + 244 + 245 + 246 + 247 + 248 + 249 + 250 + 251 + 252 + 253 + 254 + 255 + 256 + 257 + 258 + 259 + 260 + 261 + 262 + 263 + 264 + 265 + 266 + 267 + 268 + 269 + 270 + 271 + 272 + 273 + 274 + 275 + 276 + 277 + 278 + 279 + 280 + 281 + 282 + 283 + 284 + 285 + 286 + 287 + 288 + 289 + 290 + 291 + 292 + 293 + 294 + 295 + 296 + 297 + 298 + 299 + 300 + 301 + 302 + 303 + 304 + 305 + 306 + 307 + 308 + 309 + 310 + 311 + 312 + 313 + 314 + 315 + 316 + 317 + 318 + 319 + 320 + 321 + 322 + 323 + 324 + 325 + 326 + 327 + 328 + 329 + 330 + 331 + 332 + 333 + 334 + 335 + 336 + 337 + 338 + 339 + 340 + 341 + 342 + 343 + 344 + 345 + 346 + 347 + 348 + 349 + 350 + 351 + 352 + 353 + 354 + 355 + 356 + 357 + 358 + 359 + 360 + 361 + 362 + 363 + 364 + 365 + 366 + 367 + 368 + 369 + 370 + 371 + 372 + 373 + 374 + 375 + 376 + 377 + 378 + 379 + 380 + 381 + 382 + 383 + 384 + 385 + 386 + 387 + 388 + 389 + 390 + 391 + 392 + 393 + 394 + 395 + 396 + 397 + 398 + 399 + 400 + 401 + 402 + 403 + 404 + 405 + 406 + 407 + 408 + 409 + 410 + 411 + 412 + 413 + 414 + 415 + 416 + 417 + 418 + 419 + 420 + 421 + 422 + 423 + 424 + 425 + 426 + 427 + 428 + 429 + 430 + 431 + 432 + 433 + 434 + 435 + 436 + 437 + 438 + 439 + 440 + 441 + 442 + 443 + 444 + 445 + 446 + 447 + 448 + 449 + 450 + 451 + 452 + 453 + 454 + 455 + 456 + 457 + 458 + 459 + 460 + 461 + 462 + 463 + 464 + 465 + 466 + 467 + 468 + 469 + 470 + 471 + 472 + 473 + 474 + 475 + 476 + 477 + 478 + 479 + 480 + 481 + 482 + 483 + 484 + 485 + 486 + 487 + 488 + 489 + 490 + 491 + 492 + 493 + 494 + 495 + 496 + 497 + 498 + 499 + 500 + 501 + 502 + 503 + 504 + 505 + 506 + 507 + 508 + 509 + 510 + 511 + 512 + 513 + 514 + 515 + 516 + 517 + 518 + 519 + 520 + 521 + 522 + 523 + 524 + 525 + 526 + 527 + 528 + 529 + 530 + 531 + 532 + 533 + 534 + 535 + 536 + 537 + 538 + 539 + 540 + 541 + 542 + 543 + 544 + 545 + 546 + 547 + 548 + 549 + 550 + 551 + 552 + 553 + 554 + 555 + 556 + 557 + 558 + 559 + 560 + 561 + 562 + 563 + 564 + 565 + 566 + 567 + 568 + 569 + 570 + 571 + 572 + 573 + 574 + 575 + 576 + 577 + 578 + 579 + 580 + 581 + 582 + 583 + 584 + 585 + 586 + 587 + 588 + 589 + 590 + 591 + 592 + 593 + 594 + 595 + 596 + 597 + 598 + 599 + 600 + 601 + 602 + 603 + 604 + 605 + 606 + 607 + 608 + 609 + 610 + 611 + 612 + 613 + 614 + 615 + 616 + 617 + 618 + 619 + 620 + 621 + 622 + 623 + 624 + 625 + 626 + 627 + 628 + 629 + 630 + 631 + 632 + 633 + 634 + 635 + 636 + 637 + 638 + 639 + 640 + 641 + 642 + 643 + 644 + 645 + 646 + 647 + 648 + 649 + 650 + 651 + 652 + 653 + 654 + 655 + 656 + 657 + 658 + 659 + 660 + 661 + 662 + 663 + 664 + 665 + 666 + 667 + 668 + 669 + 670 + 671 + 672 + 673 + 674 + 675 + 676 + 677 + 678 + 679 + 680 + 681 + 682 + 683 + 684 + 685 + 686 + 687 + 688 + 689 + 690 + 691 + 692 + 693 + 694 + 695 + 696 + 697 + 698 + 699 + 700 + 701 + 702 + 703 + 704 + 705 + 706 + 707 + 708 + 709 + 710 + 711 + 712 + 713 + 714 + 715 + 716 + 717 + 718 + 719 + 720 + 721 + 722 + 723 + 724 + 725 + 726 + 727 + 728 + 729 + 730 + 731 + 732 + 733 + 734 + 735 + 736 + 737 + 738 + 739 + 740 + 741 + 742 + 743 + 744 + 745 + 746 + 747 + 748 + 749 + 750 + 751 + 752 + 753 + 754 + 755 + 756 + 757 + 758 + 759 + 760 + 761 + 762 + 763 + 764 + 765 + 766 + 767 + 768 + 769 + 770 + 771 + 772 + 773 + 774 + 775 + 776 + 777 + 778 + 779 + 780 + 781 + 782 + 783 + 784 + 785 + 786 + 787 + 788 + 789 + 790 + 791 + 792 + 793 + 794 + 795 + 796 + 797 + 798 + 799 + 800 + 801 + 802 + 803 + 804 + 805 + 806 + 807 + 808 + 809 + 810 + 811 + 812 + 813 + 814 + 815 + 816 + 817 + 818 + 819 + 820 + 821 + 822 + 823 + 824 + 825 + 826 + 827 + 828 + 829 + 830 + 831 + 832 + 833 + 834 + 835 + 836 + 837 + 838 + 839 + 840 + 841 + 842 + 843 + 844 + 845 + 846 + 847 + 848 + 849 + 850 + 851 + 852 + 853 + 854 + 855 + 856 + 857 + 858 + 859 + 860 + 861 + 862 + 863 + 864 + 865 + 866 + 867 + 868 + 869 + 870 + 871 + 872 + 873 + 874 + 875 + 876 + 877 + 878 + 879 + 880 + 881 + 882 + 883 + 884 + 885 + 886 + 887 + 888 + 889 + 890 + 891 + 892 + 893 + 894 + 895 + 896 + 897 + 898 + 899 + 900 + 901 + 902 + 903 + 904 + 905 + 906 + 907 + 908 + 909 + 910 + 911 + 912 + 913 + 914 + 915 + 916 + 917 + 918 + 919 + 920 + 921 + 922 + 923 + 924 + 925 + 926 + 927 + 928 + 929 + 930 + 931 + 932 + 933 + 934 + 935 + 936 + 937 + 938 + 939 + 940 + 941 + 942 + 943 + 944 + 945 + 946 + 947 + 948 + 949 + 950 + 951 + 952 + 953 + 954 + 955 + 956 + 957 + 958 + 959 + 960 + 961 + 962 + 963 + 964 + 965 + 966 + 967 + 968 + 969 + 970 + 971 + 972 + 973 + 974 + 975 + 976 + 977 + 978 + 979 + 980 + 981 + 982 + 983 + 984 + 985 + 986 + 987 + 988 + 989 + 990 + 991 + 992 + 993 + 994 + 995 + 996 + 997 + 998 + 999 + 1000 + 1001 + 1002 + 1003 + 1004 + 1005 + 1006 + 1007 + 1008 + 1009 + 1010 + 1011 + 1012 + 1013 + 1014 + 1015 + 1016 + 1017 + 1018 + 1019 + 1020 + 1021 + 1022 + 1023 + 1024 + 1025 + 1026 + 1027 + 1028 + 1029 + 1030 + 1031 + 1032 + 1033 + 1034 + 1035 + 1036 + 1037 + 1038 + 1039 + 1040 + 1041 + 1042 + 1043 + 1044 + 1045 + 1046 + 1047 + 1048 + 1049 + 1050 + 1051 + 1052 + 1053 + 1054 + 1055 + 1056 + 1057 + 1058 + 1059 + 1060 + 1061 + 1062 + 1063 + 1064 + 1065 + 1066 + 1067 + 1068 + 1069 + 1070 + 1071 + 1072 + 1073 + 1074 + 1075 + 1076 + 1077 + 1078 + 1079 + 1080 + 1081 + 1082 + 1083 + 1084 + 1085 + 1086 + 1087 + 1088 + 1089 + 1090 + 1091 + 1092 + 1093 + 1094 + 1095 + 1096 + 1097 + 1098 + 1099 + 1100 + 1101 + 1102 + 1103 + 1104 + 1105 + 1106 + 1107 + 1108 + 1109 + 1110 + 1111 + 1112 + 1113 + 1114 + 1115 + 1116 + 1117 + 1118 + 1119 + 1120 + 1121 + 1122 + 1123 + 1124 + 1125 + 1126 + 1127 + 1128 + 1129 + 1130 + 1131 + 1132 + 1133 + 1134 + 1135 + 1136 + 1137 + 1138 + 1139 + 1140 + 1141 + 1142 + 1143 + 1144 + 1145 + 1146 + 1147 + 1148 + 1149 + 1150 + 1151 + 1152 + 1153 + 1154 + 1155 + 1156 + 1157 + 1158 + 1159 + 1160 + 1161 + 1162 + 1163 + 1164 + 1165 + 1166 + 1167 + 1168 + 1169 + 1170 + 1171 + 1172 + 1173 + 1174 + 1175 + 1176 + 1177 + 1178 + 1179 + 1180 + 1181 + 1182 + 1183 + 1184 + 1185 + 1186 + 1187 + 1188 + 1189 + 1190 + 1191 + 1192 + 1193 + 1194 + 1195 + 1196 + 1197 + 1198 + 1199 + 1200 + 1201 + 1202 + 1203 + 1204 + 1205 + 1206 + 1207 + 1208 + 1209 + 1210 + 1211 + 1212 + 1213 + 1214 + 1215 + 1216 + 1217 + 1218 + 1219 + 1220 + 1221 + 1222 + 1223 + 1224 + 1225 + 1226 + 1227 + 1228 + 1229 + 1230 + 1231 + 1232 + 1233 + 1234 + 1235 + 1236 + 1237 + 1238 + 1239 + 1240 + 1241 + 1242 + 1243 + 1244 + 1245 + 1246 + 1247 + 1248 + 1249 + 1250 + 1251 + 1252 + 1253 + 1254 + 1255 + 1256 + 1257 + 1258 + 1259 + 1260 + 1261 + 1262 + 1263 + 1264 + 1265 + 1266 + 1267 + 1268 + 1269 + 1270 + 1271 + 1272 + 1273 + 1274 + 1275 + 1276 + 1277 + 1278 + 1279 + 1280 + 1281 + 1282 + 1283 + 1284 + 1285 + 1286 + 1287 + 1288 + 1289 + 1290 + 1291 + 1292 + 1293 + 1294 + 1295 + 1296 + 1297 + 1298 + 1299 + 1300 + 1301 + 1302 + 1303 + 1304 + 1305 + 1306 + 1307 + 1308 + 1309 + 1310 + 1311 + 1312 + 1313 + 1314 + 1315 + 1316 + 1317 + 1318 + 1319 + 1320 + 1321 + 1322 + 1323 + 1324 + 1325 + 1326 + 1327 + 1328 + 1329 + 1330 + 1331 + 1332 + 1333 + 1334 + 1335 + 1336 + 1337 + 1338 + 1339 + 1340 + 1341 + 1342 + 1343 + 1344 + 1345 + 1346 + 1347 + 1348 + 1349 + 1350 + 1351 + 1352 + 1353 + 1354 + 1355 + 1356 + 1357 + 1358 + 1359 + 1360 + 1361 + 1362 + 1363 + 1364 + 1365 + 1366 + 1367 + 1368 + 1369 + 1370 + 1371 + 1372 + 1373 + 1374 + 1375 + 1376 + 1377 + 1378 + 1379 + 1380 + 1381 + 1382 + 1383 + 1384 + 1385 + 1386 + 1387 + 1388 + 1389 + 1390 + 1391 + 1392 + 1393 + 1394 + 1395 + 1396 + 1397 + 1398 + 1399 + 1400 + 1401 + 1402 + 1403 + 1404 + 1405 + 1406 + 1407 + 1408 + 1409 + 1410 + 1411 + 1412 + 1413 + 1414 + 1415 + 1416 + 1417 + 1418 + 1419 + 1420 + 1421 + 1422 + 1423 + 1424 + 1425 + 1426 + 1427 + 1428 + 1429 + 1430 + 1431 + 1432 + 1433 + 1434 + 1435 + 1436 + 1437 + 1438 + 1439 + 1440 + 1441 + 1442 + 1443 + 1444 + 1445 + 1446 + 1447 + 1448 + 1449 + 1450 + 1451 + 1452 + 1453 + 1454 + 1455 + 1456 + 1457 + 1458 + 1459 + 1460 + 1461 + 1462 + 1463 + 1464 + 1465 + 1466 + 1467 + 1468 + 1469 + 1470 + 1471 + 1472 + 1473 + 1474 + 1475 + 1476 + 1477 + 1478 + 1479 + 1480 + 1481 + 1482 + 1483 + 1484 + 1485 + 1486 + 1487 + 1488 + 1489 + 1490 + 1491 + 1492 + 1493 + 1494 + 1495 + 1496 + 1497 + 1498 + 1499 + 1500 + 1501 + 1502 + 1503 + 1504 + 1505 + 1506 + 1507 + 1508 + 1509 + 1510 + 1511 + 1512 + 1513 + 1514 + 1515 + 1516 + 1517 + 1518 + 1519 + 1520 + 1521 + 1522 + 1523 + 1524 + 1525 + 1526 + 1527 + 1528 + 1529 + 1530 + 1531 + 1532 + 1533 + 1534 + 1535 + 1536 + 1537 + 1538 + 1539 + 1540 + 1541 + 1542 + 1543 + 1544 + 1545 + 1546 + 1547 + 1548 + 1549 + 1550 + 1551 + 1552 + 1553 + 1554 + 1555 + 1556 + 1557 + 1558 + 1559 + 1560 + 1561 + 1562 + 1563 + 1564 + 1565 + 1566 + 1567 + 1568 + 1569 + 1570 + 1571 + 1572 + 1573 + 1574 + 1575 + 1576 + 1577 + 1578 + 1579 + 1580 + 1581 + 1582 + 1583 + 1584 + 1585 + 1586 + 1587 + 1588 + 1589 + 1590 + 1591 + 1592 + 1593 + 1594 + 1595 + 1596 + 1597 + 1598 + 1599 + 1600 + 1601 + 1602 + 1603 + 1604 + 1605 + 1606 + 1607 + 1608 + 1609 + 1610 + 1611 + 1612 + 1613 + 1614 + 1615 + 1616 + 1617 + 1618 + 1619 + 1620 + 1621 + 1622 + 1623 + 1624 + 1625 + 1626 + 1627 + 1628 + 1629 + 1630 + 1631 + 1632 + 1633 + 1634 + 1635 + 1636 + 1637 + 1638 + 1639 + 1640 + 1641 + 1642 + 1643 + 1644 + 1645 + 1646 + 1647 + 1648 + 1649 + 1650 + 1651 + 1652 + 1653 + 1654 + 1655 + 1656 + 1657 + 1658 + 1659 + 1660 + 1661 + 1662 + 1663 + 1664 + 1665 + 1666 + 1667 + 1668 + 1669 + 1670 + 1671 + 1672 + 1673 + 1674 + 1675 + 1676 + 1677 + 1678 + 1679 + 1680 + 1681 + 1682 + 1683 + 1684 + 1685 + 1686 + 1687 + 1688 + 1689 + 1690 + 1691 + 1692 + 1693 + 1694 + 1695 + 1696 + 1697 + 1698 + 1699 + 1700 + 1701 + 1702 + 1703 + 1704 + 1705 + 1706 + 1707 + 1708 + 1709 + 1710 + 1711 + 1712 + 1713 + 1714 + 1715 + 1716 + 1717 + 1718 + 1719 + 1720 + 1721 + 1722 + 1723 + 1724 + 1725 + 1726 + 1727 + 1728 + 1729 + 1730 + 1731 + 1732 + 1733 + 1734 + 1735 + 1736 + 1737 + 1738 + 1739 + 1740 + 1741 + 1742 + 1743 + 1744 + 1745 + 1746 + 1747 + 1748 + 1749 + 1750 + 1751 + 1752 + 1753 + 1754 + 1755 + 1756 + 1757 + 1758 + 1759 + 1760 + 1761 + 1762 + 1763 + 1764 + 1765 + 1766 + 1767 + 1768 + 1769 + 1770 + 1771 + 1772 + 1773 + 1774 + 1775 + 1776 + 1777 + 1778 + 1779 + 1780 + 1781 + 1782 + 1783 + 1784 + 1785 + 1786 + 1787 + 1788 + 1789 + 1790 + 1791 + 1792 + 1793 + 1794 + 1795 + 1796 + 1797 + 1798 + 1799 + 1800 + 1801 + 1802 + 1803 + 1804 + 1805 + 1806 + 1807 + 1808 + 1809 + 1810 + 1811 + 1812 + 1813 + 1814 + 1815 + 1816 + 1817 + 1818 + 1819 + 1820 + 1821 + 1822 + 1823 + 1824 + 1825 + 1826 + 1827 + 1828 + 1829 + 1830 + 1831 + 1832 + 1833 + 1834 + 1835 + 1836 + 1837 + 1838 + 1839 + 1840 + 1841 + 1842 + 1843 + 1844 + 1845 + 1846 + 1847 + 1848 + 1849 + 1850 + 1851 + 1852 + 1853 + 1854 + 1855 + 1856 + 1857 + 1858 + 1859 + 1860 + 1861 + 1862 + 1863 + 1864 + 1865 + 1866 + 1867 + 1868 + 1869 + 1870 + 1871 + 1872 + 1873 + 1874 + 1875 + 1876 + 1877 + 1878 + 1879 + 1880 + 1881 + 1882 + 1883 + 1884 + 1885 + 1886 + 1887 + 1888 + 1889 + 1890 + 1891 + 1892 + 1893 + 1894 + 1895 + 1896 + 1897 + 1898 + 1899 + 1900 + 1901 + 1902 + 1903 + 1904 + 1905 + 1906 + 1907 + 1908 + 1909 + 1910 + 1911 + 1912 + 1913 + 1914 + 1915 + 1916 + 1917 + 1918 + 1919 + 1920 + 1921 + 1922 + 1923 + 1924 + 1925 + 1926 + 1927 + 1928 + 1929 + 1930 + 1931 + 1932 + 1933 + 1934 + 1935 + 1936 + 1937 + 1938 + 1939 + 1940 + 1941 + 1942 + 1943 + 1944 + 1945 + 1946 + 1947 + 1948 + 1949 + 1950 + 1951 + 1952 + 1953 + 1954 + 1955 + 1956 + 1957 + 1958 + 1959 + 1960 + 1961 + 1962 + 1963 + 1964 + 1965 + 1966 + 1967 + 1968 + 1969 + 1970 + 1971 + 1972 + 1973 + 1974 + 1975 + 1976 + 1977 + 1978 + 1979 + 1980 + 1981 + 1982 + 1983 + 1984 + 1985 + 1986 + 1987 + 1988 + 1989 + 1990 + 1991 + 1992 + 1993 + 1994 + 1995 + 1996 + 1997 + 1998 + 1999 + 2000 + 2001 + 2002 + 2003 + 2004 + 2005 + 2006 + 2007 + 2008 + 2009 + 2010 + 2011 + 2012 + 2013 + 2014 + 2015 + 2016 + 2017 + 2018 + 2019 + 2020 + 2021 + 2022 + 2023 + 2024 + 2025 + 2026 + 2027 + 2028 + 2029 + 2030 + 2031 + 2032 + 2033 + 2034 + 2035 + 2036 + 2037 + 2038 + 2039 + 2040 + 2041 + 2042 + 2043 + 2044 + 2045 + 2046 + 2047 + 2048 + 2049 + 2050 + 2051 + 2052 + 2053 + 2054 + 2055 + 2056 + 2057 + 2058 + 2059 + 2060 + 2061 + 2062 + 2063 + 2064 + 2065 + 2066 + 2067 + 2068 + 2069 + 2070 + 2071 + 2072 + 2073 + 2074 + 2075 + 2076 + 2077 + 2078 + 2079 + 2080 + 2081 + 2082 + 2083 + 2084 + 2085 + 2086 + 2087 + 2088 + 2089 + 2090 + 2091 + 2092 + 2093 + 2094 + 2095 + 2096 + 2097 + 2098 + 2099 + 2100 + 2101 + 2102 + 2103 + 2104 + 2105 + 2106 + 2107 + 2108 + 2109 + 2110 + 2111 + 2112 + 2113 + 2114 + 2115 + 2116 + 2117 + 2118 + 2119 + 2120 + 2121 + 2122 + 2123 + 2124 + 2125 + 2126 + 2127 + 2128 + 2129 + 2130 + 2131 + 2132 + 2133 + 2134 + 2135 + 2136 + 2137 + 2138 + 2139 + 2140 + 2141 + 2142 + 2143 + 2144 + 2145 + 2146 + 2147 + 2148 + 2149 + 2150 + 2151 + 2152 + 2153 + 2154 + 2155 + 2156 + 2157 + 2158 + 2159 + 2160 + 2161 + 2162 + 2163 + 2164 + 2165 + 2166 + 2167 + 2168 + 2169 + 2170 + 2171 + 2172 + 2173 + 2174 + 2175 + 2176 + 2177 + 2178 + 2179 + 2180 + 2181 + 2182 + 2183 + 2184 + 2185 + 2186 + 2187 + 2188 + 2189 + 2190 + 2191 + 2192 + 2193 + 2194 + 2195 + 2196 + 2197 + 2198 + 2199 + 2200 + 2201 + 2202 + 2203 + 2204 + 2205 + 2206 + 2207 + 2208 + 2209 + 2210 + 2211 + 2212 + 2213 + 2214 + 2215 + 2216 + 2217 + 2218 + 2219 + 2220 + 2221 + 2222 + 2223 + 2224 + 2225 + 2226 + 2227 + 2228 + 2229 + 2230 + 2231 + 2232 + 2233 + 2234 + 2235 + 2236 + 2237 + 2238 + 2239 + 2240 + 2241 + 2242 + 2243 + 2244 + 2245 + 2246 + 2247 + 2248 + 2249 + 2250 + 2251 + 2252 + 2253 + 2254 + 2255 + 2256 + 2257 + 2258 + 2259 + 2260 + 2261 + 2262 + 2263 + 2264 + 2265 + 2266 + 2267 + 2268 + 2269 + 2270 + 2271 + 2272 + 2273 + 2274 + 2275 + 2276 + 2277 + 2278 + 2279 + 2280 + 2281 + 2282 + 2283 + 2284 + 2285 + 2286 + 2287 + 2288 + 2289 + 2290 + 2291 + 2292 + 2293 + 2294 + 2295 + 2296 + 2297 + 2298 + 2299 + 2300 + 2301 + 2302 + 2303 + 2304 + 2305 + 2306 + 2307 + 2308 + 2309 + 2310 + 2311 + 2312 + 2313 + 2314 + 2315 + 2316 + 2317 + 2318 + 2319 + 2320 + 2321 + 2322 + 2323 + 2324 + 2325 + 2326 + 2327 + 2328 + 2329 + 2330 + 2331 + 2332 + 2333 + 2334 + 2335 + 2336 + 2337 + 2338 + 2339 + 2340 + 2341 + 2342 + 2343 + 2344 + 2345 + 2346 + 2347 + 2348 + 2349 + 2350 + 2351 + 2352 + 2353 + 2354 + 2355 + 2356 + 2357 + 2358 + 2359 + 2360 + 2361 + 2362 + 2363 + 2364 + 2365 + 2366 + 2367 + 2368 + 2369 + 2370 + 2371 + 2372 + 2373 + 2374 + 2375 + 2376 + 2377 + 2378 + 2379 + 2380 + 2381 + 2382 + 2383 + 2384 + 2385 + 2386 + 2387 + 2388 + 2389 + 2390 + 2391 + 2392 + 2393 + 2394 + 2395 + 2396 + 2397 + 2398 + 2399 + 2400 + 2401 + 2402 + 2403 + 2404 + 2405 + 2406 + 2407 + 2408 + 2409 + 2410 + 2411 + 2412 + 2413 + 2414 + 2415 + 2416 + 2417 + 2418 + 2419 + 2420 + 2421 + 2422 + 2423 + 2424 + 2425 + 2426 + 2427 + 2428 + 2429 + 2430 + 2431 + 2432 + 2433 + 2434 + 2435 + 2436 + 2437 + 2438 + 2439 + 2440 + 2441 + 2442 + 2443 + 2444 + 2445 + 2446 + 2447 + 2448 + 2449 + 2450 + 2451 + 2452 + 2453 + 2454 + 2455 + 2456 + 2457 + 2458 + 2459 + 2460 + 2461 + 2462 + 2463 + 2464 + 2465 + 2466 + 2467 + 2468 + 2469 + 2470 + 2471 + 2472 + 2473 + 2474 + 2475 + 2476 + 2477 + 2478 + 2479 + 2480 + 2481 + 2482 + 2483 + 2484 + 2485 + 2486 + 2487 + 2488 + 2489 + 2490 + 2491 + 2492 + 2493 + 2494 + 2495 + 2496 + 2497 + 2498 + 2499 + 2500 + 2501 + 2502 + 2503 + 2504 + 2505 + 2506 + 2507 + 2508 + 2509 + 2510 + 2511 + 2512 + 2513 + 2514 + 2515 + 2516 + 2517 + 2518 + 2519 + 2520 + 2521 + 2522 + 2523 + 2524 + 2525 + 2526 + 2527 + 2528 + 2529 + 2530 + 2531 + 2532 + 2533 + 2534 + 2535 + 2536 + 2537 + 2538 + 2539 + 2540 + 2541 + 2542 + 2543 + 2544 + 2545 + 2546 + 2547 + 2548 + 2549 + 2550 + 2551 + 2552 + 2553 + 2554 + 2555 + 2556 + 2557 + 2558 + 2559 + 2560 + 2561 + 2562 + 2563 + 2564 + 2565 + 2566 + 2567 + 2568 + 2569 + 2570 + 2571 + 2572 + 2573 + 2574 + 2575 + 2576 + 2577 + 2578 + 2579 + 2580 + 2581 + 2582 + 2583 + 2584 + 2585 + 2586 + 2587 + 2588 + 2589 + 2590 + 2591 + 2592 + 2593 + 2594 + 2595 + 2596 + 2597 + 2598 + 2599 + 2600 + 2601 + 2602 + 2603 + 2604 + 2605 + 2606 + 2607 + 2608 + 2609 + 2610 + 2611 + 2612 + 2613 + 2614 + 2615 + 2616 + 2617 + 2618 + 2619 + 2620 + 2621 + 2622 + 2623 + 2624 + 2625 + 2626 + 2627 + 2628 + 2629 + 2630 + 2631 + 2632 + 2633 + 2634 + 2635 + 2636 + 2637 + 2638 + 2639 + 2640 + 2641 + 2642 + 2643 + 2644 + 2645 + 2646 + 2647 + 2648 + 2649 + 2650 + 2651 + 2652 + 2653 + 2654 + 2655 + 2656 + 2657 + 2658 + 2659 + 2660 + 2661 + 2662 + 2663 + 2664 + 2665 + 2666 + 2667 + 2668 + 2669 + 2670 + 2671 + 2672 + 2673 + 2674 + 2675 + 2676 + 2677 + 2678 + 2679 + 2680 + 2681 + 2682 + 2683 + 2684 + 2685 + 2686 + 2687 + 2688 + 2689 + 2690 + 2691 + 2692 + 2693 + 2694 + 2695 + 2696 + 2697 + 2698 + 2699 + 2700 + 2701 + 2702 + 2703 + 2704 + 2705 + 2706 + 2707 + 2708 + 2709 + 2710 + 2711 + 2712 + 2713 + 2714 + 2715 + 2716 + 2717 + 2718 + 2719 + 2720 + 2721 + 2722 + 2723 + 2724 + 2725 + 2726 + 2727 + 2728 + 2729 + 2730 + 2731 + 2732 + 2733 + 2734 + 2735 + 2736 + 2737 + 2738 + 2739 + 2740 + 2741 + 2742 + 2743 + 2744 + 2745 + 2746 + 2747 + 2748 + 2749 + 2750 + 2751 + 2752 + 2753 + 2754 + 2755 + 2756 + 2757 + 2758 + 2759 + 2760 + 2761 + 2762 + 2763 + 2764 + 2765 + 2766 + 2767 + 2768 + 2769 + 2770 + 2771 + 2772 + 2773 + 2774 + 2775 + 2776 + 2777 + 2778 + 2779 + 2780 + 2781 + 2782 + 2783 + 2784 + 2785 + 2786 + 2787 + 2788 + 2789 + 2790 + 2791 + 2792 + 2793 + 2794 + 2795 + 2796 + 2797 + 2798 + 2799 + 2800 + 2801 + 2802 + 2803 + 2804 + 2805 + 2806 + 2807 + 2808 + 2809 + 2810 + 2811 + 2812 + 2813 + 2814 + 2815 + 2816 + 2817 + 2818 + 2819 + 2820 + 2821 + 2822 + 2823 + 2824 + 2825 + 2826 + 2827 + 2828 + 2829 + 2830 + 2831 + 2832 + 2833 + 2834 + 2835 + 2836 + 2837 + 2838 + 2839 + 2840 + 2841 + 2842 + 2843 + 2844 + 2845 + 2846 + 2847 + 2848 + 2849 + 2850 + 2851 + 2852 + 2853 + 2854 + 2855 + 2856 + 2857 + 2858 + 2859 + 2860 + 2861 + 2862 + 2863 + 2864 + 2865 + 2866 + 2867 + 2868 + 2869 + 2870 + 2871 + 2872 + 2873 + 2874 + 2875 + 2876 + 2877 + 2878 + 2879 + 2880 + 2881 + 2882 + 2883 + 2884 + 2885 + 2886 + 2887 + 2888 + 2889 + 2890 + 2891 + 2892 + 2893 + 2894 + 2895 + 2896 + 2897 + 2898 + 2899 + 2900 + 2901 + 2902 + 2903 + 2904 + 2905 + 2906 + 2907 + 2908 + 2909 + 2910 + 2911 + 2912 + 2913 + 2914 + 2915 + 2916 + 2917 + 2918 + 2919 + 2920 + 2921 + 2922 + 2923 + 2924 + 2925 + 2926 + 2927 + 2928 + 2929 + 2930 + 2931 + 2932 + 2933 + 2934 + 2935 + 2936 + 2937 + 2938 + 2939 + 2940 + 2941 + 2942 + 2943 + 2944 + 2945 + 2946 + 2947 + 2948 + 2949 + 2950 + 2951 + 2952 + 2953 + 2954 + 2955 + 2956 + 2957 + 2958 + 2959 + 2960 + 2961 + 2962 + 2963 + 2964 + 2965 + 2966 + 2967 + 2968 + 2969 + 2970 + 2971 + 2972 + 2973 + 2974 + 2975 + 2976 + 2977 + 2978 + 2979 + 2980 + 2981 + 2982 + 2983 + 2984 + 2985 + 2986 + 2987 + 2988 + 2989 + 2990 + 2991 + 2992 + 2993 + 2994 + 2995 + 2996 + 2997 + 2998 + 2999 + 3000 + 3001 + 3002 + 3003 + 3004 + 3005 + 3006 + 3007 + 3008 + 3009 + 3010 + 3011 + 3012 + 3013 + 3014 + 3015 + End SubModelPartNodes +End SubModelPart + diff --git a/applications/GeoMechanicsApplication/tests/test_dynamics.py b/applications/GeoMechanicsApplication/tests/test_dynamics.py index 9f048b015ba5..386162cde87a 100644 --- a/applications/GeoMechanicsApplication/tests/test_dynamics.py +++ b/applications/GeoMechanicsApplication/tests/test_dynamics.py @@ -100,6 +100,38 @@ def test_load_on_block_2d_no_damping(self): for node in nodes: self.assertVectorAlmostEqual(calculated_result[node][what], expected_result[node][what]) + def test_constant_strip_load_2d(self): + + test_name = 'test_constant_strip_load_2d' + file_path = test_helper.get_file_path(os.path.join('.', test_name)) + + simulation = test_helper.run_kratos(file_path) + + # get json output + json_process = simulation._GetListOfProcesses()[4] + + elements = json_process.sub_model_part.Elements + + centroids = [] + stresses = [] + x_coords = [] + for element in elements: + # get centroid + centroid = element.GetGeometry().Center() + x_coords.append(centroid.X) + # get element cauchy stress + element_stress = element.CalculateOnIntegrationPoints(Kratos.CAUCHY_STRESS_VECTOR, + json_process.sub_model_part.ProcessInfo) + vert_stress = test_helper.compute_mean_list([gauss_stress[1] for gauss_stress in element_stress]) + centroids.append(centroid) + stresses.append(vert_stress) + + import matplotlib.pyplot as plt + plt.plot(x_coords, stresses, 'o') + plt.show() + + a=1+1 + if __name__ == '__main__': KratosUnittest.main() diff --git a/applications/GeoMechanicsApplication/tests/test_lamb/lamb.py b/applications/GeoMechanicsApplication/tests/test_lamb/lamb.py deleted file mode 100644 index bdc873209c45..000000000000 --- a/applications/GeoMechanicsApplication/tests/test_lamb/lamb.py +++ /dev/null @@ -1,513 +0,0 @@ -import math -class Lamb: - - def __init__(self, young, poisson, density, load): - - self.young = young - self.poisson = poisson - self.density = density - self.load = load - - self.shear_modulus = self.young / (2 * (1 + self.poisson)) - self.p_wave_modulus = self.young * (1-self.poisson)/((1+self.poisson)*(1-2*self.poisson)) - self.cs = math.sqrt(self.shear_modulus / self.density) # shear wave velocity - self.cp = math.sqrt(self.p_wave_modulus / self.density) # compression wave velocity - - self.eta = self.cs / self.cp - - - def find_rayleigh_tau(self, tol=1e-12): - - # iterate until rayleigh wave arrival is found - - residual = 1 - b = (1 - self.poisson) / 8 - if self.poisson > 0.1: - while residual > tol: - a = b - b = (1 - self.poisson) / (8 * (1 + a) * (self.poisson + a)) - residual = abs(b - a) - else: - while residual > tol: - a = b - b = math.sqrt((1 - self.poisson) / (8 * (1 + a) * (1 + self.poisson / a))) - residual = abs(b - a) - - return math.sqrt(1 + b) - - - def solve_at_t(self, time, x): - - # dimensionless parameter tau which is a function of time and distance and shear wave speed - tau = self.cs * time/x - - # determine dimensionless parameter tau_r which represents the arrival of Rayleigh wave - tau_r = self.find_rayleigh_tau(1e-12) - - # calculate vertical displacement at surface - tolerance = 0.0000001 - if tau <= self.eta: - vert_disp = 0 - elif tau <= 1: - - # split numerator and denominator for readability - numerator = (1 - 2 * tau**2)**2 * math.sqrt(tau**2 - self.eta**2) - denominator = (1 - 2 * tau**2)**4 + 16 * tau**4 * ((tau**2 - self.eta**2) * (1 - tau**2)) - - # calculate vertical displacement - vert_disp = -(self.load * self.cs/(self.shear_modulus * x * math.pi)) * numerator / denominator - - else: - # if tau equals rayleigh wave arrival, move slightly away, as the solution is not defined at this point - if abs(tau - tau_r) < tolerance: - tau = tau_r - tolerance if tau < tau_r else tau_r + tolerance - - numerator = math.sqrt(tau**2 - self.eta**2) - denominator = (1 - 2 * tau**2)**2 - 4 * tau**2 * math.sqrt((tau**2 - self.eta**2) * (tau**2 - 1)) - - vert_disp = -(self.load * self.cs/(self.shear_modulus * x * math.pi)) * numerator / denominator - - return vert_disp, tau - - -# def LinePulseWS(nu, tau): -# pi = 4 * math.atan(1.0) -# fac = 1 / pi -# eps = 0.0001 -# t = tau -# nn = (1 - 2 * nu) / (2 * (1 - nu)) -# n = math.sqrt(nn) -# e = 1e-12 -# f = 1 -# b = (1 - nu) / 8 -# -# if nu > 0.1: -# while f > e: -# a = b -# b = (1 - nu) / (8 * (1 + a) * (nu + a)) -# f = abs(b - a) -# else: -# while f > e: -# a = b -# b = math.sqrt((1 - nu) / (8 * (1 + a) * (1 + nu / a))) -# f = abs(b - a) -# -# tr = math.sqrt(1 + b) -# -# if t <= n: -# w = 0 -# elif t <= 1: -# tt = t * t -# a = math.sqrt(tt - nn) -# b1 = (1 - 2 * tt) * (1 - 2 * tt) -# b2 = 4 * tt * math.sqrt((tt - nn) * (1 - tt)) -# b = b1 * b1 + b2 * b2 -# w = -fac * a * b1 / b -# else: -# if abs(t - tr) < eps: -# t = tr - eps if t < tr else tr + eps -# tt = t * t -# a = math.sqrt(tt - nn) -# b = (1 - 2 * tt) * (1 - 2 * tt) - 4 * tt * math.sqrt((tt - nn) * (tt - 1)) -# w = -fac * a / b -# -# return w - - -if __name__ == '__main__': - - lamb = Lamb(100e3, 0.25, 2000, -1000) - - - import matplotlib.pyplot as plt - - ws = [] - taus = [] - end_time = 1 - n_steps =10000 - - time = [end_time * i / n_steps for i in range(n_steps)] - - taus = [] - res = [] - for t in time: - - res.append(lamb.solve_at_t(t, 0.5)[0]) - taus.append(lamb.solve_at_t(t, 0.5)[1]) - - - - - plt.plot(time, res) - - # plt.ylim(-5, 5) - plt.xlim(0,0.4) - plt.ylim(-0.2,0.2) - plt.show() - - - - # w = LinePulseWS(nu, tau) - - - -# -# class LoadType: -# """ -# Load types: Heaviside or Pulse -# """ -# Heaviside = "heaviside" -# Pulse = "pulse" -# -# -# class Lamb: -# r""" -# Based on Verruijt: An Introduction to Soil Dynamics (Chapter 13: Section 13.2). -# -# The solution is found for normalised variables: tau = (c_s * t / r) and u_bar = P / (2 * pi * G * r), -# where: -# - tau: normalised time -# - u_bar: normalised displacement -# - c_s: shear wave velocity -# - t: time -# - r: radius -# - P: load -# - G: shear modulus -# -# Only vertical displacement is computed. -# In this way the solution only depends on Poisson ratio. -# The results for different radius and E are found as post-processing. -# -# Attributes: -# - load (float): load amplitude -# - load_type (Optional[str]): type of load -# - radius (List[float]): list of radius -# - shear_modulus (float): shear modulus -# - young (float): Young modulus -# - poisson (float): Poisson ratio -# - rho (float): density -# - cs (float): shear wave velocity -# - cr (float): Rayleigh wave velocity -# - eta (float): ratio shear wave / compression wave velocity -# - nb_steps (int): number of steps for time discretisation -# - steps_int (int): number of steps for numerical integration -# - tol (float): small number for the integration -# - tau (npt.NDArray[np.float64]): normalised time -# - time (npt.NDArray[np.float64]): time -# - pulse_samples (int): number of samples for pulse load -# - u (npt.NDArray[np.float64]): displacement -# - u_bar (npt.NDArray[np.float64]): normalised displacement -# """ -# -# def __init__(self, -# nb_steps: int = 1000, -# tol: float = 0.005, -# tau_max: float = 4, -# step_int: int = 1000, -# pulse_samples: int = 2): -# """ -# Pekeris wave solution for vertical displacement -# -# Args: -# - nb_steps (int): number of steps for time discretisation (default = 1000) -# - tol (float): tolerance number for the integration (default = 0.005) -# - tau_max (float): maximum value of tau (default = 4) -# - step_int (int): number of steps for numerical integration (default = 1000) -# - pulse_samples (int): number of samples for pulse load (default = 2) -# """ -# self.load: float = np.nan -# self.load_type: Optional[str] = None -# self.radius: List[float] = [] -# self.shear_modulus: float = np.nan # shear modulus -# self.young: float = np.nan # Young modulus -# self.poisson: float = np.nan # Poisson ratio -# self.rho: float = np.nan # density -# self.cs: float = np.nan # shear wave velocity -# self.cr: float = np.nan # Rayleigh wave velocity -# self.eta: float = np.nan # ratio shear wave / compression wave velocity -# self.nb_steps: int = int(nb_steps) # for the discretisation of tau -# self.steps_int: int = int(step_int) # number of steps for numerical integration -# self.tol: float = tol # small number for the integration -# self.tau: npt.NDArray[np.float64] = np.linspace(0, tau_max, self.nb_steps) # normalised time -# self.time: npt.NDArray[np.float64] = np.empty(shape=(0, 0)) # time -# self.pulse_samples: int = pulse_samples # number of samples for pulse load -# self.u: npt.NDArray[np.float64] = np.empty(shape=(0, 0)) # displacement -# self.u_bar: npt.NDArray[np.float64] = np.empty(self.tau.shape[0]) # normalised displacement -# -# def material_properties(self, nu: float, rho: float, young: float): -# r""" -# Material properties -# -# Args: -# - nu (float): Poisson ratio [-] -# - rho (float): density [kgm^-3] -# - young (float): Young modulus [Pa] -# """ -# self.poisson = nu -# self.rho = rho -# self.young = young -# -# def loading(self, p: float, load_type: str): -# r""" -# Load properties -# -# Args: -# - p (float): load amplitude -# - load_type (str): type of load -# """ -# self.load = p -# self.load_type = load_type -# -# def solution(self, radius: List[float]): -# r""" -# Compute the solution for the given radius -# -# Args: -# - radius (List[float]): list of radius -# """ -# self.radius = radius -# self.u = np.zeros((len(self.tau), len(radius))) -# self.time = np.zeros((len(self.tau), len(radius))) -# -# # compute wave speed -# self.elastic_props() -# -# # determine arrival of compression wave -# # displacements are zero before it -# self.displacement_before_compression() -# -# # displacements between arrival of compression wave and shear wave -# self.displacement_before_shear() -# -# # displacement before arrival of Rayleigh wave -# self.displacement_before_rayleigh() -# -# # displacement after arrival of Rayleigh wave -# self.displacement_after_rayleigh() -# -# return -# -# def displacement_before_compression(self): -# r""" -# Compute displacement before arrival of compression wave -# """ -# idx = np.where(self.tau <= self.eta)[0] -# self.u_bar[idx] = 0 -# -# def displacement_before_shear(self): -# r""" -# Compute displacement before arrival of shear wave -# """ -# # limits for integration -# theta_array = np.linspace(0, np.pi / 2, self.steps_int) -# -# # for each tau -# for idx, tau in enumerate(self.tau): -# # if tau within these limits: evaluate integral -# if (tau > self.eta) & (tau <= 1): -# -# # G1 integral -# integral = [] -# for theta in theta_array: -# y = np.sqrt(self.eta**2 + (tau**2 - self.eta**2) * np.sin(theta)**2) -# integral.append((1 - 2 * y**2)**2 * np.sin(theta)**2 / -# (1 - 8 * y**2 + 8 * (3 - 2 * self.eta**2) * y**4 - 16 * (1 - self.eta**2) * y**6)) -# -# # perform integration -# integral = trapezoid(np.array(integral), theta_array) -# -# # compute G1 integral -# G1_integral = (tau**2 - self.eta**2) * integral -# -# # normalised displacement -# self.u_bar[idx] = -G1_integral / np.pi**2 -# -# def displacement_before_rayleigh(self): -# r""" -# Compute displacement before arrival of Rayleigh wave -# """ -# -# # limits for integration -# theta = np.linspace(0, np.pi / 2, self.steps_int) -# -# # for each tau -# for idx, tau in enumerate(self.tau): -# # if tau within these limits: evaluate integral -# if (tau > 1) & (tau <= self.cr): -# # G1 and G2 integrals -# integral_1 = [] -# integral_2 = [] -# for t in theta: -# y = np.sqrt(self.eta**2 + (tau**2 - self.eta**2) * np.sin(t)**2) -# integral_1.append((1 - 2 * y**2)**2 * np.sin(t)**2 / -# (1 - 8 * y**2 + 8 * (3 - 2 * self.eta**2) * y**4 - 16 * (1 - self.eta**2) * y**6)) -# y = np.sqrt(1 + (tau**2 - 1) * np.sin(t)**2) -# integral_2.append(y**2 * (y**2 - self.eta**2) * np.sin(t)**2 / -# (1 - 8 * y**2 + 8 * (3 - 2 * self.eta**2) * y**4 - 16 * (1 - self.eta**2) * y**6)) -# -# # perform integration -# integral_1 = trapezoid(np.array(integral_1), theta) -# integral_2 = trapezoid(np.array(integral_2), theta) -# -# # compute G1 & G2 integrals -# G1_integral = (tau**2 - self.eta**2) * integral_1 -# G2_integral = 4 * (tau**2 - 1) * integral_2 -# -# # normalised displacement -# self.u_bar[idx] = -(G1_integral + G2_integral) / np.pi**2 -# -# def displacement_after_rayleigh(self): -# r""" -# Compute displacement after arrival of Rayleigh wave -# """ -# -# # for each tau -# for idx, tau in enumerate(self.tau): -# # if tau within these limits: evaluate integral -# if tau > self.cr: -# # G1 and G2 integrals -# integral_1_1 = [] -# integral_1_2 = [] -# integral_2_1 = [] -# integral_2_2 = [] -# -# # limits for integration -# theta_r1 = np.arcsin(np.sqrt((self.cr**2 - self.eta**2) / (tau**2 - self.eta**2))) -# theta_r1_low = np.linspace(0, theta_r1 - self.tol, self.steps_int) -# theta_r1_high = np.linspace(theta_r1 + self.tol, np.pi / 2, self.steps_int) -# -# theta_r2 = np.arcsin(np.sqrt((self.cr**2 - 1) / (tau**2 - 1))) -# theta_r2_low = np.linspace(0, theta_r2 - self.tol, self.steps_int) -# theta_r2_high = np.linspace(theta_r2 + self.tol, np.pi / 2, self.steps_int) -# -# for t in range(self.steps_int): -# y = np.sqrt(self.eta**2 + (tau**2 - self.eta**2) * np.sin(theta_r1_low[t])**2) -# integral_1_1.append( -# (1 - 2 * y**2)**2 * np.sin(theta_r1_low[t])**2 / -# (1 - 8 * y**2 + 8 * (3 - 2 * self.eta**2) * y**4 - 16 * (1 - self.eta**2) * y**6)) -# y = np.sqrt(self.eta**2 + (tau**2 - self.eta**2) * np.sin(theta_r1_high[t])**2) -# integral_1_2.append( -# (1 - 2 * y**2)**2 * np.sin(theta_r1_high[t])**2 / -# (1 - 8 * y**2 + 8 * (3 - 2 * self.eta**2) * y**4 - 16 * (1 - self.eta**2) * y**6)) -# -# y = np.sqrt(1 + (tau**2 - 1) * np.sin(theta_r2_low[t])**2) -# integral_2_1.append(y**2 * (y**2 - self.eta**2) * np.sin(theta_r2_low[t])**2 / -# (1 - 8 * y**2 + 8 * (3 - 2 * self.eta**2) * y**4 - 16 * -# (1 - self.eta**2) * y**6)) -# y = np.sqrt(1 + (tau**2 - 1) * np.sin(theta_r2_high[t])**2) -# integral_2_2.append(y**2 * (y**2 - self.eta**2) * np.sin(theta_r2_high[t])**2 / -# (1 - 8 * y**2 + 8 * (3 - 2 * self.eta**2) * y**4 - 16 * -# (1 - self.eta**2) * y**6)) -# -# # perform integration -# integral_1_1 = trapezoid(np.array(integral_1_1), theta_r1_low) -# integral_1_2 = trapezoid(np.array(integral_1_2), theta_r1_high) -# integral_2_1 = trapezoid(np.array(integral_2_1), theta_r2_low) -# integral_2_2 = trapezoid(np.array(integral_2_2), theta_r2_high) -# -# # compute G1 & G2 -# G1_integral = (tau**2 - self.eta**2) * (integral_1_1 + integral_1_2) -# G2_integral = 4 * (tau**2 - 1) * (integral_2_1 + integral_2_2) -# -# # normalised displacement -# self.u_bar[idx] = -(G1_integral + G2_integral) / np.pi**2 -# -# def elastic_props(self): -# r""" -# Compute elastic properties of the solid material -# """ -# -# # shear modulus -# self.shear_modulus = self.young / (2 * (1 + self.poisson)) -# # shear wave -# self.cs = np.sqrt(self.shear_modulus / self.rho) -# # ratio of wave velocities -# self.eta = np.sqrt((1 - 2 * self.poisson) / (2 * (1 - self.poisson))) -# # determine Rayleigh wave speed: root finder of Rayleigh wave -# dd = root(self.d_function, (1 - self.poisson) / 8, tol=1e-12) -# d = dd.x[0] -# self.cr = np.sqrt(1 + d) -# -# def results(self, plots: bool = True, output_folder: str = "./", file_name: str = "results"): -# r""" -# Post-processing of the results -# -# Args: -# - plots (bool): checks if make plots (default = True) -# - output_folder (str): folder to save the results (default = "./") -# - file_name (str): name of the file (default = "results") -# """ -# -# # if load type pulse: -# # subtract two solutions with self.pulse_samples -# if self.load_type == "pulse": -# aux = np.zeros(len(self.u_bar)) -# aux[self.pulse_samples:] = self.u_bar[:-self.pulse_samples] -# self.u_bar -= aux -# -# # scale the results for each radius -# for i, r in enumerate(self.radius): -# self.u[:, i] = self.u_bar * self.load / (self.shear_modulus * r) -# self.time[:, i] = self.tau * r / self.cs -# -# # if plots -# if plots: -# if not os.path.isdir(output_folder): -# os.mkdir(output_folder) -# if not file_name: -# file_name = "results" -# # plot normalised -# fig, ax = plt.subplots(1, 1, figsize=(5, 4)) -# ax.set_position([0.20, 0.15, 0.75, 0.8]) -# plt.rcParams.update({'font.size': 10}) -# ax.plot(self.tau, self.u_bar) -# ax.set_xlim((0, np.max(self.tau))) -# # ax.set_ylim((0.15, -0.25)) -# ax.set_xlabel(r"$\tau$") -# ax.set_ylabel(r"$\bar{u}$") -# ax.grid() -# plt.savefig(os.path.join(output_folder, f"{file_name}_normalised.png")) -# plt.close() -# -# # plot magnitude of results for all radius -# fig, ax = plt.subplots(1, 1, figsize=(5, 4)) -# ax.set_position([0.20, 0.15, 0.75, 0.8]) -# plt.rcParams.update({'font.size': 10}) -# -# for i, r in enumerate(self.radius): -# ax.plot(self.time[:, i], self.u[:, i], label=f"Radius: {r} m") -# -# ax.set_xlim((0, np.max(np.max(self.time)))) -# # ax.set_ylim((0.5, -0.5)) -# ax.grid() -# ax.set_xlabel(r"Time [s]") -# ax.set_ylabel(r"Vertical displacement [m]") -# ax.legend(loc="upper right") -# plt.savefig(os.path.join(output_folder, f"{file_name}_displacement.png")) -# plt.close() -# -# def d_function(self, d: float) -> float: -# r""" -# Function to compute the residual of the Rayleigh wave speed -# -# Args: -# - d (float): parameter to compute the residual of the Rayleigh speed -# -# Returns: -# - float: residual of the Rayleigh speed -# """ -# return d - ((1 - self.poisson) / 8) / ((1 + d) * (d + self.poisson)) -# -# -# if __name__ == "__main__": -# lmb = Pekeris() -# lmb.material_properties(0.2, 1890, 100e3) -# lmb.loading(-1000, LoadType.Pulse) -# lmb.solution([3, 4, 5, 6]) -# lmb.results(output_folder="Results", file_name="Pulse") -# -# lmb = Pekeris() -# lmb.material_properties(0.2, 2000, 100e3) -# lmb.loading(-1000, LoadType.Heaviside) -# lmb.solution([3, 4, 5, 6]) -# lmb.results(output_folder="Results", file_name="Heaviside") From 39e13ba06a0ce2b9a90ccffbc1ebce365c901b92 Mon Sep 17 00:00:00 2001 From: aronnoordam Date: Tue, 23 Jul 2024 11:01:52 +0200 Subject: [PATCH 15/65] added kratos import --- applications/GeoMechanicsApplication/tests/test_dynamics.py | 1 + 1 file changed, 1 insertion(+) diff --git a/applications/GeoMechanicsApplication/tests/test_dynamics.py b/applications/GeoMechanicsApplication/tests/test_dynamics.py index 386162cde87a..36a5fe2e065c 100644 --- a/applications/GeoMechanicsApplication/tests/test_dynamics.py +++ b/applications/GeoMechanicsApplication/tests/test_dynamics.py @@ -1,6 +1,7 @@ import os import json +import KratosMultiphysics as Kratos import KratosMultiphysics.KratosUnittest as KratosUnittest import KratosMultiphysics.GeoMechanicsApplication as KratosGeo import test_helper From 1b4c44f881105c46b37f2f37e3269031e98ac181 Mon Sep 17 00:00:00 2001 From: aronnoordam Date: Wed, 24 Jul 2024 11:15:51 +0200 Subject: [PATCH 16/65] added check for strip load test --- .../strip_load_semi_analytical_solution.py | 2 +- .../expected_json_output.json | 1741 +++++++++++++++++ .../tests/test_dynamics.py | 100 +- .../tests/test_helper.py | 93 + 4 files changed, 1911 insertions(+), 25 deletions(-) create mode 100644 applications/GeoMechanicsApplication/tests/test_constant_strip_load_2d/expected_json_output.json diff --git a/applications/GeoMechanicsApplication/tests/strip_load_semi_analytical_solution.py b/applications/GeoMechanicsApplication/tests/strip_load_semi_analytical_solution.py index c35dca9e3524..41a5626f3954 100644 --- a/applications/GeoMechanicsApplication/tests/strip_load_semi_analytical_solution.py +++ b/applications/GeoMechanicsApplication/tests/strip_load_semi_analytical_solution.py @@ -337,7 +337,7 @@ def calculate_vertical_stress(self, x: float, z: float, t: float, load_length: f Args: - x (float): x coordinate [m] - - z (float): z coordinate [m] + - z (float): depth from load [m] - t (float): time [s] - load_length (float): length of the line load [m] - load_value (float): value of the line load [N/m] diff --git a/applications/GeoMechanicsApplication/tests/test_constant_strip_load_2d/expected_json_output.json b/applications/GeoMechanicsApplication/tests/test_constant_strip_load_2d/expected_json_output.json new file mode 100644 index 000000000000..4a0816e8cd50 --- /dev/null +++ b/applications/GeoMechanicsApplication/tests/test_constant_strip_load_2d/expected_json_output.json @@ -0,0 +1,1741 @@ +{ + "TIME": [ + 1.0 + ], + "ELEMENT_324": { + "CAUCHY_STRESS_VECTOR": { + "0": [ + [ + -157.87040134430245, + -821.7017081138844, + -244.89302736454687, + 18.262866238969774 + ] + ], + "1": [ + [ + -157.87040134430245, + -821.7017081138844, + -244.89302736454687, + 18.262866238969774 + ] + ], + "2": [ + [ + -157.87040134430245, + -821.7017081138844, + -244.89302736454687, + 18.262866238969774 + ] + ] + } + }, + "ELEMENT_749": { + "CAUCHY_STRESS_VECTOR": { + "0": [ + [ + 100.28972789535173, + 55.19867624204221, + 38.87210103434848, + 6.976322197473641 + ] + ], + "1": [ + [ + 100.28972789535173, + 55.19867624204221, + 38.87210103434848, + 6.976322197473641 + ] + ], + "2": [ + [ + 100.28972789535173, + 55.19867624204221, + 38.87210103434848, + 6.976322197473641 + ] + ] + } + }, + "ELEMENT_860": { + "CAUCHY_STRESS_VECTOR": { + "0": [ + [ + -135.5142399375369, + -72.99662590178384, + -52.12771645983019, + 100.03120991671172 + ] + ], + "1": [ + [ + -135.5142399375369, + -72.99662590178384, + -52.12771645983019, + 100.03120991671172 + ] + ], + "2": [ + [ + -135.5142399375369, + -72.99662590178384, + -52.12771645983019, + 100.03120991671172 + ] + ] + } + }, + "ELEMENT_908": { + "CAUCHY_STRESS_VECTOR": { + "0": [ + [ + 74.44549027356193, + -2.258295087995912, + 18.046798796391503, + -85.74233887964397 + ] + ], + "1": [ + [ + 74.44549027356193, + -2.258295087995912, + 18.046798796391503, + -85.74233887964397 + ] + ], + "2": [ + [ + 74.44549027356193, + -2.258295087995912, + 18.046798796391503, + -85.74233887964397 + ] + ] + } + }, + "ELEMENT_934": { + "CAUCHY_STRESS_VECTOR": { + "0": [ + [ + 103.17186774240571, + 51.42980682054385, + 38.65041864073739, + -28.299000666423556 + ] + ], + "1": [ + [ + 103.17186774240571, + 51.42980682054385, + 38.65041864073739, + -28.299000666423556 + ] + ], + "2": [ + [ + 103.17186774240571, + 51.42980682054385, + 38.65041864073739, + -28.299000666423556 + ] + ] + } + }, + "ELEMENT_958": { + "CAUCHY_STRESS_VECTOR": { + "0": [ + [ + -94.64338360137303, + -48.70016057332975, + -35.83588604367568, + 73.56204358061368 + ] + ], + "1": [ + [ + -94.64338360137303, + -48.70016057332975, + -35.83588604367568, + 73.56204358061368 + ] + ], + "2": [ + [ + -94.64338360137303, + -48.70016057332975, + -35.83588604367568, + 73.56204358061368 + ] + ] + } + }, + "ELEMENT_975": { + "CAUCHY_STRESS_VECTOR": { + "0": [ + [ + -173.4142568094205, + -85.62996485907838, + -64.76105541712474, + 117.14810478287592 + ] + ], + "1": [ + [ + -173.4142568094205, + -85.62996485907838, + -64.76105541712474, + 117.14810478287592 + ] + ], + "2": [ + [ + -173.4142568094205, + -85.62996485907838, + -64.76105541712474, + 117.14810478287592 + ] + ] + } + }, + "ELEMENT_983": { + "CAUCHY_STRESS_VECTOR": { + "0": [ + [ + 13.366435026800136, + -40.7648597187801, + -6.849606172995, + 74.80000551563242 + ] + ], + "1": [ + [ + 13.366435026800136, + -40.7648597187801, + -6.849606172995, + 74.80000551563242 + ] + ], + "2": [ + [ + 13.366435026800136, + -40.7648597187801, + -6.849606172995, + 74.80000551563242 + ] + ] + } + }, + "ELEMENT_1009": { + "CAUCHY_STRESS_VECTOR": { + "0": [ + [ + -86.41688070126314, + -19.372357741836584, + -26.44730961077493, + 0.8638354629799521 + ] + ], + "1": [ + [ + -86.41688070126314, + -19.372357741836584, + -26.44730961077493, + 0.8638354629799521 + ] + ], + "2": [ + [ + -86.41688070126314, + -19.372357741836584, + -26.44730961077493, + 0.8638354629799521 + ] + ] + } + }, + "ELEMENT_1039": { + "CAUCHY_STRESS_VECTOR": { + "0": [ + [ + 43.598035813144506, + -30.687659456665365, + 3.2275940891198096, + 83.02410550805891 + ] + ], + "1": [ + [ + 43.598035813144506, + -30.687659456665365, + 3.2275940891198096, + 83.02410550805891 + ] + ], + "2": [ + [ + 43.598035813144506, + -30.687659456665365, + 3.2275940891198096, + 83.02410550805891 + ] + ] + } + }, + "ELEMENT_1419": { + "CAUCHY_STRESS_VECTOR": { + "0": [ + [ + -88.55264777120028, + -16.03480676327571, + -26.146863633618995, + -0.3692502305180021 + ] + ], + "1": [ + [ + -88.55264777120028, + -16.03480676327571, + -26.146863633618995, + -0.3692502305180021 + ] + ], + "2": [ + [ + -88.55264777120028, + -16.03480676327571, + -26.146863633618995, + -0.3692502305180021 + ] + ] + } + }, + "ELEMENT_1487": { + "CAUCHY_STRESS_VECTOR": { + "0": [ + [ + -157.10415165407562, + -752.1038852278178, + -227.30200922047348, + 117.73356899338948 + ] + ], + "1": [ + [ + -157.10415165407562, + -752.1038852278178, + -227.30200922047348, + 117.73356899338948 + ] + ], + "2": [ + [ + -157.10415165407562, + -752.1038852278178, + -227.30200922047348, + 117.73356899338948 + ] + ] + } + }, + "ELEMENT_1638": { + "CAUCHY_STRESS_VECTOR": { + "0": [ + [ + 91.59949703321273, + 47.57234991747955, + 34.79296173767307, + -52.637528997648126 + ] + ], + "1": [ + [ + 91.59949703321273, + 47.57234991747955, + 34.79296173767307, + -52.637528997648126 + ] + ], + "2": [ + [ + 91.59949703321273, + 47.57234991747955, + 34.79296173767307, + -52.637528997648126 + ] + ] + } + }, + "ELEMENT_1729": { + "CAUCHY_STRESS_VECTOR": { + "0": [ + [ + -32.53714207376192, + 8.448895056689738, + -6.022061754268044, + -6.210249982421909 + ] + ], + "1": [ + [ + -32.53714207376192, + 8.448895056689738, + -6.022061754268044, + -6.210249982421909 + ] + ], + "2": [ + [ + -32.53714207376192, + 8.448895056689738, + -6.022061754268044, + -6.210249982421909 + ] + ] + } + }, + "ELEMENT_1902": { + "CAUCHY_STRESS_VECTOR": { + "0": [ + [ + -198.70950521372907, + -392.3253857372903, + -147.75872273775485, + 248.83255267543814 + ] + ], + "1": [ + [ + -198.70950521372907, + -392.3253857372903, + -147.75872273775485, + 248.83255267543814 + ] + ], + "2": [ + [ + -198.70950521372907, + -392.3253857372903, + -147.75872273775485, + 248.83255267543814 + ] + ] + } + }, + "ELEMENT_1950": { + "CAUCHY_STRESS_VECTOR": { + "0": [ + [ + 8.947275370499398, + 5.525342654544158, + 3.618154506260888, + -16.4451007266552 + ] + ], + "1": [ + [ + 8.947275370499398, + 5.525342654544158, + 3.618154506260888, + -16.4451007266552 + ] + ], + "2": [ + [ + 8.947275370499398, + 5.525342654544158, + 3.618154506260888, + -16.4451007266552 + ] + ] + } + }, + "ELEMENT_2022": { + "CAUCHY_STRESS_VECTOR": { + "0": [ + [ + 34.119555687355344, + -9.778624031897511, + 6.085232913864459, + -21.030618966489023 + ] + ], + "1": [ + [ + 34.119555687355344, + -9.778624031897511, + 6.085232913864459, + -21.030618966489023 + ] + ], + "2": [ + [ + 34.119555687355344, + -9.778624031897511, + 6.085232913864459, + -21.030618966489023 + ] + ] + } + }, + "ELEMENT_2283": { + "CAUCHY_STRESS_VECTOR": { + "0": [ + [ + 78.27256165166821, + 15.529157018117148, + 23.450429667446347, + -99.92386922100961 + ] + ], + "1": [ + [ + 78.27256165166821, + 15.529157018117148, + 23.450429667446347, + -99.92386922100961 + ] + ], + "2": [ + [ + 78.27256165166821, + 15.529157018117148, + 23.450429667446347, + -99.92386922100961 + ] + ] + } + }, + "ELEMENT_2284": { + "CAUCHY_STRESS_VECTOR": { + "0": [ + [ + 83.58162854050761, + 40.06239455693323, + 30.911005774360206, + -96.55332301708641 + ] + ], + "1": [ + [ + 83.58162854050761, + 40.06239455693323, + 30.911005774360206, + -96.55332301708641 + ] + ], + "2": [ + [ + 83.58162854050761, + 40.06239455693323, + 30.911005774360206, + -96.55332301708641 + ] + ] + } + }, + "ELEMENT_2352": { + "CAUCHY_STRESS_VECTOR": { + "0": [ + [ + 63.739006260769514, + -5.827123092260045, + 14.477970792127364, + -69.39751125577949 + ] + ], + "1": [ + [ + 63.739006260769514, + -5.827123092260045, + 14.477970792127364, + -69.39751125577949 + ] + ], + "2": [ + [ + 63.739006260769514, + -5.827123092260045, + 14.477970792127364, + -69.39751125577949 + ] + ] + } + }, + "ELEMENT_2448": { + "CAUCHY_STRESS_VECTOR": { + "0": [ + [ + 45.432958877842545, + -25.530928088719158, + 4.975507697280841, + 97.99575549352848 + ] + ], + "1": [ + [ + 45.432958877842545, + -25.530928088719158, + 4.975507697280841, + 97.99575549352848 + ] + ], + "2": [ + [ + 45.432958877842545, + -25.530928088719158, + 4.975507697280841, + 97.99575549352848 + ] + ] + } + }, + "ELEMENT_2449": { + "CAUCHY_STRESS_VECTOR": { + "0": [ + [ + -220.55488034515815, + -230.08539865086175, + -112.66006974900502, + 218.83401150262546 + ] + ], + "1": [ + [ + -220.55488034515815, + -230.08539865086175, + -112.66006974900502, + 218.83401150262546 + ] + ], + "2": [ + [ + -220.55488034515815, + -230.08539865086175, + -112.66006974900502, + 218.83401150262546 + ] + ] + } + }, + "ELEMENT_2501": { + "CAUCHY_STRESS_VECTOR": { + "0": [ + [ + -56.96251383766888, + -46.531284494885725, + -25.87344958313865, + 59.281743479078436 + ] + ], + "1": [ + [ + -56.96251383766888, + -46.531284494885725, + -25.87344958313865, + 59.281743479078436 + ] + ], + "2": [ + [ + -56.96251383766888, + -46.531284494885725, + -25.87344958313865, + 59.281743479078436 + ] + ] + } + }, + "ELEMENT_2613": { + "CAUCHY_STRESS_VECTOR": { + "0": [ + [ + -221.30209870908, + -399.8562502357408, + -155.28958723620522, + 252.60713304780109 + ] + ], + "1": [ + [ + -221.30209870908, + -399.8562502357408, + -155.28958723620522, + 252.60713304780109 + ] + ], + "2": [ + [ + -221.30209870908, + -399.8562502357408, + -155.28958723620522, + 252.60713304780109 + ] + ] + } + }, + "ELEMENT_2910": { + "CAUCHY_STRESS_VECTOR": { + "0": [ + [ + -200.6958463038808, + -605.1327769062148, + -201.45715580252386, + 251.47096293106964 + ] + ], + "1": [ + [ + -200.6958463038808, + -605.1327769062148, + -201.45715580252386, + 251.47096293106964 + ] + ], + "2": [ + [ + -200.6958463038808, + -605.1327769062148, + -201.45715580252386, + 251.47096293106964 + ] + ] + } + }, + "ELEMENT_2958": { + "CAUCHY_STRESS_VECTOR": { + "0": [ + [ + -84.15364731087715, + -22.327509759050905, + -26.62028926748202, + -0.4428429449234366 + ] + ], + "1": [ + [ + -84.15364731087715, + -22.327509759050905, + -26.62028926748202, + -0.4428429449234366 + ] + ], + "2": [ + [ + -84.15364731087715, + -22.327509759050905, + -26.62028926748202, + -0.4428429449234366 + ] + ] + } + }, + "ELEMENT_3039": { + "CAUCHY_STRESS_VECTOR": { + "0": [ + [ + 82.23235975408473, + 16.849089718922656, + 24.770362368251853, + -97.08588520919434 + ] + ], + "1": [ + [ + 82.23235975408473, + 16.849089718922656, + 24.770362368251853, + -97.08588520919434 + ] + ], + "2": [ + [ + 82.23235975408473, + 16.849089718922656, + 24.770362368251853, + -97.08588520919434 + ] + ] + } + }, + "ELEMENT_3046": { + "CAUCHY_STRESS_VECTOR": { + "0": [ + [ + -85.65911490400266, + -12.382816329521782, + -24.510482808381113, + -1.4491111670774943 + ] + ], + "1": [ + [ + -85.65911490400266, + -12.382816329521782, + -24.510482808381113, + -1.4491111670774943 + ] + ], + "2": [ + [ + -85.65911490400266, + -12.382816329521782, + -24.510482808381113, + -1.4491111670774943 + ] + ] + } + }, + "ELEMENT_3151": { + "CAUCHY_STRESS_VECTOR": { + "0": [ + [ + -210.9763137454291, + -226.89254311761863, + -109.46721421576198, + 200.59981486308052 + ] + ], + "1": [ + [ + -210.9763137454291, + -226.89254311761863, + -109.46721421576198, + 200.59981486308052 + ] + ], + "2": [ + [ + -210.9763137454291, + -226.89254311761863, + -109.46721421576198, + 200.59981486308052 + ] + ] + } + }, + "ELEMENT_3181": { + "CAUCHY_STRESS_VECTOR": { + "0": [ + [ + -168.9110071331214, + -594.5378305159618, + -190.86220941227072, + 210.0351716549862 + ] + ], + "1": [ + [ + -168.9110071331214, + -594.5378305159618, + -190.86220941227072, + 210.0351716549862 + ] + ], + "2": [ + [ + -168.9110071331214, + -594.5378305159618, + -190.86220941227072, + 210.0351716549862 + ] + ] + } + }, + "ELEMENT_3329": { + "CAUCHY_STRESS_VECTOR": { + "0": [ + [ + -58.83421188705572, + -38.425422826152705, + -24.314908678302114, + 60.22351293311793 + ] + ], + "1": [ + [ + -58.83421188705572, + -38.425422826152705, + -24.314908678302114, + 60.22351293311793 + ] + ], + "2": [ + [ + -58.83421188705572, + -38.425422826152705, + -24.314908678302114, + 60.22351293311793 + ] + ] + } + }, + "ELEMENT_3388": { + "CAUCHY_STRESS_VECTOR": { + "0": [ + [ + -8.522609439284132, + 10.100214753904249, + 0.394401328655024, + -15.311118366067351 + ] + ], + "1": [ + [ + -8.522609439284132, + 10.100214753904249, + 0.394401328655024, + -15.311118366067351 + ] + ], + "2": [ + [ + -8.522609439284132, + 10.100214753904249, + 0.394401328655024, + -15.311118366067351 + ] + ] + } + }, + "ELEMENT_3483": { + "CAUCHY_STRESS_VECTOR": { + "0": [ + [ + -61.19932775441985, + -2.2167034477920886, + -15.854007800552989, + -0.9235403005455879 + ] + ], + "1": [ + [ + -61.19932775441985, + -2.2167034477920886, + -15.854007800552989, + -0.9235403005455879 + ] + ], + "2": [ + [ + -61.19932775441985, + -2.2167034477920886, + -15.854007800552989, + -0.9235403005455879 + ] + ] + } + }, + "ELEMENT_3559": { + "CAUCHY_STRESS_VECTOR": { + "0": [ + [ + 0.3433430074337096, + 13.055532236143534, + 3.349718810894318, + -17.99942319338191 + ] + ], + "1": [ + [ + 0.3433430074337096, + 13.055532236143534, + 3.349718810894318, + -17.99942319338191 + ] + ], + "2": [ + [ + 0.3433430074337096, + 13.055532236143534, + 3.349718810894318, + -17.99942319338191 + ] + ] + } + }, + "ELEMENT_3632": { + "CAUCHY_STRESS_VECTOR": { + "0": [ + [ + -20.659701724193837, + 9.085359461177298, + -2.8935855657541385, + -3.3232726308778266 + ] + ], + "1": [ + [ + -20.659701724193837, + 9.085359461177298, + -2.8935855657541385, + -3.3232726308778266 + ] + ], + "2": [ + [ + -20.659701724193837, + 9.085359461177298, + -2.8935855657541385, + -3.3232726308778266 + ] + ] + } + }, + "ELEMENT_3641": { + "CAUCHY_STRESS_VECTOR": { + "0": [ + [ + -172.38519949494247, + -755.1665619500774, + -231.88794036125495, + 181.56731491362373 + ] + ], + "1": [ + [ + -172.38519949494247, + -755.1665619500774, + -231.88794036125495, + 181.56731491362373 + ] + ], + "2": [ + [ + -172.38519949494247, + -755.1665619500774, + -231.88794036125495, + 181.56731491362373 + ] + ] + } + }, + "ELEMENT_3852": { + "CAUCHY_STRESS_VECTOR": { + "0": [ + [ + -21.599907846567135, + -44.968859950094775, + -16.64219194916547, + 61.803223385616796 + ] + ], + "1": [ + [ + -21.599907846567135, + -44.968859950094775, + -16.64219194916547, + 61.803223385616796 + ] + ], + "2": [ + [ + -21.599907846567135, + -44.968859950094775, + -16.64219194916547, + 61.803223385616796 + ] + ] + } + }, + "ELEMENT_3860": { + "CAUCHY_STRESS_VECTOR": { + "0": [ + [ + 91.24543884438756, + 42.6169979915599, + 33.465609208986876, + -70.31002593489829 + ] + ], + "1": [ + [ + 91.24543884438756, + 42.6169979915599, + 33.465609208986876, + -70.31002593489829 + ] + ], + "2": [ + [ + 91.24543884438756, + 42.6169979915599, + 33.465609208986876, + -70.31002593489829 + ] + ] + } + }, + "ELEMENT_4240": { + "CAUCHY_STRESS_VECTOR": { + "0": [ + [ + 66.8586789797058, + -18.3890213880981, + 12.117414397901912, + 104.51853432723578 + ] + ], + "1": [ + [ + 66.8586789797058, + -18.3890213880981, + 12.117414397901912, + 104.51853432723578 + ] + ], + "2": [ + [ + 66.8586789797058, + -18.3890213880981, + 12.117414397901912, + 104.51853432723578 + ] + ] + } + }, + "ELEMENT_4386": { + "CAUCHY_STRESS_VECTOR": { + "0": [ + [ + 69.03725710252905, + 4.8393238012534034, + 18.469145225945617, + 116.53839456735425 + ] + ], + "1": [ + [ + 69.03725710252905, + 4.8393238012534034, + 18.469145225945617, + 116.53839456735425 + ] + ], + "2": [ + [ + 69.03725710252905, + 4.8393238012534034, + 18.469145225945617, + 116.53839456735425 + ] + ] + } + }, + "ELEMENT_4397": { + "CAUCHY_STRESS_VECTOR": { + "0": [ + [ + -75.62060323201155, + -7.023795273655992, + -20.66109962641689, + -0.3421400627704936 + ] + ], + "1": [ + [ + -75.62060323201155, + -7.023795273655992, + -20.66109962641689, + -0.3421400627704936 + ] + ], + "2": [ + [ + -75.62060323201155, + -7.023795273655992, + -20.66109962641689, + -0.3421400627704936 + ] + ] + } + }, + "ELEMENT_4435": { + "CAUCHY_STRESS_VECTOR": { + "0": [ + [ + -48.54993330750886, + 3.1112979787740915, + -11.359658832183685, + -5.611989125847389 + ] + ], + "1": [ + [ + -48.54993330750886, + 3.1112979787740915, + -11.359658832183685, + -5.611989125847389 + ] + ], + "2": [ + [ + -48.54993330750886, + 3.1112979787740915, + -11.359658832183685, + -5.611989125847389 + ] + ] + } + }, + "ELEMENT_4451": { + "CAUCHY_STRESS_VECTOR": { + "0": [ + [ + -12.576010584147754, + 11.779923174525992, + -0.1990218524054419, + -5.076687604293052 + ] + ], + "1": [ + [ + -12.576010584147754, + 11.779923174525992, + -0.1990218524054419, + -5.076687604293052 + ] + ], + "2": [ + [ + -12.576010584147754, + 11.779923174525992, + -0.1990218524054419, + -5.076687604293052 + ] + ] + } + }, + "ELEMENT_4513": { + "CAUCHY_STRESS_VECTOR": { + "0": [ + [ + 11.07269620690581, + -34.077991932269775, + -5.751323931340986, + 64.8729256103311 + ] + ], + "1": [ + [ + 11.07269620690581, + -34.077991932269775, + -5.751323931340986, + 64.8729256103311 + ] + ], + "2": [ + [ + 11.07269620690581, + -34.077991932269775, + -5.751323931340986, + 64.8729256103311 + ] + ] + } + }, + "ELEMENT_4618": { + "CAUCHY_STRESS_VECTOR": { + "0": [ + [ + 79.55999436517912, + 8.346902888803436, + 21.976724313495637, + 110.14708205240113 + ] + ], + "1": [ + [ + 79.55999436517912, + 8.346902888803436, + 21.976724313495637, + 110.14708205240113 + ] + ], + "2": [ + [ + 79.55999436517912, + 8.346902888803436, + 21.976724313495637, + 110.14708205240113 + ] + ] + } + }, + "ELEMENT_4661": { + "CAUCHY_STRESS_VECTOR": { + "0": [ + [ + -131.42147620128773, + -60.95952477330133, + -48.09525024364726, + 85.34902050059462 + ] + ], + "1": [ + [ + -131.42147620128773, + -60.95952477330133, + -48.09525024364726, + 85.34902050059462 + ] + ], + "2": [ + [ + -131.42147620128773, + -60.95952477330133, + -48.09525024364726, + 85.34902050059462 + ] + ] + } + }, + "ELEMENT_4699": { + "CAUCHY_STRESS_VECTOR": { + "0": [ + [ + -24.16642855417826, + -35.59925606705553, + -14.94142115530845, + 57.75099304222039 + ] + ], + "1": [ + [ + -24.16642855417826, + -35.59925606705553, + -14.94142115530845, + 57.75099304222039 + ] + ], + "2": [ + [ + -24.16642855417826, + -35.59925606705553, + -14.94142115530845, + 57.75099304222039 + ] + ] + } + }, + "ELEMENT_4729": { + "CAUCHY_STRESS_VECTOR": { + "0": [ + [ + 25.268359111027383, + 10.964985158058491, + 9.058336067271476, + -11.6740610290604 + ] + ], + "1": [ + [ + 25.268359111027383, + 10.964985158058491, + 9.058336067271476, + -11.6740610290604 + ] + ], + "2": [ + [ + 25.268359111027383, + 10.964985158058491, + 9.058336067271476, + -11.6740610290604 + ] + ] + } + }, + "ELEMENT_4743": { + "CAUCHY_STRESS_VECTOR": { + "0": [ + [ + -175.20858346988717, + -122.94098744490896, + -74.537392728699, + 142.33149023178265 + ] + ], + "1": [ + [ + -175.20858346988717, + -122.94098744490896, + -74.537392728699, + 142.33149023178265 + ] + ], + "2": [ + [ + -175.20858346988717, + -122.94098744490896, + -74.537392728699, + 142.33149023178265 + ] + ] + } + }, + "ELEMENT_4822": { + "CAUCHY_STRESS_VECTOR": { + "0": [ + [ + 99.34198891784453, + 50.6912329262004, + 37.50830546101122, + -8.244729119529367 + ] + ], + "1": [ + [ + 99.34198891784453, + 50.6912329262004, + 37.50830546101122, + -8.244729119529367 + ] + ], + "2": [ + [ + 99.34198891784453, + 50.6912329262004, + 37.50830546101122, + -8.244729119529367 + ] + ] + } + }, + "ELEMENT_4856": { + "CAUCHY_STRESS_VECTOR": { + "0": [ + [ + 56.623410218589456, + -2.277339188152803, + 13.586517757609169, + -38.96589357049067 + ] + ], + "1": [ + [ + 56.623410218589456, + -2.277339188152803, + 13.586517757609169, + -38.96589357049067 + ] + ], + "2": [ + [ + 56.623410218589456, + -2.277339188152803, + 13.586517757609169, + -38.96589357049067 + ] + ] + } + }, + "ELEMENT_4964": { + "CAUCHY_STRESS_VECTOR": { + "0": [ + [ + -93.509580129589, + -49.98387890699718, + -35.87336475914656, + 66.55508760880382 + ] + ], + "1": [ + [ + -93.509580129589, + -49.98387890699718, + -35.87336475914656, + 66.55508760880382 + ] + ], + "2": [ + [ + -93.509580129589, + -49.98387890699718, + -35.87336475914656, + 66.55508760880382 + ] + ] + } + }, + "ELEMENT_5073": { + "CAUCHY_STRESS_VECTOR": { + "0": [ + [ + -207.28662759607832, + -133.6336688203058, + -85.23007410409603, + 164.48286687499063 + ] + ], + "1": [ + [ + -207.28662759607832, + -133.6336688203058, + -85.23007410409603, + 164.48286687499063 + ] + ], + "2": [ + [ + -207.28662759607832, + -133.6336688203058, + -85.23007410409603, + 164.48286687499063 + ] + ] + } + }, + "ELEMENT_5274": { + "CAUCHY_STRESS_VECTOR": { + "0": [ + [ + 103.01108993840437, + 51.914266599720335, + 38.731339134531176, + -29.802176213388126 + ] + ], + "1": [ + [ + 103.01108993840437, + 51.914266599720335, + 38.731339134531176, + -29.802176213388126 + ] + ], + "2": [ + [ + 103.01108993840437, + 51.914266599720335, + 38.731339134531176, + -29.802176213388126 + ] + ] + } + }, + "ELEMENT_5319": { + "CAUCHY_STRESS_VECTOR": { + "0": [ + [ + 87.0068696326668, + 39.60088260218376, + 31.651938058712627, + 71.6828397477341 + ] + ], + "1": [ + [ + 87.0068696326668, + 39.60088260218376, + 31.651938058712627, + 71.6828397477341 + ] + ], + "2": [ + [ + 87.0068696326668, + 39.60088260218376, + 31.651938058712627, + 71.6828397477341 + ] + ] + } + }, + "ELEMENT_5386": { + "CAUCHY_STRESS_VECTOR": { + "0": [ + [ + 87.62383541742528, + 50.96979390416536, + 34.648407330397674, + 47.67620478095537 + ] + ], + "1": [ + [ + 87.62383541742528, + 50.96979390416536, + 34.648407330397674, + 47.67620478095537 + ] + ], + "2": [ + [ + 87.62383541742528, + 50.96979390416536, + 34.648407330397674, + 47.67620478095537 + ] + ] + } + }, + "ELEMENT_5391": { + "CAUCHY_STRESS_VECTOR": { + "0": [ + [ + 79.46347067347686, + 37.065784017581834, + 29.13231367276469, + 103.96810969330089 + ] + ], + "1": [ + [ + 79.46347067347686, + 37.065784017581834, + 29.13231367276469, + 103.96810969330089 + ] + ], + "2": [ + [ + 79.46347067347686, + 37.065784017581834, + 29.13231367276469, + 103.96810969330089 + ] + ] + } + }, + "ELEMENT_5450": { + "CAUCHY_STRESS_VECTOR": { + "0": [ + [ + -87.06842033522751, + -19.5895376198247, + -26.66448948876305, + 0.5452468524153782 + ] + ], + "1": [ + [ + -87.06842033522751, + -19.5895376198247, + -26.66448948876305, + 0.5452468524153782 + ] + ], + "2": [ + [ + -87.06842033522751, + -19.5895376198247, + -26.66448948876305, + 0.5452468524153782 + ] + ] + } + }, + "ELEMENT_5489": { + "CAUCHY_STRESS_VECTOR": { + "0": [ + [ + -89.59044037006585, + -13.693258151542846, + -25.82092463040217, + -0.06875314702789126 + ] + ], + "1": [ + [ + -89.59044037006585, + -13.693258151542846, + -25.82092463040217, + -0.06875314702789126 + ] + ], + "2": [ + [ + -89.59044037006585, + -13.693258151542846, + -25.82092463040217, + -0.06875314702789126 + ] + ] + } + }, + "ELEMENT_5547": { + "CAUCHY_STRESS_VECTOR": { + "0": [ + [ + -158.71012259486784, + -822.2354123322277, + -245.2363837317739, + 84.55024138885351 + ] + ], + "1": [ + [ + -158.71012259486784, + -822.2354123322277, + -245.2363837317739, + 84.55024138885351 + ] + ], + "2": [ + [ + -158.71012259486784, + -822.2354123322277, + -245.2363837317739, + 84.55024138885351 + ] + ] + } + }, + "ELEMENT_5575": { + "CAUCHY_STRESS_VECTOR": { + "0": [ + [ + -128.36019511294748, + -798.7344414987879, + -231.77365915293385, + 34.126667909927335 + ] + ], + "1": [ + [ + -128.36019511294748, + -798.7344414987879, + -231.77365915293385, + 34.126667909927335 + ] + ], + "2": [ + [ + -128.36019511294748, + -798.7344414987879, + -231.77365915293385, + 34.126667909927335 + ] + ] + } + }, + "ELEMENT_5842": { + "CAUCHY_STRESS_VECTOR": { + "0": [ + [ + -188.4439982179661, + -851.3119395403517, + -259.9389844395794, + 35.402781502129535 + ] + ], + "1": [ + [ + -188.4439982179661, + -851.3119395403517, + -259.9389844395794, + 35.402781502129535 + ] + ], + "2": [ + [ + -188.4439982179661, + -851.3119395403517, + -259.9389844395794, + 35.402781502129535 + ] + ] + } + } +} \ No newline at end of file diff --git a/applications/GeoMechanicsApplication/tests/test_dynamics.py b/applications/GeoMechanicsApplication/tests/test_dynamics.py index 36a5fe2e065c..26b3828fb8b4 100644 --- a/applications/GeoMechanicsApplication/tests/test_dynamics.py +++ b/applications/GeoMechanicsApplication/tests/test_dynamics.py @@ -5,6 +5,7 @@ import KratosMultiphysics.KratosUnittest as KratosUnittest import KratosMultiphysics.GeoMechanicsApplication as KratosGeo import test_helper +from strip_load_semi_analytical_solution import StripLoad class KratosGeoMechanicsDynamicsTests(KratosUnittest.TestCase): @@ -102,36 +103,87 @@ def test_load_on_block_2d_no_damping(self): self.assertVectorAlmostEqual(calculated_result[node][what], expected_result[node][what]) def test_constant_strip_load_2d(self): + """ + Tests a constant strip load on a 10m X 10m block. The block is loaded with a constant strip load of 1kN/m and + a length of 1m. + + The solution should roughly follow the semi-analytical solution presented in the following publication: + An Introduction to Soil Dynamics , Verruijt A., 2009, Delft University of Technology, Chapter 12.2 + + + """ + # set to true if the results should be checked with the analytical solution + CHECK_RESULTS = False test_name = 'test_constant_strip_load_2d' file_path = test_helper.get_file_path(os.path.join('.', test_name)) simulation = test_helper.run_kratos(file_path) - # get json output - json_process = simulation._GetListOfProcesses()[4] - - elements = json_process.sub_model_part.Elements - - centroids = [] - stresses = [] - x_coords = [] - for element in elements: - # get centroid - centroid = element.GetGeometry().Center() - x_coords.append(centroid.X) - # get element cauchy stress - element_stress = element.CalculateOnIntegrationPoints(Kratos.CAUCHY_STRESS_VECTOR, - json_process.sub_model_part.ProcessInfo) - vert_stress = test_helper.compute_mean_list([gauss_stress[1] for gauss_stress in element_stress]) - centroids.append(centroid) - stresses.append(vert_stress) - - import matplotlib.pyplot as plt - plt.plot(x_coords, stresses, 'o') - plt.show() - - a=1+1 + # get calculated results + with open(os.path.join(file_path, "json_output.json")) as fp: + calculated_result = json.load(fp) + + # get expected results + with open(os.path.join(file_path, "expected_json_output.json")) as fp: + expected_result = json.load(fp) + + # check if results are as expected + self.assertTrue(test_helper.are_dictionaries_almost_equal(expected_result, calculated_result)) + + # If this test is altered, results between the analytical solution and the calculated solution can be compared + # below + if CHECK_RESULTS: + + # get json output + json_process = simulation._GetListOfProcesses()[4] + + elements = json_process.sub_model_part.Elements + + calculated_vert_stresses = [] + analytical_vert_stresses = [] + + porosity = 0.0 + density_solid = 1020 + + line_load_length = 1 + load_value = -1000 + end_time = 1.0 + + analytical_solution = StripLoad(2.55e3 * 36, 0.25, (1 - porosity) * density_solid, load_value) + + x_coords = [] + for element in elements: + # get centroid + centroid = element.GetGeometry().Center() + x_coord = centroid.X + y_coord = centroid.Y + depth_check = 10 - y_coord + x_coords.append(centroid.X) + + vert_stress_analytic = analytical_solution.calculate_vertical_stress(x_coord, depth_check, end_time, line_load_length, load_value) + + analytical_vert_stresses.append(-vert_stress_analytic) + + # get element mean vertical cauchy stress + element_stress = element.CalculateOnIntegrationPoints(Kratos.CAUCHY_STRESS_VECTOR, + json_process.sub_model_part.ProcessInfo) + vert_stress = test_helper.compute_mean_list([gauss_stress[1] for gauss_stress in element_stress]) + + calculated_vert_stresses.append(vert_stress) + + # visualise results if matplotlib is installed + try: + import matplotlib.pyplot as plt + plt.plot(x_coords, analytical_vert_stresses, 'o', color="r") + plt.plot(x_coords, calculated_vert_stresses, 'o', color="b") + + plt.legend(["Analytical", "Calculated"]) + + plt.show() + + except ImportError: + print("Matplotlib not installed. Cannot visualise results") if __name__ == '__main__': diff --git a/applications/GeoMechanicsApplication/tests/test_helper.py b/applications/GeoMechanicsApplication/tests/test_helper.py index 5d28a9d55f4b..f4e7f1b8b793 100644 --- a/applications/GeoMechanicsApplication/tests/test_helper.py +++ b/applications/GeoMechanicsApplication/tests/test_helper.py @@ -1,3 +1,4 @@ +from typing import Dict, Any import sys,os import math @@ -419,6 +420,98 @@ def find_closest_index_greater_than_value(input_list, value): return None +def are_iterables_almost_equal(expected: (list, tuple, set), actual: (list, tuple, set), + abs_tolerance: float = 1e-7) -> bool: + """ + Checks whether two iterables are almost equal. + + Args: + - expected (list, tuple, set): Expected iterable. + - actual (list, tuple, set): Actual iterable. + + Returns: + - True if the iterables are almost equal, False otherwise. + + """ + # check if the value is a list, tuple or set and compare the values + if len(expected) != len(actual): + return False + for v_i, actual_i in zip(expected, actual): + if isinstance(v_i, dict): + # check if the value is a dictionary and recursively check the dictionary + if not are_dictionaries_almost_equal(v_i, actual_i): + return False + elif isinstance(v_i, str): + # check if the value is a string and compare the strings + if v_i != actual_i: + return False + elif isinstance(v_i, (list, tuple, set)): + # check if the value is a list, tuple or set and compare the values + if not are_iterables_almost_equal(v_i, actual_i): + return False + elif v_i is None: + # check if the value is None and compare the values + if actual_i is not None: + return False + elif isinstance(v_i, (float, int, complex)): + # The value is a number and compare the values + if not math.isclose(v_i, actual_i, abs_tol=abs_tolerance): + return False + else: + Exception(f"Unsupported type {type(v_i)}") + + return True + + +def are_dictionaries_almost_equal(expected: Dict[Any, Any], + actual: Dict[Any, Any], + abs_tolerance: float = 1e-7) -> bool: + """ + Checks whether two dictionaries are equal. + + Args: + - expected: Expected dictionary. + - actual: Actual dictionary. + + Returns: + - True if the dictionaries are equal, False otherwise. + + """ + + for k, v in expected.items(): + + # check if key is present in both dictionaries + if k not in actual: + return False + + # check if values are equal + if isinstance(v, dict): + # check if the value is a dictionary and recursively check the dictionary + if not are_dictionaries_almost_equal(v, actual[k]): + return False + elif isinstance(v, str): + # check if the value is a string and compare the strings + if v != actual[k]: + return False + elif isinstance(v, (list, tuple, set)): + # check if the value is a list, tuple or set and compare the values + if not are_iterables_almost_equal(v, actual[k], abs_tolerance): + return False + + elif v is None: + # check if the value is None and compare the values + if actual[k] is not None: + return False + elif isinstance(v, (float, int, complex)): + # The value is a number and compare the values + if not math.isclose(v, actual[k], abs_tol=abs_tolerance): + return False + else: + Exception(f"Unsupported type {type(v)}") + + # all checks passed + return True + class GiDOutputFileReader: def __init__(self): self._reset_internal_state() From 26af75bec69cdfb9123141d480e992582d0786aa Mon Sep 17 00:00:00 2001 From: aronnoordam Date: Wed, 24 Jul 2024 11:28:05 +0200 Subject: [PATCH 17/65] corrected strip load test --- .../ProjectParameters.json | 4 +- .../expected_json_output.json | 1488 ++++++++--------- ....mdpa => test_constant_strip_load_2d.mdpa} | 5 +- .../tests/test_dynamics.py | 1 - 4 files changed, 748 insertions(+), 750 deletions(-) rename applications/GeoMechanicsApplication/tests/test_constant_strip_load_2d/{test_lamb_stage_1.mdpa => test_constant_strip_load_2d.mdpa} (99%) diff --git a/applications/GeoMechanicsApplication/tests/test_constant_strip_load_2d/ProjectParameters.json b/applications/GeoMechanicsApplication/tests/test_constant_strip_load_2d/ProjectParameters.json index 76970722da89..8f39827c1f2f 100644 --- a/applications/GeoMechanicsApplication/tests/test_constant_strip_load_2d/ProjectParameters.json +++ b/applications/GeoMechanicsApplication/tests/test_constant_strip_load_2d/ProjectParameters.json @@ -1,6 +1,6 @@ { "problem_data": { - "problem_name": "test_lamb", + "problem_name": "test_constant_strip_load_2d", "start_time": 0.0, "end_time": 1, "echo_level": 1, @@ -13,7 +13,7 @@ "domain_size": 2, "model_import_settings": { "input_type": "mdpa", - "input_filename": "test_lamb_stage_1" + "input_filename": "test_constant_strip_load_2d" }, "material_import_settings": { "materials_filename": "MaterialParameters_stage_1.json" diff --git a/applications/GeoMechanicsApplication/tests/test_constant_strip_load_2d/expected_json_output.json b/applications/GeoMechanicsApplication/tests/test_constant_strip_load_2d/expected_json_output.json index 4a0816e8cd50..953fe978e2b6 100644 --- a/applications/GeoMechanicsApplication/tests/test_constant_strip_load_2d/expected_json_output.json +++ b/applications/GeoMechanicsApplication/tests/test_constant_strip_load_2d/expected_json_output.json @@ -6,26 +6,26 @@ "CAUCHY_STRESS_VECTOR": { "0": [ [ - -157.87040134430245, - -821.7017081138844, - -244.89302736454687, - 18.262866238969774 + -157.59295616547618, + -820.3196070612969, + -244.4781408066931, + 18.322571124574022 ] ], "1": [ [ - -157.87040134430245, - -821.7017081138844, - -244.89302736454687, - 18.262866238969774 + -157.59295616547618, + -820.3196070612969, + -244.4781408066931, + 18.322571124574022 ] ], "2": [ [ - -157.87040134430245, - -821.7017081138844, - -244.89302736454687, - 18.262866238969774 + -157.59295616547618, + -820.3196070612969, + -244.4781408066931, + 18.322571124574022 ] ] } @@ -34,26 +34,26 @@ "CAUCHY_STRESS_VECTOR": { "0": [ [ - 100.28972789535173, - 55.19867624204221, - 38.87210103434848, - 6.976322197473641 + 99.42593128482704, + 55.17431899919476, + 38.65006257100547, + 12.001105481011688 ] ], "1": [ [ - 100.28972789535173, - 55.19867624204221, - 38.87210103434848, - 6.976322197473641 + 99.42593128482704, + 55.17431899919476, + 38.65006257100547, + 12.001105481011688 ] ], "2": [ [ - 100.28972789535173, - 55.19867624204221, - 38.87210103434848, - 6.976322197473641 + 99.42593128482704, + 55.17431899919476, + 38.65006257100547, + 12.001105481011688 ] ] } @@ -62,26 +62,26 @@ "CAUCHY_STRESS_VECTOR": { "0": [ [ - -135.5142399375369, - -72.99662590178384, - -52.12771645983019, - 100.03120991671172 + -135.75880717450875, + -72.00080687668424, + -51.939903512798274, + 99.49321550758724 ] ], "1": [ [ - -135.5142399375369, - -72.99662590178384, - -52.12771645983019, - 100.03120991671172 + -135.75880717450875, + -72.00080687668424, + -51.939903512798274, + 99.49321550758724 ] ], "2": [ [ - -135.5142399375369, - -72.99662590178384, - -52.12771645983019, - 100.03120991671172 + -135.75880717450875, + -72.00080687668424, + -51.939903512798274, + 99.49321550758724 ] ] } @@ -90,26 +90,26 @@ "CAUCHY_STRESS_VECTOR": { "0": [ [ - 74.44549027356193, - -2.258295087995912, - 18.046798796391503, - -85.74233887964397 + 76.12201010442334, + -1.5414571071017318, + 18.645138249330415, + -88.08054566518595 ] ], "1": [ [ - 74.44549027356193, - -2.258295087995912, - 18.046798796391503, - -85.74233887964397 + 76.12201010442334, + -1.5414571071017318, + 18.645138249330415, + -88.08054566518595 ] ], "2": [ [ - 74.44549027356193, - -2.258295087995912, - 18.046798796391503, - -85.74233887964397 + 76.12201010442334, + -1.5414571071017318, + 18.645138249330415, + -88.08054566518595 ] ] } @@ -118,26 +118,26 @@ "CAUCHY_STRESS_VECTOR": { "0": [ [ - 103.17186774240571, - 51.42980682054385, - 38.65041864073739, - -28.299000666423556 + 104.7432681264863, + 51.3442161966246, + 39.02187108077773, + -26.897031846608566 ] ], "1": [ [ - 103.17186774240571, - 51.42980682054385, - 38.65041864073739, - -28.299000666423556 + 104.7432681264863, + 51.3442161966246, + 39.02187108077773, + -26.897031846608566 ] ], "2": [ [ - 103.17186774240571, - 51.42980682054385, - 38.65041864073739, - -28.299000666423556 + 104.7432681264863, + 51.3442161966246, + 39.02187108077773, + -26.897031846608566 ] ] } @@ -146,26 +146,26 @@ "CAUCHY_STRESS_VECTOR": { "0": [ [ - -94.64338360137303, - -48.70016057332975, - -35.83588604367568, - 73.56204358061368 + -94.76579409357528, + -48.544453919326585, + -35.827562003225474, + 73.0362775821201 ] ], "1": [ [ - -94.64338360137303, - -48.70016057332975, - -35.83588604367568, - 73.56204358061368 + -94.76579409357528, + -48.544453919326585, + -35.827562003225474, + 73.0362775821201 ] ], "2": [ [ - -94.64338360137303, - -48.70016057332975, - -35.83588604367568, - 73.56204358061368 + -94.76579409357528, + -48.544453919326585, + -35.827562003225474, + 73.0362775821201 ] ] } @@ -174,26 +174,26 @@ "CAUCHY_STRESS_VECTOR": { "0": [ [ - -173.4142568094205, - -85.62996485907838, - -64.76105541712474, - 117.14810478287592 + -173.5518178846023, + -84.59847711338206, + -64.53757374949609, + 116.3363295796321 ] ], "1": [ [ - -173.4142568094205, - -85.62996485907838, - -64.76105541712474, - 117.14810478287592 + -173.5518178846023, + -84.59847711338206, + -64.53757374949609, + 116.3363295796321 ] ], "2": [ [ - -173.4142568094205, - -85.62996485907838, - -64.76105541712474, - 117.14810478287592 + -173.5518178846023, + -84.59847711338206, + -64.53757374949609, + 116.3363295796321 ] ] } @@ -202,26 +202,26 @@ "CAUCHY_STRESS_VECTOR": { "0": [ [ - 13.366435026800136, - -40.7648597187801, - -6.849606172995, - 74.80000551563242 + 11.878116766303572, + -40.756859507311425, + -7.2196856852519655, + 72.89310105300598 ] ], "1": [ [ - 13.366435026800136, - -40.7648597187801, - -6.849606172995, - 74.80000551563242 + 11.878116766303572, + -40.756859507311425, + -7.2196856852519655, + 72.89310105300598 ] ], "2": [ [ - 13.366435026800136, - -40.7648597187801, - -6.849606172995, - 74.80000551563242 + 11.878116766303572, + -40.756859507311425, + -7.2196856852519655, + 72.89310105300598 ] ] } @@ -230,26 +230,26 @@ "CAUCHY_STRESS_VECTOR": { "0": [ [ - -86.41688070126314, - -19.372357741836584, - -26.44730961077493, - 0.8638354629799521 + -88.98929506249202, + -18.85405854825772, + -26.96083840268743, + 1.2111030529384252 ] ], "1": [ [ - -86.41688070126314, - -19.372357741836584, - -26.44730961077493, - 0.8638354629799521 + -88.98929506249202, + -18.85405854825772, + -26.96083840268743, + 1.2111030529384252 ] ], "2": [ [ - -86.41688070126314, - -19.372357741836584, - -26.44730961077493, - 0.8638354629799521 + -88.98929506249202, + -18.85405854825772, + -26.96083840268743, + 1.2111030529384252 ] ] } @@ -258,26 +258,26 @@ "CAUCHY_STRESS_VECTOR": { "0": [ [ - 43.598035813144506, - -30.687659456665365, - 3.2275940891198096, - 83.02410550805891 + 41.5508294413241, + -30.86595528230456, + 2.6712185397549066, + 81.042807513933 ] ], "1": [ [ - 43.598035813144506, - -30.687659456665365, - 3.2275940891198096, - 83.02410550805891 + 41.5508294413241, + -30.86595528230456, + 2.6712185397549066, + 81.042807513933 ] ], "2": [ [ - 43.598035813144506, - -30.687659456665365, - 3.2275940891198096, - 83.02410550805891 + 41.5508294413241, + -30.86595528230456, + 2.6712185397549066, + 81.042807513933 ] ] } @@ -286,26 +286,26 @@ "CAUCHY_STRESS_VECTOR": { "0": [ [ - -88.55264777120028, - -16.03480676327571, - -26.146863633618995, - -0.3692502305180021 + -91.27380583209849, + -14.847948140142805, + -26.530438493060327, + -0.10785985570267198 ] ], "1": [ [ - -88.55264777120028, - -16.03480676327571, - -26.146863633618995, - -0.3692502305180021 + -91.27380583209849, + -14.847948140142805, + -26.530438493060327, + -0.10785985570267198 ] ], "2": [ [ - -88.55264777120028, - -16.03480676327571, - -26.146863633618995, - -0.3692502305180021 + -91.27380583209849, + -14.847948140142805, + -26.530438493060327, + -0.10785985570267198 ] ] } @@ -314,26 +314,26 @@ "CAUCHY_STRESS_VECTOR": { "0": [ [ - -157.10415165407562, - -752.1038852278178, - -227.30200922047348, - 117.73356899338948 + -158.16182498977057, + -754.1893486594938, + -228.08779341231602, + 117.4015645563708 ] ], "1": [ [ - -157.10415165407562, - -752.1038852278178, - -227.30200922047348, - 117.73356899338948 + -158.16182498977057, + -754.1893486594938, + -228.08779341231602, + 117.4015645563708 ] ], "2": [ [ - -157.10415165407562, - -752.1038852278178, - -227.30200922047348, - 117.73356899338948 + -158.16182498977057, + -754.1893486594938, + -228.08779341231602, + 117.4015645563708 ] ] } @@ -342,26 +342,26 @@ "CAUCHY_STRESS_VECTOR": { "0": [ [ - 91.59949703321273, - 47.57234991747955, - 34.79296173767307, - -52.637528997648126 + 93.14241805036596, + 47.47726617125114, + 35.15492105540428, + -49.25097711237801 ] ], "1": [ [ - 91.59949703321273, - 47.57234991747955, - 34.79296173767307, - -52.637528997648126 + 93.14241805036596, + 47.47726617125114, + 35.15492105540428, + -49.25097711237801 ] ], "2": [ [ - 91.59949703321273, - 47.57234991747955, - 34.79296173767307, - -52.637528997648126 + 93.14241805036596, + 47.47726617125114, + 35.15492105540428, + -49.25097711237801 ] ] } @@ -370,26 +370,26 @@ "CAUCHY_STRESS_VECTOR": { "0": [ [ - -32.53714207376192, - 8.448895056689738, - -6.022061754268044, - -6.210249982421909 + -31.822059993779277, + 8.769921165515944, + -5.763034707065837, + -5.9304474098211815 ] ], "1": [ [ - -32.53714207376192, - 8.448895056689738, - -6.022061754268044, - -6.210249982421909 + -31.822059993779277, + 8.769921165515944, + -5.763034707065837, + -5.9304474098211815 ] ], "2": [ [ - -32.53714207376192, - 8.448895056689738, - -6.022061754268044, - -6.210249982421909 + -31.822059993779277, + 8.769921165515944, + -5.763034707065837, + -5.9304474098211815 ] ] } @@ -398,26 +398,26 @@ "CAUCHY_STRESS_VECTOR": { "0": [ [ - -198.70950521372907, - -392.3253857372903, - -147.75872273775485, - 248.83255267543814 + -198.84435707265874, + -392.1307933084171, + -147.74378759526897, + 248.84834424823882 ] ], "1": [ [ - -198.70950521372907, - -392.3253857372903, - -147.75872273775485, - 248.83255267543814 + -198.84435707265874, + -392.1307933084171, + -147.74378759526897, + 248.84834424823882 ] ], "2": [ [ - -198.70950521372907, - -392.3253857372903, - -147.75872273775485, - 248.83255267543814 + -198.84435707265874, + -392.1307933084171, + -147.74378759526897, + 248.84834424823882 ] ] } @@ -426,26 +426,26 @@ "CAUCHY_STRESS_VECTOR": { "0": [ [ - 8.947275370499398, - 5.525342654544158, - 3.618154506260888, - -16.4451007266552 + 11.452181235743975, + 4.5655239545482225, + 4.0044262975730485, + -15.605893095907174 ] ], "1": [ [ - 8.947275370499398, - 5.525342654544158, - 3.618154506260888, - -16.4451007266552 + 11.452181235743975, + 4.5655239545482225, + 4.0044262975730485, + -15.605893095907174 ] ], "2": [ [ - 8.947275370499398, - 5.525342654544158, - 3.618154506260888, - -16.4451007266552 + 11.452181235743975, + 4.5655239545482225, + 4.0044262975730485, + -15.605893095907174 ] ] } @@ -454,26 +454,26 @@ "CAUCHY_STRESS_VECTOR": { "0": [ [ - 34.119555687355344, - -9.778624031897511, - 6.085232913864459, - -21.030618966489023 + 37.56773340181717, + -11.107838041594132, + 6.6149738400557645, + -23.35170219264954 ] ], "1": [ [ - 34.119555687355344, - -9.778624031897511, - 6.085232913864459, - -21.030618966489023 + 37.56773340181717, + -11.107838041594132, + 6.6149738400557645, + -23.35170219264954 ] ], "2": [ [ - 34.119555687355344, - -9.778624031897511, - 6.085232913864459, - -21.030618966489023 + 37.56773340181717, + -11.107838041594132, + 6.6149738400557645, + -23.35170219264954 ] ] } @@ -482,26 +482,26 @@ "CAUCHY_STRESS_VECTOR": { "0": [ [ - 78.27256165166821, - 15.529157018117148, - 23.450429667446347, - -99.92386922100961 + 79.5010517627474, + 17.862773958045494, + 24.34095643019823, + -100.69045579278216 ] ], "1": [ [ - 78.27256165166821, - 15.529157018117148, - 23.450429667446347, - -99.92386922100961 + 79.5010517627474, + 17.862773958045494, + 24.34095643019823, + -100.69045579278216 ] ], "2": [ [ - 78.27256165166821, - 15.529157018117148, - 23.450429667446347, - -99.92386922100961 + 79.5010517627474, + 17.862773958045494, + 24.34095643019823, + -100.69045579278216 ] ] } @@ -510,26 +510,26 @@ "CAUCHY_STRESS_VECTOR": { "0": [ [ - 83.58162854050761, - 40.06239455693323, - 30.911005774360206, - -96.55332301708641 + 85.10108390378883, + 41.57615193676611, + 31.669308960138736, + -94.4788798384601 ] ], "1": [ [ - 83.58162854050761, - 40.06239455693323, - 30.911005774360206, - -96.55332301708641 + 85.10108390378883, + 41.57615193676611, + 31.669308960138736, + -94.4788798384601 ] ], "2": [ [ - 83.58162854050761, - 40.06239455693323, - 30.911005774360206, - -96.55332301708641 + 85.10108390378883, + 41.57615193676611, + 31.669308960138736, + -94.4788798384601 ] ] } @@ -538,26 +538,26 @@ "CAUCHY_STRESS_VECTOR": { "0": [ [ - 63.739006260769514, - -5.827123092260045, - 14.477970792127364, - -69.39751125577949 + 65.37369417178765, + -5.124229084646977, + 15.062366271785164, + -73.6911684498106 ] ], "1": [ [ - 63.739006260769514, - -5.827123092260045, - 14.477970792127364, - -69.39751125577949 + 65.37369417178765, + -5.124229084646977, + 15.062366271785164, + -73.6911684498106 ] ], "2": [ [ - 63.739006260769514, - -5.827123092260045, - 14.477970792127364, - -69.39751125577949 + 65.37369417178765, + -5.124229084646977, + 15.062366271785164, + -73.6911684498106 ] ] } @@ -566,26 +566,26 @@ "CAUCHY_STRESS_VECTOR": { "0": [ [ - 45.432958877842545, - -25.530928088719158, - 4.975507697280841, - 97.99575549352848 + 44.6016255490618, + -26.54932450167885, + 4.51307526184574, + 95.58624358577306 ] ], "1": [ [ - 45.432958877842545, - -25.530928088719158, - 4.975507697280841, - 97.99575549352848 + 44.6016255490618, + -26.54932450167885, + 4.51307526184574, + 95.58624358577306 ] ], "2": [ [ - 45.432958877842545, - -25.530928088719158, - 4.975507697280841, - 97.99575549352848 + 44.6016255490618, + -26.54932450167885, + 4.51307526184574, + 95.58624358577306 ] ] } @@ -594,26 +594,26 @@ "CAUCHY_STRESS_VECTOR": { "0": [ [ - -220.55488034515815, - -230.08539865086175, - -112.66006974900502, - 218.83401150262546 + -219.74620653172448, + -229.0435021973505, + -112.1974271822687, + 218.49289243447373 ] ], "1": [ [ - -220.55488034515815, - -230.08539865086175, - -112.66006974900502, - 218.83401150262546 + -219.74620653172448, + -229.0435021973505, + -112.1974271822687, + 218.49289243447373 ] ], "2": [ [ - -220.55488034515815, - -230.08539865086175, - -112.66006974900502, - 218.83401150262546 + -219.74620653172448, + -229.0435021973505, + -112.1974271822687, + 218.49289243447373 ] ] } @@ -622,26 +622,26 @@ "CAUCHY_STRESS_VECTOR": { "0": [ [ - -56.96251383766888, - -46.531284494885725, - -25.87344958313865, - 59.281743479078436 + -58.75562833801419, + -46.56359919043354, + -26.329806882111928, + 58.43659679192047 ] ], "1": [ [ - -56.96251383766888, - -46.531284494885725, - -25.87344958313865, - 59.281743479078436 + -58.75562833801419, + -46.56359919043354, + -26.329806882111928, + 58.43659679192047 ] ], "2": [ [ - -56.96251383766888, - -46.531284494885725, - -25.87344958313865, - 59.281743479078436 + -58.75562833801419, + -46.56359919043354, + -26.329806882111928, + 58.43659679192047 ] ] } @@ -650,26 +650,26 @@ "CAUCHY_STRESS_VECTOR": { "0": [ [ - -221.30209870908, - -399.8562502357408, - -155.28958723620522, - 252.60713304780109 + -222.35445422361332, + -399.9674923587352, + -155.580486645587, + 252.91373072152462 ] ], "1": [ [ - -221.30209870908, - -399.8562502357408, - -155.28958723620522, - 252.60713304780109 + -222.35445422361332, + -399.9674923587352, + -155.580486645587, + 252.91373072152462 ] ], "2": [ [ - -221.30209870908, - -399.8562502357408, - -155.28958723620522, - 252.60713304780109 + -222.35445422361332, + -399.9674923587352, + -155.580486645587, + 252.91373072152462 ] ] } @@ -678,26 +678,26 @@ "CAUCHY_STRESS_VECTOR": { "0": [ [ - -200.6958463038808, - -605.1327769062148, - -201.45715580252386, - 251.47096293106964 + -200.877908417051, + -604.9760525555797, + -201.46349024315762, + 251.4861729035732 ] ], "1": [ [ - -200.6958463038808, - -605.1327769062148, - -201.45715580252386, - 251.47096293106964 + -200.877908417051, + -604.9760525555797, + -201.46349024315762, + 251.4861729035732 ] ], "2": [ [ - -200.6958463038808, - -605.1327769062148, - -201.45715580252386, - 251.47096293106964 + -200.877908417051, + -604.9760525555797, + -201.46349024315762, + 251.4861729035732 ] ] } @@ -706,26 +706,26 @@ "CAUCHY_STRESS_VECTOR": { "0": [ [ - -84.15364731087715, - -22.327509759050905, - -26.62028926748202, - -0.4428429449234366 + -86.28639121336319, + -21.60498971780568, + -26.972845232792217, + -0.34941921273183096 ] ], "1": [ [ - -84.15364731087715, - -22.327509759050905, - -26.62028926748202, - -0.4428429449234366 + -86.28639121336319, + -21.60498971780568, + -26.972845232792217, + -0.34941921273183096 ] ], "2": [ [ - -84.15364731087715, - -22.327509759050905, - -26.62028926748202, - -0.4428429449234366 + -86.28639121336319, + -21.60498971780568, + -26.972845232792217, + -0.34941921273183096 ] ] } @@ -734,26 +734,26 @@ "CAUCHY_STRESS_VECTOR": { "0": [ [ - 82.23235975408473, - 16.849089718922656, - 24.770362368251853, - -97.08588520919434 + 82.6316758661908, + 18.90631532585997, + 25.384497798012696, + -96.73242745927514 ] ], "1": [ [ - 82.23235975408473, - 16.849089718922656, - 24.770362368251853, - -97.08588520919434 + 82.6316758661908, + 18.90631532585997, + 25.384497798012696, + -96.73242745927514 ] ], "2": [ [ - 82.23235975408473, - 16.849089718922656, - 24.770362368251853, - -97.08588520919434 + 82.6316758661908, + 18.90631532585997, + 25.384497798012696, + -96.73242745927514 ] ] } @@ -762,26 +762,26 @@ "CAUCHY_STRESS_VECTOR": { "0": [ [ - -85.65911490400266, - -12.382816329521782, - -24.510482808381113, - -1.4491111670774943 + -86.81725996993951, + -11.89601162704963, + -24.67831789924729, + -1.2085854409329735 ] ], "1": [ [ - -85.65911490400266, - -12.382816329521782, - -24.510482808381113, - -1.4491111670774943 + -86.81725996993951, + -11.89601162704963, + -24.67831789924729, + -1.2085854409329735 ] ], "2": [ [ - -85.65911490400266, - -12.382816329521782, - -24.510482808381113, - -1.4491111670774943 + -86.81725996993951, + -11.89601162704963, + -24.67831789924729, + -1.2085854409329735 ] ] } @@ -790,26 +790,26 @@ "CAUCHY_STRESS_VECTOR": { "0": [ [ - -210.9763137454291, - -226.89254311761863, - -109.46721421576198, - 200.59981486308052 + -212.08422736499983, + -226.48950914177541, + -109.64343412669386, + 200.24917281814461 ] ], "1": [ [ - -210.9763137454291, - -226.89254311761863, - -109.46721421576198, - 200.59981486308052 + -212.08422736499983, + -226.48950914177541, + -109.64343412669386, + 200.24917281814461 ] ], "2": [ [ - -210.9763137454291, - -226.89254311761863, - -109.46721421576198, - 200.59981486308052 + -212.08422736499983, + -226.48950914177541, + -109.64343412669386, + 200.24917281814461 ] ] } @@ -818,26 +818,26 @@ "CAUCHY_STRESS_VECTOR": { "0": [ [ - -168.9110071331214, - -594.5378305159618, - -190.86220941227072, - 210.0351716549862 + -168.91941044889347, + -594.3232198995269, + -190.81065758710497, + 210.32422403023483 ] ], "1": [ [ - -168.9110071331214, - -594.5378305159618, - -190.86220941227072, - 210.0351716549862 + -168.91941044889347, + -594.3232198995269, + -190.81065758710497, + 210.32422403023483 ] ], "2": [ [ - -168.9110071331214, - -594.5378305159618, - -190.86220941227072, - 210.0351716549862 + -168.91941044889347, + -594.3232198995269, + -190.81065758710497, + 210.32422403023483 ] ] } @@ -846,26 +846,26 @@ "CAUCHY_STRESS_VECTOR": { "0": [ [ - -58.83421188705572, - -38.425422826152705, - -24.314908678302114, - 60.22351293311793 + -59.53067054929502, + -37.99374465697866, + -24.381103801568432, + 59.87439546845684 ] ], "1": [ [ - -58.83421188705572, - -38.425422826152705, - -24.314908678302114, - 60.22351293311793 + -59.53067054929502, + -37.99374465697866, + -24.381103801568432, + 59.87439546845684 ] ], "2": [ [ - -58.83421188705572, - -38.425422826152705, - -24.314908678302114, - 60.22351293311793 + -59.53067054929502, + -37.99374465697866, + -24.381103801568432, + 59.87439546845684 ] ] } @@ -874,26 +874,26 @@ "CAUCHY_STRESS_VECTOR": { "0": [ [ - -8.522609439284132, - 10.100214753904249, - 0.394401328655024, - -15.311118366067351 + -6.353894946926269, + 9.78311070448135, + 0.8573039393887695, + -17.074642151262406 ] ], "1": [ [ - -8.522609439284132, - 10.100214753904249, - 0.394401328655024, - -15.311118366067351 + -6.353894946926269, + 9.78311070448135, + 0.8573039393887695, + -17.074642151262406 ] ], "2": [ [ - -8.522609439284132, - 10.100214753904249, - 0.394401328655024, - -15.311118366067351 + -6.353894946926269, + 9.78311070448135, + 0.8573039393887695, + -17.074642151262406 ] ] } @@ -902,26 +902,26 @@ "CAUCHY_STRESS_VECTOR": { "0": [ [ - -61.19932775441985, - -2.2167034477920886, - -15.854007800552989, - -0.9235403005455879 + -61.082670081245034, + -1.8658748754282477, + -15.737136239168322, + -1.5763436271557576 ] ], "1": [ [ - -61.19932775441985, - -2.2167034477920886, - -15.854007800552989, - -0.9235403005455879 + -61.082670081245034, + -1.8658748754282477, + -15.737136239168322, + -1.5763436271557576 ] ], "2": [ [ - -61.19932775441985, - -2.2167034477920886, - -15.854007800552989, - -0.9235403005455879 + -61.082670081245034, + -1.8658748754282477, + -15.737136239168322, + -1.5763436271557576 ] ] } @@ -930,26 +930,26 @@ "CAUCHY_STRESS_VECTOR": { "0": [ [ - 0.3433430074337096, - 13.055532236143534, - 3.349718810894318, - -17.99942319338191 + 2.691091103510426, + 12.798106054626913, + 3.8722992895343378, + -17.985262369741204 ] ], "1": [ [ - 0.3433430074337096, - 13.055532236143534, - 3.349718810894318, - -17.99942319338191 + 2.691091103510426, + 12.798106054626913, + 3.8722992895343378, + -17.985262369741204 ] ], "2": [ [ - 0.3433430074337096, - 13.055532236143534, - 3.349718810894318, - -17.99942319338191 + 2.691091103510426, + 12.798106054626913, + 3.8722992895343378, + -17.985262369741204 ] ] } @@ -958,26 +958,26 @@ "CAUCHY_STRESS_VECTOR": { "0": [ [ - -20.659701724193837, - 9.085359461177298, - -2.8935855657541385, - -3.3232726308778266 + -19.002517321936082, + 9.266446008698713, + -2.4340178283093463, + -2.8437485912344247 ] ], "1": [ [ - -20.659701724193837, - 9.085359461177298, - -2.8935855657541385, - -3.3232726308778266 + -19.002517321936082, + 9.266446008698713, + -2.4340178283093463, + -2.8437485912344247 ] ], "2": [ [ - -20.659701724193837, - 9.085359461177298, - -2.8935855657541385, - -3.3232726308778266 + -19.002517321936082, + 9.266446008698713, + -2.4340178283093463, + -2.8437485912344247 ] ] } @@ -986,26 +986,26 @@ "CAUCHY_STRESS_VECTOR": { "0": [ [ - -172.38519949494247, - -755.1665619500774, - -231.88794036125495, - 181.56731491362373 + -174.01519069698782, + -757.444126120879, + -232.8648292044665, + 181.1912546420462 ] ], "1": [ [ - -172.38519949494247, - -755.1665619500774, - -231.88794036125495, - 181.56731491362373 + -174.01519069698782, + -757.444126120879, + -232.8648292044665, + 181.1912546420462 ] ], "2": [ [ - -172.38519949494247, - -755.1665619500774, - -231.88794036125495, - 181.56731491362373 + -174.01519069698782, + -757.444126120879, + -232.8648292044665, + 181.1912546420462 ] ] } @@ -1014,26 +1014,26 @@ "CAUCHY_STRESS_VECTOR": { "0": [ [ - -21.599907846567135, - -44.968859950094775, - -16.64219194916547, - 61.803223385616796 + -23.989955184354017, + -45.14117812527594, + -17.28278332740749, + 60.45214444521586 ] ], "1": [ [ - -21.599907846567135, - -44.968859950094775, - -16.64219194916547, - 61.803223385616796 + -23.989955184354017, + -45.14117812527594, + -17.28278332740749, + 60.45214444521586 ] ], "2": [ [ - -21.599907846567135, - -44.968859950094775, - -16.64219194916547, - 61.803223385616796 + -23.989955184354017, + -45.14117812527594, + -17.28278332740749, + 60.45214444521586 ] ] } @@ -1042,26 +1042,26 @@ "CAUCHY_STRESS_VECTOR": { "0": [ [ - 91.24543884438756, - 42.6169979915599, - 33.465609208986876, - -70.31002593489829 + 91.66341688260738, + 43.76359626303897, + 33.8567532864116, + -65.95075735391602 ] ], "1": [ [ - 91.24543884438756, - 42.6169979915599, - 33.465609208986876, - -70.31002593489829 + 91.66341688260738, + 43.76359626303897, + 33.8567532864116, + -65.95075735391602 ] ], "2": [ [ - 91.24543884438756, - 42.6169979915599, - 33.465609208986876, - -70.31002593489829 + 91.66341688260738, + 43.76359626303897, + 33.8567532864116, + -65.95075735391602 ] ] } @@ -1070,26 +1070,26 @@ "CAUCHY_STRESS_VECTOR": { "0": [ [ - 66.8586789797058, - -18.3890213880981, - 12.117414397901912, - 104.51853432723578 + 65.58317707605605, + -19.555473992680803, + 11.506925770843795, + 102.74515417501345 ] ], "1": [ [ - 66.8586789797058, - -18.3890213880981, - 12.117414397901912, - 104.51853432723578 + 65.58317707605605, + -19.555473992680803, + 11.506925770843795, + 102.74515417501345 ] ], "2": [ [ - 66.8586789797058, - -18.3890213880981, - 12.117414397901912, - 104.51853432723578 + 65.58317707605605, + -19.555473992680803, + 11.506925770843795, + 102.74515417501345 ] ] } @@ -1098,26 +1098,26 @@ "CAUCHY_STRESS_VECTOR": { "0": [ [ - 69.03725710252905, - 4.8393238012534034, - 18.469145225945617, - 116.53839456735425 + 68.6921514364289, + 2.9081549643393028, + 17.90007660019203, + 115.46354726641437 ] ], "1": [ [ - 69.03725710252905, - 4.8393238012534034, - 18.469145225945617, - 116.53839456735425 + 68.6921514364289, + 2.9081549643393028, + 17.90007660019203, + 115.46354726641437 ] ], "2": [ [ - 69.03725710252905, - 4.8393238012534034, - 18.469145225945617, - 116.53839456735425 + 68.6921514364289, + 2.9081549643393028, + 17.90007660019203, + 115.46354726641437 ] ] } @@ -1126,26 +1126,26 @@ "CAUCHY_STRESS_VECTOR": { "0": [ [ - -75.62060323201155, - -7.023795273655992, - -20.66109962641689, - -0.3421400627704936 + -74.52635561864778, + -6.347103387895829, + -20.218364751635903, + -0.16242408622421695 ] ], "1": [ [ - -75.62060323201155, - -7.023795273655992, - -20.66109962641689, - -0.3421400627704936 + -74.52635561864778, + -6.347103387895829, + -20.218364751635903, + -0.16242408622421695 ] ], "2": [ [ - -75.62060323201155, - -7.023795273655992, - -20.66109962641689, - -0.3421400627704936 + -74.52635561864778, + -6.347103387895829, + -20.218364751635903, + -0.16242408622421695 ] ] } @@ -1154,26 +1154,26 @@ "CAUCHY_STRESS_VECTOR": { "0": [ [ - -48.54993330750886, - 3.1112979787740915, - -11.359658832183685, - -5.611989125847389 + -49.685610817602644, + 2.81540422424149, + -11.717551648340288, + -6.541226062844556 ] ], "1": [ [ - -48.54993330750886, - 3.1112979787740915, - -11.359658832183685, - -5.611989125847389 + -49.685610817602644, + 2.81540422424149, + -11.717551648340288, + -6.541226062844556 ] ], "2": [ [ - -48.54993330750886, - 3.1112979787740915, - -11.359658832183685, - -5.611989125847389 + -49.685610817602644, + 2.81540422424149, + -11.717551648340288, + -6.541226062844556 ] ] } @@ -1182,26 +1182,26 @@ "CAUCHY_STRESS_VECTOR": { "0": [ [ - -12.576010584147754, - 11.779923174525992, - -0.1990218524054419, - -5.076687604293052 + -11.054305441666896, + 11.915849968788452, + 0.21538613178039268, + -6.396567522643307 ] ], "1": [ [ - -12.576010584147754, - 11.779923174525992, - -0.1990218524054419, - -5.076687604293052 + -11.054305441666896, + 11.915849968788452, + 0.21538613178039268, + -6.396567522643307 ] ], "2": [ [ - -12.576010584147754, - 11.779923174525992, - -0.1990218524054419, - -5.076687604293052 + -11.054305441666896, + 11.915849968788452, + 0.21538613178039268, + -6.396567522643307 ] ] } @@ -1210,26 +1210,26 @@ "CAUCHY_STRESS_VECTOR": { "0": [ [ - 11.07269620690581, - -34.077991932269775, - -5.751323931340986, - 64.8729256103311 + 9.553809721167605, + -33.95992315676945, + -6.101528358900446, + 63.39675618568681 ] ], "1": [ [ - 11.07269620690581, - -34.077991932269775, - -5.751323931340986, - 64.8729256103311 + 9.553809721167605, + -33.95992315676945, + -6.101528358900446, + 63.39675618568681 ] ], "2": [ [ - 11.07269620690581, - -34.077991932269775, - -5.751323931340986, - 64.8729256103311 + 9.553809721167605, + -33.95992315676945, + -6.101528358900446, + 63.39675618568681 ] ] } @@ -1238,26 +1238,26 @@ "CAUCHY_STRESS_VECTOR": { "0": [ [ - 79.55999436517912, - 8.346902888803436, - 21.976724313495637, - 110.14708205240113 + 79.7576689910849, + 6.596660815891313, + 21.588582451744045, + 110.74103521136081 ] ], "1": [ [ - 79.55999436517912, - 8.346902888803436, - 21.976724313495637, - 110.14708205240113 + 79.7576689910849, + 6.596660815891313, + 21.588582451744045, + 110.74103521136081 ] ], "2": [ [ - 79.55999436517912, - 8.346902888803436, - 21.976724313495637, - 110.14708205240113 + 79.7576689910849, + 6.596660815891313, + 21.588582451744045, + 110.74103521136081 ] ] } @@ -1266,26 +1266,26 @@ "CAUCHY_STRESS_VECTOR": { "0": [ [ - -131.42147620128773, - -60.95952477330133, - -48.09525024364726, - 85.34902050059462 + -132.7874865846148, + -61.21835141633974, + -48.50145950023864, + 85.02278496211115 ] ], "1": [ [ - -131.42147620128773, - -60.95952477330133, - -48.09525024364726, - 85.34902050059462 + -132.7874865846148, + -61.21835141633974, + -48.50145950023864, + 85.02278496211115 ] ], "2": [ [ - -131.42147620128773, - -60.95952477330133, - -48.09525024364726, - 85.34902050059462 + -132.7874865846148, + -61.21835141633974, + -48.50145950023864, + 85.02278496211115 ] ] } @@ -1294,26 +1294,26 @@ "CAUCHY_STRESS_VECTOR": { "0": [ [ - -24.16642855417826, - -35.59925606705553, - -14.94142115530845, - 57.75099304222039 + -24.80146440619629, + -35.245544546494244, + -15.011752238172647, + 56.87206546421634 ] ], "1": [ [ - -24.16642855417826, - -35.59925606705553, - -14.94142115530845, - 57.75099304222039 + -24.80146440619629, + -35.245544546494244, + -15.011752238172647, + 56.87206546421634 ] ], "2": [ [ - -24.16642855417826, - -35.59925606705553, - -14.94142115530845, - 57.75099304222039 + -24.80146440619629, + -35.245544546494244, + -15.011752238172647, + 56.87206546421634 ] ] } @@ -1322,26 +1322,26 @@ "CAUCHY_STRESS_VECTOR": { "0": [ [ - 25.268359111027383, - 10.964985158058491, - 9.058336067271476, - -11.6740610290604 + 28.189867249389945, + 10.144150626747567, + 9.583504469034384, + -11.609863395733607 ] ], "1": [ [ - 25.268359111027383, - 10.964985158058491, - 9.058336067271476, - -11.6740610290604 + 28.189867249389945, + 10.144150626747567, + 9.583504469034384, + -11.609863395733607 ] ], "2": [ [ - 25.268359111027383, - 10.964985158058491, - 9.058336067271476, - -11.6740610290604 + 28.189867249389945, + 10.144150626747567, + 9.583504469034384, + -11.609863395733607 ] ] } @@ -1350,26 +1350,26 @@ "CAUCHY_STRESS_VECTOR": { "0": [ [ - -175.20858346988717, - -122.94098744490896, - -74.537392728699, - 142.33149023178265 + -175.99527778224802, + -123.03773256673975, + -74.75825258724696, + 142.4956851292617 ] ], "1": [ [ - -175.20858346988717, - -122.94098744490896, - -74.537392728699, - 142.33149023178265 + -175.99527778224802, + -123.03773256673975, + -74.75825258724696, + 142.4956851292617 ] ], "2": [ [ - -175.20858346988717, - -122.94098744490896, - -74.537392728699, - 142.33149023178265 + -175.99527778224802, + -123.03773256673975, + -74.75825258724696, + 142.4956851292617 ] ] } @@ -1378,26 +1378,26 @@ "CAUCHY_STRESS_VECTOR": { "0": [ [ - 99.34198891784453, - 50.6912329262004, - 37.50830546101122, - -8.244729119529367 + 99.80086723820511, + 51.34398497047475, + 37.78621305216996, + -5.6029785491240744 ] ], "1": [ [ - 99.34198891784453, - 50.6912329262004, - 37.50830546101122, - -8.244729119529367 + 99.80086723820511, + 51.34398497047475, + 37.78621305216996, + -5.6029785491240744 ] ], "2": [ [ - 99.34198891784453, - 50.6912329262004, - 37.50830546101122, - -8.244729119529367 + 99.80086723820511, + 51.34398497047475, + 37.78621305216996, + -5.6029785491240744 ] ] } @@ -1406,26 +1406,26 @@ "CAUCHY_STRESS_VECTOR": { "0": [ [ - 56.623410218589456, - -2.277339188152803, - 13.586517757609169, - -38.96589357049067 + 60.12938710047109, + -3.5872868087095053, + 14.135525072940391, + -43.47451693391926 ] ], "1": [ [ - 56.623410218589456, - -2.277339188152803, - 13.586517757609169, - -38.96589357049067 + 60.12938710047109, + -3.5872868087095053, + 14.135525072940391, + -43.47451693391926 ] ], "2": [ [ - 56.623410218589456, - -2.277339188152803, - 13.586517757609169, - -38.96589357049067 + 60.12938710047109, + -3.5872868087095053, + 14.135525072940391, + -43.47451693391926 ] ] } @@ -1434,26 +1434,26 @@ "CAUCHY_STRESS_VECTOR": { "0": [ [ - -93.509580129589, - -49.98387890699718, - -35.87336475914656, - 66.55508760880382 + -95.24708585143156, + -49.89921642435748, + -36.28657556894727, + 66.20939820517778 ] ], "1": [ [ - -93.509580129589, - -49.98387890699718, - -35.87336475914656, - 66.55508760880382 + -95.24708585143156, + -49.89921642435748, + -36.28657556894727, + 66.20939820517778 ] ], "2": [ [ - -93.509580129589, - -49.98387890699718, - -35.87336475914656, - 66.55508760880382 + -95.24708585143156, + -49.89921642435748, + -36.28657556894727, + 66.20939820517778 ] ] } @@ -1462,26 +1462,26 @@ "CAUCHY_STRESS_VECTOR": { "0": [ [ - -207.28662759607832, - -133.6336688203058, - -85.23007410409603, - 164.48286687499063 + -207.1854074922598, + -133.43444247007696, + -85.15496249058423, + 164.53089036417856 ] ], "1": [ [ - -207.28662759607832, - -133.6336688203058, - -85.23007410409603, - 164.48286687499063 + -207.1854074922598, + -133.43444247007696, + -85.15496249058423, + 164.53089036417856 ] ], "2": [ [ - -207.28662759607832, - -133.6336688203058, - -85.23007410409603, - 164.48286687499063 + -207.1854074922598, + -133.43444247007696, + -85.15496249058423, + 164.53089036417856 ] ] } @@ -1490,26 +1490,26 @@ "CAUCHY_STRESS_VECTOR": { "0": [ [ - 103.01108993840437, - 51.914266599720335, - 38.731339134531176, - -29.802176213388126 + 102.52730693364379, + 52.25279820228767, + 38.69502628398286, + -28.83865995046469 ] ], "1": [ [ - 103.01108993840437, - 51.914266599720335, - 38.731339134531176, - -29.802176213388126 + 102.52730693364379, + 52.25279820228767, + 38.69502628398286, + -28.83865995046469 ] ], "2": [ [ - 103.01108993840437, - 51.914266599720335, - 38.731339134531176, - -29.802176213388126 + 102.52730693364379, + 52.25279820228767, + 38.69502628398286, + -28.83865995046469 ] ] } @@ -1518,26 +1518,26 @@ "CAUCHY_STRESS_VECTOR": { "0": [ [ - 87.0068696326668, - 39.60088260218376, - 31.651938058712627, - 71.6828397477341 + 87.26420787306995, + 37.43668148031345, + 31.175222338345847, + 76.54171239771726 ] ], "1": [ [ - 87.0068696326668, - 39.60088260218376, - 31.651938058712627, - 71.6828397477341 + 87.26420787306995, + 37.43668148031345, + 31.175222338345847, + 76.54171239771726 ] ], "2": [ [ - 87.0068696326668, - 39.60088260218376, - 31.651938058712627, - 71.6828397477341 + 87.26420787306995, + 37.43668148031345, + 31.175222338345847, + 76.54171239771726 ] ] } @@ -1546,26 +1546,26 @@ "CAUCHY_STRESS_VECTOR": { "0": [ [ - 87.62383541742528, - 50.96979390416536, - 34.648407330397674, - 47.67620478095537 + 86.32214697674448, + 50.79939510443319, + 34.28038552029442, + 53.157597236940504 ] ], "1": [ [ - 87.62383541742528, - 50.96979390416536, - 34.648407330397674, - 47.67620478095537 + 86.32214697674448, + 50.79939510443319, + 34.28038552029442, + 53.157597236940504 ] ], "2": [ [ - 87.62383541742528, - 50.96979390416536, - 34.648407330397674, - 47.67620478095537 + 86.32214697674448, + 50.79939510443319, + 34.28038552029442, + 53.157597236940504 ] ] } @@ -1574,26 +1574,26 @@ "CAUCHY_STRESS_VECTOR": { "0": [ [ - 79.46347067347686, - 37.065784017581834, - 29.13231367276469, - 103.96810969330089 + 78.59608831305887, + 34.528001191846464, + 28.281022376226346, + 106.75350201639202 ] ], "1": [ [ - 79.46347067347686, - 37.065784017581834, - 29.13231367276469, - 103.96810969330089 + 78.59608831305887, + 34.528001191846464, + 28.281022376226346, + 106.75350201639202 ] ], "2": [ [ - 79.46347067347686, - 37.065784017581834, - 29.13231367276469, - 103.96810969330089 + 78.59608831305887, + 34.528001191846464, + 28.281022376226346, + 106.75350201639202 ] ] } @@ -1602,26 +1602,26 @@ "CAUCHY_STRESS_VECTOR": { "0": [ [ - -87.06842033522751, - -19.5895376198247, - -26.66448948876305, - 0.5452468524153782 + -88.71293012927595, + -18.761936903852362, + -26.868716758282066, + 0.6489510491644237 ] ], "1": [ [ - -87.06842033522751, - -19.5895376198247, - -26.66448948876305, - 0.5452468524153782 + -88.71293012927595, + -18.761936903852362, + -26.868716758282066, + 0.6489510491644237 ] ], "2": [ [ - -87.06842033522751, - -19.5895376198247, - -26.66448948876305, - 0.5452468524153782 + -88.71293012927595, + -18.761936903852362, + -26.868716758282066, + 0.6489510491644237 ] ] } @@ -1630,26 +1630,26 @@ "CAUCHY_STRESS_VECTOR": { "0": [ [ - -89.59044037006585, - -13.693258151542846, - -25.82092463040217, - -0.06875314702789126 + -91.70863627052083, + -13.52647039391006, + -26.30877666610772, + -0.33364054599392695 ] ], "1": [ [ - -89.59044037006585, - -13.693258151542846, - -25.82092463040217, - -0.06875314702789126 + -91.70863627052083, + -13.52647039391006, + -26.30877666610772, + -0.33364054599392695 ] ], "2": [ [ - -89.59044037006585, - -13.693258151542846, - -25.82092463040217, - -0.06875314702789126 + -91.70863627052083, + -13.52647039391006, + -26.30877666610772, + -0.33364054599392695 ] ] } @@ -1658,26 +1658,26 @@ "CAUCHY_STRESS_VECTOR": { "0": [ [ - -158.71012259486784, - -822.2354123322277, - -245.2363837317739, - 84.55024138885351 + -158.1181555407983, + -820.7504646634815, + -244.71715505106968, + 85.13059286304686 ] ], "1": [ [ - -158.71012259486784, - -822.2354123322277, - -245.2363837317739, - 84.55024138885351 + -158.1181555407983, + -820.7504646634815, + -244.71715505106968, + 85.13059286304686 ] ], "2": [ [ - -158.71012259486784, - -822.2354123322277, - -245.2363837317739, - 84.55024138885351 + -158.1181555407983, + -820.7504646634815, + -244.71715505106968, + 85.13059286304686 ] ] } @@ -1686,26 +1686,26 @@ "CAUCHY_STRESS_VECTOR": { "0": [ [ - -128.36019511294748, - -798.7344414987879, - -231.77365915293385, - 34.126667909927335 + -129.18840067224036, + -799.8077267363923, + -232.24903185215805, + 33.51400108335978 ] ], "1": [ [ - -128.36019511294748, - -798.7344414987879, - -231.77365915293385, - 34.126667909927335 + -129.18840067224036, + -799.8077267363923, + -232.24903185215805, + 33.51400108335978 ] ], "2": [ [ - -128.36019511294748, - -798.7344414987879, - -231.77365915293385, - 34.126667909927335 + -129.18840067224036, + -799.8077267363923, + -232.24903185215805, + 33.51400108335978 ] ] } @@ -1714,26 +1714,26 @@ "CAUCHY_STRESS_VECTOR": { "0": [ [ - -188.4439982179661, - -851.3119395403517, - -259.9389844395794, - 35.402781502129535 + -187.7537735732015, + -849.5076929726495, + -259.31536663646267, + 35.23050923226383 ] ], "1": [ [ - -188.4439982179661, - -851.3119395403517, - -259.9389844395794, - 35.402781502129535 + -187.7537735732015, + -849.5076929726495, + -259.31536663646267, + 35.23050923226383 ] ], "2": [ [ - -188.4439982179661, - -851.3119395403517, - -259.9389844395794, - 35.402781502129535 + -187.7537735732015, + -849.5076929726495, + -259.31536663646267, + 35.23050923226383 ] ] } diff --git a/applications/GeoMechanicsApplication/tests/test_constant_strip_load_2d/test_lamb_stage_1.mdpa b/applications/GeoMechanicsApplication/tests/test_constant_strip_load_2d/test_constant_strip_load_2d.mdpa similarity index 99% rename from applications/GeoMechanicsApplication/tests/test_constant_strip_load_2d/test_lamb_stage_1.mdpa rename to applications/GeoMechanicsApplication/tests/test_constant_strip_load_2d/test_constant_strip_load_2d.mdpa index b20f904731cc..99a670a3049d 100644 --- a/applications/GeoMechanicsApplication/tests/test_constant_strip_load_2d/test_lamb_stage_1.mdpa +++ b/applications/GeoMechanicsApplication/tests/test_constant_strip_load_2d/test_constant_strip_load_2d.mdpa @@ -5,9 +5,8 @@ End Properties Begin Table 1 TIME VALUE 0.0000 0.0000 - 0.0200 -1000.0000 - 0.1100 -1000.0000 - 0.1500 -1000.0000 + 0.0100 -1000.0000 + 1.0 -1000.0000 End Table diff --git a/applications/GeoMechanicsApplication/tests/test_dynamics.py b/applications/GeoMechanicsApplication/tests/test_dynamics.py index 26b3828fb8b4..6942f54c8513 100644 --- a/applications/GeoMechanicsApplication/tests/test_dynamics.py +++ b/applications/GeoMechanicsApplication/tests/test_dynamics.py @@ -1,6 +1,5 @@ import os import json - import KratosMultiphysics as Kratos import KratosMultiphysics.KratosUnittest as KratosUnittest import KratosMultiphysics.GeoMechanicsApplication as KratosGeo From c55d77dbdebb9d1ccdaf7948df1739cc6da32033 Mon Sep 17 00:00:00 2001 From: aronnoordam Date: Wed, 24 Jul 2024 13:24:28 +0200 Subject: [PATCH 18/65] made strip load test more general --- .../tests/test_dynamics.py | 50 ++++++++++++------- 1 file changed, 33 insertions(+), 17 deletions(-) diff --git a/applications/GeoMechanicsApplication/tests/test_dynamics.py b/applications/GeoMechanicsApplication/tests/test_dynamics.py index 6942f54c8513..7427a4c3a308 100644 --- a/applications/GeoMechanicsApplication/tests/test_dynamics.py +++ b/applications/GeoMechanicsApplication/tests/test_dynamics.py @@ -1,8 +1,14 @@ import os import json + +import sys +sys.path.append(r"D:\software_development\Kratos2\bin\Release") +sys.path.append(r"D:\software_development\Kratos2\bin\Release\libs") + import KratosMultiphysics as Kratos import KratosMultiphysics.KratosUnittest as KratosUnittest import KratosMultiphysics.GeoMechanicsApplication as KratosGeo +import KratosMultiphysics.StructuralMechanicsApplication as KratosStruct import test_helper from strip_load_semi_analytical_solution import StripLoad @@ -112,7 +118,7 @@ def test_constant_strip_load_2d(self): """ # set to true if the results should be checked with the analytical solution - CHECK_RESULTS = False + CHECK_RESULTS = True test_name = 'test_constant_strip_load_2d' file_path = test_helper.get_file_path(os.path.join('.', test_name)) @@ -133,40 +139,50 @@ def test_constant_strip_load_2d(self): # If this test is altered, results between the analytical solution and the calculated solution can be compared # below if CHECK_RESULTS: + # get properties from material file as not all variables are registered in python + with open(os.path.join(file_path, "MaterialParameters_stage_1.json")) as fp: + material_parameters = json.load(fp) - # get json output - json_process = simulation._GetListOfProcesses()[4] - - elements = json_process.sub_model_part.Elements - - calculated_vert_stresses = [] - analytical_vert_stresses = [] + material_variables = material_parameters["properties"]["Material"]["Variables"] + process_info = simulation.model.GetModelPart('PorousDomain.porous_computational_model_part').ProcessInfo - porosity = 0.0 - density_solid = 1020 + top_surface = 10.0 # follows from the mesh + line_load_length = 1.0 # follows from the mesh + load_value = -1000.0 # follows from table in the mdpa file + end_time = process_info.GetValue(Kratos.TIME) - line_load_length = 1 - load_value = -1000 - end_time = 1.0 + # initialise semi-analytical solution + analytical_solution = StripLoad(material_variables["YOUNG_MODULUS"], + material_variables["POISSON_RATIO"], + (1 - material_variables["POROSITY"]) * material_variables["DENSITY_SOLID"], + load_value) - analytical_solution = StripLoad(2.55e3 * 36, 0.25, (1 - porosity) * density_solid, load_value) + # get calculated json output + json_model_part = simulation.model.GetModelPart('PorousDomain.json_output') + elements = json_model_part.Elements x_coords = [] + calculated_vert_stresses = [] + analytical_vert_stresses = [] for element in elements: # get centroid centroid = element.GetGeometry().Center() x_coord = centroid.X y_coord = centroid.Y - depth_check = 10 - y_coord + depth_check = top_surface - y_coord x_coords.append(centroid.X) - vert_stress_analytic = analytical_solution.calculate_vertical_stress(x_coord, depth_check, end_time, line_load_length, load_value) + vert_stress_analytic = analytical_solution.calculate_vertical_stress(x_coord, + depth_check, + end_time, + line_load_length, + load_value) analytical_vert_stresses.append(-vert_stress_analytic) # get element mean vertical cauchy stress element_stress = element.CalculateOnIntegrationPoints(Kratos.CAUCHY_STRESS_VECTOR, - json_process.sub_model_part.ProcessInfo) + json_model_part.ProcessInfo) vert_stress = test_helper.compute_mean_list([gauss_stress[1] for gauss_stress in element_stress]) calculated_vert_stresses.append(vert_stress) From f0b1565ab82968f463f1620dcfe4bc831838eb93 Mon Sep 17 00:00:00 2001 From: aronnoordam Date: Wed, 24 Jul 2024 13:43:55 +0200 Subject: [PATCH 19/65] moved strip load test --- .../tests/test_GeoMechanicsApplication.py | 4 +- .../tests/test_dynamics.py | 100 +--------------- .../tests/test_dynamics_long.py | 107 ++++++++++++++++++ 3 files changed, 111 insertions(+), 100 deletions(-) create mode 100644 applications/GeoMechanicsApplication/tests/test_dynamics_long.py diff --git a/applications/GeoMechanicsApplication/tests/test_GeoMechanicsApplication.py b/applications/GeoMechanicsApplication/tests/test_GeoMechanicsApplication.py index 895972338444..870c118d8c59 100644 --- a/applications/GeoMechanicsApplication/tests/test_GeoMechanicsApplication.py +++ b/applications/GeoMechanicsApplication/tests/test_GeoMechanicsApplication.py @@ -16,6 +16,7 @@ from test_soil_structure_interactions import KratosGeoMechanicsSoilStructureInteractionTests from test_water_pressure import KratosGeoMechanicsWaterPressureTests from test_dynamics import KratosGeoMechanicsDynamicsTests +from test_dynamics_long import KratosGeoMechanicsDynamicsLongTests from test_elements import KratosGeoMechanicsElementTypeTests from test_steady_state_groundwater_flow import KratosGeoMechanicsSteadyStateGroundWaterFlowTests from test_transient_groundwater_flow import KratosGeoMechanicsTransientGroundWaterFlowTests @@ -130,7 +131,8 @@ def AssembleTestSuites(): KratosGeoMechanicsBenchmarkSet1, KratosGeoMechanicsBenchmarkSet2, KratosGeoMechanicsTransientGroundWaterFlowTests, - TestSellmeijersRuleValidation + TestSellmeijersRuleValidation, + KratosGeoMechanicsDynamicsLongTests ] # Create an array that contains all the tests from every testCase diff --git a/applications/GeoMechanicsApplication/tests/test_dynamics.py b/applications/GeoMechanicsApplication/tests/test_dynamics.py index 7427a4c3a308..9a1fd8ae8b54 100644 --- a/applications/GeoMechanicsApplication/tests/test_dynamics.py +++ b/applications/GeoMechanicsApplication/tests/test_dynamics.py @@ -1,16 +1,11 @@ import os import json -import sys -sys.path.append(r"D:\software_development\Kratos2\bin\Release") -sys.path.append(r"D:\software_development\Kratos2\bin\Release\libs") -import KratosMultiphysics as Kratos import KratosMultiphysics.KratosUnittest as KratosUnittest import KratosMultiphysics.GeoMechanicsApplication as KratosGeo -import KratosMultiphysics.StructuralMechanicsApplication as KratosStruct + import test_helper -from strip_load_semi_analytical_solution import StripLoad class KratosGeoMechanicsDynamicsTests(KratosUnittest.TestCase): @@ -107,99 +102,6 @@ def test_load_on_block_2d_no_damping(self): for node in nodes: self.assertVectorAlmostEqual(calculated_result[node][what], expected_result[node][what]) - def test_constant_strip_load_2d(self): - """ - Tests a constant strip load on a 10m X 10m block. The block is loaded with a constant strip load of 1kN/m and - a length of 1m. - - The solution should roughly follow the semi-analytical solution presented in the following publication: - An Introduction to Soil Dynamics , Verruijt A., 2009, Delft University of Technology, Chapter 12.2 - - - """ - # set to true if the results should be checked with the analytical solution - CHECK_RESULTS = True - - test_name = 'test_constant_strip_load_2d' - file_path = test_helper.get_file_path(os.path.join('.', test_name)) - - simulation = test_helper.run_kratos(file_path) - - # get calculated results - with open(os.path.join(file_path, "json_output.json")) as fp: - calculated_result = json.load(fp) - - # get expected results - with open(os.path.join(file_path, "expected_json_output.json")) as fp: - expected_result = json.load(fp) - - # check if results are as expected - self.assertTrue(test_helper.are_dictionaries_almost_equal(expected_result, calculated_result)) - - # If this test is altered, results between the analytical solution and the calculated solution can be compared - # below - if CHECK_RESULTS: - # get properties from material file as not all variables are registered in python - with open(os.path.join(file_path, "MaterialParameters_stage_1.json")) as fp: - material_parameters = json.load(fp) - - material_variables = material_parameters["properties"]["Material"]["Variables"] - process_info = simulation.model.GetModelPart('PorousDomain.porous_computational_model_part').ProcessInfo - - top_surface = 10.0 # follows from the mesh - line_load_length = 1.0 # follows from the mesh - load_value = -1000.0 # follows from table in the mdpa file - end_time = process_info.GetValue(Kratos.TIME) - - # initialise semi-analytical solution - analytical_solution = StripLoad(material_variables["YOUNG_MODULUS"], - material_variables["POISSON_RATIO"], - (1 - material_variables["POROSITY"]) * material_variables["DENSITY_SOLID"], - load_value) - - # get calculated json output - json_model_part = simulation.model.GetModelPart('PorousDomain.json_output') - - elements = json_model_part.Elements - x_coords = [] - calculated_vert_stresses = [] - analytical_vert_stresses = [] - for element in elements: - # get centroid - centroid = element.GetGeometry().Center() - x_coord = centroid.X - y_coord = centroid.Y - depth_check = top_surface - y_coord - x_coords.append(centroid.X) - - vert_stress_analytic = analytical_solution.calculate_vertical_stress(x_coord, - depth_check, - end_time, - line_load_length, - load_value) - - analytical_vert_stresses.append(-vert_stress_analytic) - - # get element mean vertical cauchy stress - element_stress = element.CalculateOnIntegrationPoints(Kratos.CAUCHY_STRESS_VECTOR, - json_model_part.ProcessInfo) - vert_stress = test_helper.compute_mean_list([gauss_stress[1] for gauss_stress in element_stress]) - - calculated_vert_stresses.append(vert_stress) - - # visualise results if matplotlib is installed - try: - import matplotlib.pyplot as plt - plt.plot(x_coords, analytical_vert_stresses, 'o', color="r") - plt.plot(x_coords, calculated_vert_stresses, 'o', color="b") - - plt.legend(["Analytical", "Calculated"]) - - plt.show() - - except ImportError: - print("Matplotlib not installed. Cannot visualise results") - if __name__ == '__main__': KratosUnittest.main() diff --git a/applications/GeoMechanicsApplication/tests/test_dynamics_long.py b/applications/GeoMechanicsApplication/tests/test_dynamics_long.py new file mode 100644 index 000000000000..e479e59a5469 --- /dev/null +++ b/applications/GeoMechanicsApplication/tests/test_dynamics_long.py @@ -0,0 +1,107 @@ +import os +import json + +import KratosMultiphysics as Kratos +import KratosMultiphysics.KratosUnittest as KratosUnittest + +import test_helper +from strip_load_semi_analytical_solution import StripLoad + + +class KratosGeoMechanicsDynamicsLongTests(KratosUnittest.TestCase): + """ + This class contains long-running tests to check dynamic calculations + """ + + def test_constant_strip_load_2d(self): + """ + Tests a constant strip load on a 10m X 10m block. The block is loaded with a constant strip load of 1kN/m and + a length of 1m. + + The solution should roughly follow the semi-analytical solution presented in the following publication: + An Introduction to Soil Dynamics , Verruijt A., 2009, Delft University of Technology, Chapter 12.2 + + + """ + # set to true if the results should be checked with the analytical solution + CHECK_RESULTS = True + + test_name = 'test_constant_strip_load_2d' + file_path = test_helper.get_file_path(os.path.join('.', test_name)) + + simulation = test_helper.run_kratos(file_path) + + # get calculated results + with open(os.path.join(file_path, "json_output.json")) as fp: + calculated_result = json.load(fp) + + # get expected results + with open(os.path.join(file_path, "expected_json_output.json")) as fp: + expected_result = json.load(fp) + + # check if results are as expected + self.assertTrue(test_helper.are_dictionaries_almost_equal(expected_result, calculated_result)) + + # If this test is altered, results between the analytical solution and the calculated solution can be compared + # below + if CHECK_RESULTS: + # get properties from material file as not all variables are registered in python + with open(os.path.join(file_path, "MaterialParameters_stage_1.json")) as fp: + material_parameters = json.load(fp) + + material_variables = material_parameters["properties"]["Material"]["Variables"] + process_info = simulation.model.GetModelPart('PorousDomain.porous_computational_model_part').ProcessInfo + + top_surface = 10.0 # follows from the mesh + line_load_length = 1.0 # follows from the mesh + load_value = -1000.0 # follows from table in the mdpa file + end_time = process_info.GetValue(Kratos.TIME) + + # initialise semi-analytical solution + analytical_solution = StripLoad(material_variables["YOUNG_MODULUS"], + material_variables["POISSON_RATIO"], + (1 - material_variables["POROSITY"]) * material_variables["DENSITY_SOLID"], + load_value) + + # get calculated json output + json_model_part = simulation.model.GetModelPart('PorousDomain.json_output') + + elements = json_model_part.Elements + x_coords = [] + calculated_vert_stresses = [] + analytical_vert_stresses = [] + for element in elements: + # get centroid + centroid = element.GetGeometry().Center() + x_coord = centroid.X + y_coord = centroid.Y + depth_check = top_surface - y_coord + x_coords.append(centroid.X) + + vert_stress_analytic = analytical_solution.calculate_vertical_stress(x_coord, + depth_check, + end_time, + line_load_length, + load_value) + + analytical_vert_stresses.append(-vert_stress_analytic) + + # get element mean vertical cauchy stress + element_stress = element.CalculateOnIntegrationPoints(Kratos.CAUCHY_STRESS_VECTOR, + json_model_part.ProcessInfo) + vert_stress = test_helper.compute_mean_list([gauss_stress[1] for gauss_stress in element_stress]) + + calculated_vert_stresses.append(vert_stress) + + # visualise results if matplotlib is installed + try: + import matplotlib.pyplot as plt + plt.plot(x_coords, analytical_vert_stresses, 'o', color="r") + plt.plot(x_coords, calculated_vert_stresses, 'o', color="b") + + plt.legend(["Analytical", "Calculated"]) + + plt.show() + + except ImportError: + print("Matplotlib not installed. Cannot visualise results") \ No newline at end of file From 82a02c00a1b400a3b23d6a775151b6561e724463 Mon Sep 17 00:00:00 2001 From: aronnoordam Date: Wed, 24 Jul 2024 13:55:56 +0200 Subject: [PATCH 20/65] reverted style changes --- applications/GeoMechanicsApplication/tests/test_dynamics.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/applications/GeoMechanicsApplication/tests/test_dynamics.py b/applications/GeoMechanicsApplication/tests/test_dynamics.py index 9a1fd8ae8b54..9f048b015ba5 100644 --- a/applications/GeoMechanicsApplication/tests/test_dynamics.py +++ b/applications/GeoMechanicsApplication/tests/test_dynamics.py @@ -1,10 +1,8 @@ import os import json - import KratosMultiphysics.KratosUnittest as KratosUnittest import KratosMultiphysics.GeoMechanicsApplication as KratosGeo - import test_helper From 043628ea305664673b3d218eb17ebf3774a7a0f0 Mon Sep 17 00:00:00 2001 From: aronnoordam Date: Wed, 24 Jul 2024 13:57:42 +0200 Subject: [PATCH 21/65] removed obsolete code --- .../strip_load_semi_analytical_solution.py | 51 ------------------- 1 file changed, 51 deletions(-) diff --git a/applications/GeoMechanicsApplication/tests/strip_load_semi_analytical_solution.py b/applications/GeoMechanicsApplication/tests/strip_load_semi_analytical_solution.py index 41a5626f3954..034bbe41c7d7 100644 --- a/applications/GeoMechanicsApplication/tests/strip_load_semi_analytical_solution.py +++ b/applications/GeoMechanicsApplication/tests/strip_load_semi_analytical_solution.py @@ -353,54 +353,3 @@ def calculate_vertical_stress(self, x: float, z: float, t: float, load_length: f normalised_vertical_stress = self.calculate_normalised_vertical_stress(x_norm, z_norm, kappa) vertical_stress = normalised_vertical_stress * load_value * load_length return vertical_stress - - -if __name__ == '__main__': - - import matplotlib.pyplot as plt - porosity = 0.0 - density_solid = 1020 - - line_load_length = 1 - load_value = -1000 - - strip_load = StripLoad(2.55e3 * 36, 0.25, (1 - porosity) * density_solid, load_value) - - cs = strip_load.cs - - # dimensionless time parameter - - # end_time = 10 * line_load_length / cs - end_time = 1 - - # dimensionless x coordinate - start_x = 0 - end_x = 10 - - n_steps = 100 - - ts = [end_time * i / n_steps for i in range(n_steps)] - kappas = [cs * t / line_load_length for t in ts] - kappa = cs * end_time / line_load_length - - xs = [start_x + (end_x - start_x) * i / n_steps for i in range(n_steps)] - - # z coordinate - x = 5 * line_load_length - z = 1 * line_load_length - - all_sigma_zz = [] - - for x in xs: - - xi = x / line_load_length - zeta = z / line_load_length - - sigma_zz_normalised = strip_load.calculate_normalised_vertical_stress(xi, zeta, kappa) - sigma_zz = sigma_zz_normalised * abs(strip_load.load) - - all_sigma_zz.append(sigma_zz) - - plt.plot(xs, all_sigma_zz) - - plt.show() From 6899534c3ecae5ed31b139350323d0a6a519441e Mon Sep 17 00:00:00 2001 From: aronnoordam Date: Thu, 25 Jul 2024 09:19:24 +0200 Subject: [PATCH 22/65] set check results to false --- .../GeoMechanicsApplication/tests/test_dynamics_long.py | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/applications/GeoMechanicsApplication/tests/test_dynamics_long.py b/applications/GeoMechanicsApplication/tests/test_dynamics_long.py index e479e59a5469..f010016d003e 100644 --- a/applications/GeoMechanicsApplication/tests/test_dynamics_long.py +++ b/applications/GeoMechanicsApplication/tests/test_dynamics_long.py @@ -1,6 +1,8 @@ import os import json - +import sys +sys.path.append(r"D:\software_development\Kratos2\bin\Release") +sys.path.append(r"D:\software_development\Kratos2\bin\Release\libs") import KratosMultiphysics as Kratos import KratosMultiphysics.KratosUnittest as KratosUnittest @@ -24,7 +26,7 @@ def test_constant_strip_load_2d(self): """ # set to true if the results should be checked with the analytical solution - CHECK_RESULTS = True + CHECK_RESULTS = False test_name = 'test_constant_strip_load_2d' file_path = test_helper.get_file_path(os.path.join('.', test_name)) @@ -49,7 +51,7 @@ def test_constant_strip_load_2d(self): with open(os.path.join(file_path, "MaterialParameters_stage_1.json")) as fp: material_parameters = json.load(fp) - material_variables = material_parameters["properties"]["Material"]["Variables"] + material_variables = material_parameters["properties"][0]["Material"]["Variables"] process_info = simulation.model.GetModelPart('PorousDomain.porous_computational_model_part').ProcessInfo top_surface = 10.0 # follows from the mesh From af88118438ec176fd4dbc9d2fef99e129422a859 Mon Sep 17 00:00:00 2001 From: aronnoordam Date: Thu, 25 Jul 2024 09:51:15 +0200 Subject: [PATCH 23/65] removed obsolete path --- .../GeoMechanicsApplication/tests/test_dynamics_long.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/applications/GeoMechanicsApplication/tests/test_dynamics_long.py b/applications/GeoMechanicsApplication/tests/test_dynamics_long.py index f010016d003e..f734bdba80f3 100644 --- a/applications/GeoMechanicsApplication/tests/test_dynamics_long.py +++ b/applications/GeoMechanicsApplication/tests/test_dynamics_long.py @@ -1,8 +1,6 @@ import os import json -import sys -sys.path.append(r"D:\software_development\Kratos2\bin\Release") -sys.path.append(r"D:\software_development\Kratos2\bin\Release\libs") + import KratosMultiphysics as Kratos import KratosMultiphysics.KratosUnittest as KratosUnittest From 4336f9c65397e0b6eac838adf52df1b0136e1bb0 Mon Sep 17 00:00:00 2001 From: sunethwarna Date: Mon, 29 Jul 2024 10:00:19 +0530 Subject: [PATCH 24/65] use response expression in std. constraint --- .../algorithms/standardized_constraint.py | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/applications/OptimizationApplication/python_scripts/algorithms/standardized_constraint.py b/applications/OptimizationApplication/python_scripts/algorithms/standardized_constraint.py index 941b961b51cf..ccb3de955768 100644 --- a/applications/OptimizationApplication/python_scripts/algorithms/standardized_constraint.py +++ b/applications/OptimizationApplication/python_scripts/algorithms/standardized_constraint.py @@ -6,6 +6,8 @@ from KratosMultiphysics.OptimizationApplication.utilities.component_data_view import ComponentDataView from KratosMultiphysics.OptimizationApplication.utilities.logger_utilities import DictLogger from KratosMultiphysics.OptimizationApplication.utilities.logger_utilities import TimeLogger +from KratosMultiphysics.OptimizationApplication.utilities.response_utilities import EvaluateResponseExpression +from KratosMultiphysics.kratos_utilities import IssueDeprecationWarning class StandardizedConstraint(ResponseRoutine): """Standardized constraint response function @@ -22,8 +24,14 @@ class StandardizedConstraint(ResponseRoutine): """ def __init__(self, parameters: Kratos.Parameters, master_control: MasterControl, optimization_problem: OptimizationProblem, required_buffer_size: int = 2): + # backward compatibility + if parameters.Has("response_name"): + IssueDeprecationWarning(self.__class__.__name__, "\"response_name\" is deprecated. Please use \"response_expression\".") + parameters.AddString("response_expression", parameters["response_name"].GetString()) + parameters.RemoveValue("response_name") + default_parameters = Kratos.Parameters("""{ - "response_name" : "", + "response_expression" : "", "type" : "", "scaling" : 1.0, "violation_scaling" : 1.0, @@ -35,7 +43,7 @@ def __init__(self, parameters: Kratos.Parameters, master_control: MasterControl, parameters.ValidateAndAssignDefaults(default_parameters) - response = optimization_problem.GetResponse(parameters["response_name"].GetString()) + response = EvaluateResponseExpression(parameters["response_expression"].GetString(), optimization_problem) super().__init__(master_control, response) From fc9ed8024cd864028f4fb9d1f37e5e1fc4b97cfd Mon Sep 17 00:00:00 2001 From: sunethwarna Date: Mon, 29 Jul 2024 10:00:29 +0530 Subject: [PATCH 25/65] use response expression in NLOPT constraint --- .../algorithms/standardized_NLOPT_constraint.py | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/applications/OptimizationApplication/python_scripts/algorithms/standardized_NLOPT_constraint.py b/applications/OptimizationApplication/python_scripts/algorithms/standardized_NLOPT_constraint.py index ed1b5f65e5a6..fb414271eb70 100644 --- a/applications/OptimizationApplication/python_scripts/algorithms/standardized_NLOPT_constraint.py +++ b/applications/OptimizationApplication/python_scripts/algorithms/standardized_NLOPT_constraint.py @@ -6,6 +6,8 @@ from KratosMultiphysics.OptimizationApplication.utilities.component_data_view import ComponentDataView from KratosMultiphysics.OptimizationApplication.utilities.logger_utilities import DictLogger from KratosMultiphysics.OptimizationApplication.utilities.logger_utilities import TimeLogger +from KratosMultiphysics.OptimizationApplication.utilities.response_utilities import EvaluateResponseExpression +from KratosMultiphysics.kratos_utilities import IssueDeprecationWarning import numpy import sys @@ -22,10 +24,16 @@ class StandardizedNLOPTConstraint(ResponseRoutine): """ def __init__(self, parameters: Kratos.Parameters, master_control: MasterControl, optimization_problem: OptimizationProblem, required_buffer_size: int = 2): + # backward compatibility + if parameters.Has("response_name"): + IssueDeprecationWarning(self.__class__.__name__, "\"response_name\" is deprecated. Please use \"response_expression\".") + parameters.AddString("response_expression", parameters["response_name"].GetString()) + parameters.RemoveValue("response_name") + default_parameters = Kratos.Parameters("""{ - "response_name": "", - "type" : "", - "ref_value" : "initial_value" + "response_expression": "", + "type" : "", + "ref_value" : "initial_value" }""") response_name = str(parameters["response_name"].GetString()) @@ -37,7 +45,7 @@ def __init__(self, parameters: Kratos.Parameters, master_control: MasterControl, parameters.ValidateAndAssignDefaults(default_parameters) - response = optimization_problem.GetResponse(parameters["response_name"].GetString()) + response = EvaluateResponseExpression(parameters["response_expression"].GetString(), optimization_problem) super().__init__(master_control, response) From 168f110d6c91a5a9a2e32905c40e230b7a08b13d Mon Sep 17 00:00:00 2001 From: sunethwarna Date: Mon, 29 Jul 2024 10:00:41 +0530 Subject: [PATCH 26/65] use response expression in NLOPT objective --- .../algorithms/standardized_NLOPT_objective.py | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/applications/OptimizationApplication/python_scripts/algorithms/standardized_NLOPT_objective.py b/applications/OptimizationApplication/python_scripts/algorithms/standardized_NLOPT_objective.py index 4b5badd9a534..3c4b5653a9e2 100644 --- a/applications/OptimizationApplication/python_scripts/algorithms/standardized_NLOPT_objective.py +++ b/applications/OptimizationApplication/python_scripts/algorithms/standardized_NLOPT_objective.py @@ -7,6 +7,8 @@ from KratosMultiphysics.OptimizationApplication.utilities.logger_utilities import DictLogger from KratosMultiphysics.OptimizationApplication.utilities.logger_utilities import TimeLogger from KratosMultiphysics.OptimizationApplication.utilities.helper_utilities import CallOnAll +from KratosMultiphysics.OptimizationApplication.utilities.response_utilities import EvaluateResponseExpression +from KratosMultiphysics.kratos_utilities import IssueDeprecationWarning import numpy import datetime @@ -20,14 +22,20 @@ class StandardizedNLOPTObjective(ResponseRoutine): """ def __init__(self, parameters: Kratos.Parameters, master_control: MasterControl, optimization_problem: OptimizationProblem, required_buffer_size: int = 2): + # backward compatibility + if parameters.Has("response_name"): + IssueDeprecationWarning(self.__class__.__name__, "\"response_name\" is deprecated. Please use \"response_expression\".") + parameters.AddString("response_expression", parameters["response_name"].GetString()) + parameters.RemoveValue("response_name") + default_parameters = Kratos.Parameters("""{ - "response_name": "", - "type" : "", - "scaling" : 1.0 + "response_expression": "", + "type" : "", + "scaling" : 1.0 }""") parameters.ValidateAndAssignDefaults(default_parameters) - response = optimization_problem.GetResponse(parameters["response_name"].GetString()) + response = EvaluateResponseExpression(parameters["response_expression"].GetString(), optimization_problem) super().__init__(master_control, response) From 37aeb63073515b91994d85584f59359853df5b3c Mon Sep 17 00:00:00 2001 From: sunethwarna Date: Mon, 29 Jul 2024 10:00:48 +0530 Subject: [PATCH 27/65] use response expression in std. objective --- .../algorithms/standardized_objective.py | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/applications/OptimizationApplication/python_scripts/algorithms/standardized_objective.py b/applications/OptimizationApplication/python_scripts/algorithms/standardized_objective.py index 394cff2df9fe..01dd9fa5a8eb 100644 --- a/applications/OptimizationApplication/python_scripts/algorithms/standardized_objective.py +++ b/applications/OptimizationApplication/python_scripts/algorithms/standardized_objective.py @@ -6,6 +6,8 @@ from KratosMultiphysics.OptimizationApplication.utilities.component_data_view import ComponentDataView from KratosMultiphysics.OptimizationApplication.utilities.logger_utilities import DictLogger from KratosMultiphysics.OptimizationApplication.utilities.logger_utilities import TimeLogger +from KratosMultiphysics.OptimizationApplication.utilities.response_utilities import EvaluateResponseExpression +from KratosMultiphysics.kratos_utilities import IssueDeprecationWarning class StandardizedObjective(ResponseRoutine): """Standardized objective response function @@ -17,14 +19,20 @@ class StandardizedObjective(ResponseRoutine): """ def __init__(self, parameters: Kratos.Parameters, master_control: MasterControl, optimization_problem: OptimizationProblem, required_buffer_size: int = 2): + # backward compatibility + if parameters.Has("response_name"): + IssueDeprecationWarning(self.__class__.__name__, "\"response_name\" is deprecated. Please use \"response_expression\".") + parameters.AddString("response_expression", parameters["response_name"].GetString()) + parameters.RemoveValue("response_name") + default_parameters = Kratos.Parameters("""{ - "response_name": "", - "type" : "", - "scaling" : 1.0 + "response_expression": "", + "type" : "", + "scaling" : 1.0 }""") parameters.ValidateAndAssignDefaults(default_parameters) - response = optimization_problem.GetResponse(parameters["response_name"].GetString()) + response = EvaluateResponseExpression(parameters["response_expression"].GetString(), optimization_problem) super().__init__(master_control, response) From d7fb461f38f84ab91100c18a0856d2114fbf2fb1 Mon Sep 17 00:00:00 2001 From: sunethwarna Date: Mon, 29 Jul 2024 10:00:57 +0530 Subject: [PATCH 28/65] use response expression in std. rgp constraint --- .../algorithms/standardized_rgp_constraint.py | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/applications/OptimizationApplication/python_scripts/algorithms/standardized_rgp_constraint.py b/applications/OptimizationApplication/python_scripts/algorithms/standardized_rgp_constraint.py index 72c20a1ec3ca..6fd4850839b7 100644 --- a/applications/OptimizationApplication/python_scripts/algorithms/standardized_rgp_constraint.py +++ b/applications/OptimizationApplication/python_scripts/algorithms/standardized_rgp_constraint.py @@ -6,6 +6,8 @@ from KratosMultiphysics.OptimizationApplication.utilities.component_data_view import ComponentDataView from KratosMultiphysics.OptimizationApplication.utilities.logger_utilities import DictLogger from KratosMultiphysics.OptimizationApplication.utilities.logger_utilities import TimeLogger +from KratosMultiphysics.OptimizationApplication.utilities.response_utilities import EvaluateResponseExpression +from KratosMultiphysics.kratos_utilities import IssueDeprecationWarning from enum import Enum @@ -33,8 +35,14 @@ class StandardizedRGPConstraint(ResponseRoutine): """ def __init__(self, parameters: Kratos.Parameters, master_control: MasterControl, optimization_problem: OptimizationProblem, required_buffer_size: int = 4): + # backward compatibility + if parameters.Has("response_name"): + IssueDeprecationWarning(self.__class__.__name__, "\"response_name\" is deprecated. Please use \"response_expression\".") + parameters.AddString("response_expression", parameters["response_name"].GetString()) + parameters.RemoveValue("response_name") + default_parameters = Kratos.Parameters("""{ - "response_name" : "", + "response_expression" : "", "type" : "", "scaled_ref_value" : 0.0, "buffer_factor" : 2.0, @@ -52,7 +60,7 @@ def __init__(self, parameters: Kratos.Parameters, master_control: MasterControl, parameters.ValidateAndAssignDefaults(default_parameters) - response = optimization_problem.GetResponse(parameters["response_name"].GetString()) + response = EvaluateResponseExpression(parameters["response_expression"].GetString(), optimization_problem) super().__init__(master_control, response) From 8f64943cb91eccfaf4c4f306cdf00654c1a73fa5 Mon Sep 17 00:00:00 2001 From: aronnoordam Date: Wed, 31 Jul 2024 12:05:20 +0200 Subject: [PATCH 29/65] corrected density matrix in upw interface element --- .../U_Pw_small_strain_interface_element.cpp | 8 +------- .../custom_utilities/element_utilities.hpp | 20 ------------------- 2 files changed, 1 insertion(+), 27 deletions(-) diff --git a/applications/GeoMechanicsApplication/custom_elements/U_Pw_small_strain_interface_element.cpp b/applications/GeoMechanicsApplication/custom_elements/U_Pw_small_strain_interface_element.cpp index 959c7d56d694..62b64b756a43 100644 --- a/applications/GeoMechanicsApplication/custom_elements/U_Pw_small_strain_interface_element.cpp +++ b/applications/GeoMechanicsApplication/custom_elements/U_Pw_small_strain_interface_element.cpp @@ -179,8 +179,6 @@ void UPwSmallStrainInterfaceElement::CalculateMassMatrix(Matrix RetentionLaw::Parameters RetentionParameters(r_prop); // Defining necessary variables - BoundedMatrix aux_density_matrix = ZeroMatrix(TDim, TNumNodes * TDim); - BoundedMatrix density_matrix = ZeroMatrix(TDim, TDim); array_1d LocalRelDispVector; array_1d RelDispVector; @@ -203,13 +201,9 @@ void UPwSmallStrainInterfaceElement::CalculateMassMatrix(Matrix const auto density = GeoTransportEquationUtilities::CalculateSoilDensity(Variables.DegreeOfSaturation, r_prop); - GeoElementUtilities::AssembleDensityMatrix(density_matrix, density); - - noalias(aux_density_matrix) = prod(density_matrix, Variables.Nu); - // Adding contribution to Mass matrix GeoElementUtilities::AssembleUUBlockMatrix( - rMassMatrix, prod(trans(Variables.Nu), aux_density_matrix) * Variables.JointWidth * + rMassMatrix, density * prod(trans(Variables.Nu), Variables.Nu) * Variables.JointWidth * Variables.IntegrationCoefficient); } diff --git a/applications/GeoMechanicsApplication/custom_utilities/element_utilities.hpp b/applications/GeoMechanicsApplication/custom_utilities/element_utilities.hpp index fd5bb70731d5..db6423ff39e1 100644 --- a/applications/GeoMechanicsApplication/custom_utilities/element_utilities.hpp +++ b/applications/GeoMechanicsApplication/custom_utilities/element_utilities.hpp @@ -191,26 +191,6 @@ class GeoElementUtilities KRATOS_CATCH("") } - template - static inline void AssembleDensityMatrix(BoundedMatrix& DensityMatrix, double Density) - { - for (unsigned int idim = 0; idim < TDim; ++idim) { - for (unsigned int jdim = 0; jdim < TDim; ++jdim) { - DensityMatrix(idim, jdim) = Density; - } - } - } - - template - static inline void AssembleDensityMatrix(MatrixType& DensityMatrix, double Density) - { - for (unsigned int idim = 0; idim < DensityMatrix.size1(); ++idim) { - for (unsigned int jdim = 0; jdim < DensityMatrix.size2(); ++jdim) { - DensityMatrix(idim, jdim) = Density; - } - } - } - template static inline void AssembleUUBlockMatrix(MatrixType1& rLeftHandSideMatrix, const MatrixType2& rUUBlockMatrix) { From 640b7de11f5b23b9501cfbc8b2342bcb645e5825 Mon Sep 17 00:00:00 2001 From: aronnoordam Date: Wed, 31 Jul 2024 12:13:00 +0200 Subject: [PATCH 30/65] reverted commit as it belongs in another pr --- .../custom_utilities/element_utilities.hpp | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/applications/GeoMechanicsApplication/custom_utilities/element_utilities.hpp b/applications/GeoMechanicsApplication/custom_utilities/element_utilities.hpp index fd5bb70731d5..d31e6081c5cb 100644 --- a/applications/GeoMechanicsApplication/custom_utilities/element_utilities.hpp +++ b/applications/GeoMechanicsApplication/custom_utilities/element_utilities.hpp @@ -191,16 +191,6 @@ class GeoElementUtilities KRATOS_CATCH("") } - template - static inline void AssembleDensityMatrix(BoundedMatrix& DensityMatrix, double Density) - { - for (unsigned int idim = 0; idim < TDim; ++idim) { - for (unsigned int jdim = 0; jdim < TDim; ++jdim) { - DensityMatrix(idim, jdim) = Density; - } - } - } - template static inline void AssembleDensityMatrix(MatrixType& DensityMatrix, double Density) { From dd274bead62a6bddba07944c3c25684cfe5bd131 Mon Sep 17 00:00:00 2001 From: aronnoordam Date: Wed, 31 Jul 2024 12:16:20 +0200 Subject: [PATCH 31/65] reverted commit as it belongs in another pr --- .../U_Pw_small_strain_interface_element.cpp | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/applications/GeoMechanicsApplication/custom_elements/U_Pw_small_strain_interface_element.cpp b/applications/GeoMechanicsApplication/custom_elements/U_Pw_small_strain_interface_element.cpp index 959c7d56d694..62b64b756a43 100644 --- a/applications/GeoMechanicsApplication/custom_elements/U_Pw_small_strain_interface_element.cpp +++ b/applications/GeoMechanicsApplication/custom_elements/U_Pw_small_strain_interface_element.cpp @@ -179,8 +179,6 @@ void UPwSmallStrainInterfaceElement::CalculateMassMatrix(Matrix RetentionLaw::Parameters RetentionParameters(r_prop); // Defining necessary variables - BoundedMatrix aux_density_matrix = ZeroMatrix(TDim, TNumNodes * TDim); - BoundedMatrix density_matrix = ZeroMatrix(TDim, TDim); array_1d LocalRelDispVector; array_1d RelDispVector; @@ -203,13 +201,9 @@ void UPwSmallStrainInterfaceElement::CalculateMassMatrix(Matrix const auto density = GeoTransportEquationUtilities::CalculateSoilDensity(Variables.DegreeOfSaturation, r_prop); - GeoElementUtilities::AssembleDensityMatrix(density_matrix, density); - - noalias(aux_density_matrix) = prod(density_matrix, Variables.Nu); - // Adding contribution to Mass matrix GeoElementUtilities::AssembleUUBlockMatrix( - rMassMatrix, prod(trans(Variables.Nu), aux_density_matrix) * Variables.JointWidth * + rMassMatrix, density * prod(trans(Variables.Nu), Variables.Nu) * Variables.JointWidth * Variables.IntegrationCoefficient); } From 08388078b0b0ad5024a47631ee1d9fef1ff8ab5b Mon Sep 17 00:00:00 2001 From: aronnoordam Date: Wed, 31 Jul 2024 13:49:26 +0200 Subject: [PATCH 32/65] Revert "corrected density matrix in upw interface element" This reverts commit 8f64943c --- .../U_Pw_small_strain_interface_element.cpp | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/applications/GeoMechanicsApplication/custom_elements/U_Pw_small_strain_interface_element.cpp b/applications/GeoMechanicsApplication/custom_elements/U_Pw_small_strain_interface_element.cpp index 62b64b756a43..959c7d56d694 100644 --- a/applications/GeoMechanicsApplication/custom_elements/U_Pw_small_strain_interface_element.cpp +++ b/applications/GeoMechanicsApplication/custom_elements/U_Pw_small_strain_interface_element.cpp @@ -179,6 +179,8 @@ void UPwSmallStrainInterfaceElement::CalculateMassMatrix(Matrix RetentionLaw::Parameters RetentionParameters(r_prop); // Defining necessary variables + BoundedMatrix aux_density_matrix = ZeroMatrix(TDim, TNumNodes * TDim); + BoundedMatrix density_matrix = ZeroMatrix(TDim, TDim); array_1d LocalRelDispVector; array_1d RelDispVector; @@ -201,9 +203,13 @@ void UPwSmallStrainInterfaceElement::CalculateMassMatrix(Matrix const auto density = GeoTransportEquationUtilities::CalculateSoilDensity(Variables.DegreeOfSaturation, r_prop); + GeoElementUtilities::AssembleDensityMatrix(density_matrix, density); + + noalias(aux_density_matrix) = prod(density_matrix, Variables.Nu); + // Adding contribution to Mass matrix GeoElementUtilities::AssembleUUBlockMatrix( - rMassMatrix, density * prod(trans(Variables.Nu), Variables.Nu) * Variables.JointWidth * + rMassMatrix, prod(trans(Variables.Nu), aux_density_matrix) * Variables.JointWidth * Variables.IntegrationCoefficient); } From 7804fa31399af40e73cf175f4e823098a5e51bcd Mon Sep 17 00:00:00 2001 From: aronnoordam Date: Wed, 31 Jul 2024 14:11:56 +0200 Subject: [PATCH 33/65] reduced complexity for sonarcloud --- .../tests/test_helper.py | 91 +++++++++---------- 1 file changed, 45 insertions(+), 46 deletions(-) diff --git a/applications/GeoMechanicsApplication/tests/test_helper.py b/applications/GeoMechanicsApplication/tests/test_helper.py index f4e7f1b8b793..d7b4be7feb53 100644 --- a/applications/GeoMechanicsApplication/tests/test_helper.py +++ b/applications/GeoMechanicsApplication/tests/test_helper.py @@ -420,6 +420,45 @@ def find_closest_index_greater_than_value(input_list, value): return None +def are_values_almost_equal(expected: Any, actual: Any, abs_tolerance: float = 1e-7) -> bool: + """ + Checks whether two values are almost equal. + + Args: + - expected (Any): Expected value. + - actual (Any): Actual value. + + Returns: + - True if the values are almost equal, False otherwise. + + """ + # check if the value is a dictionary and check the dictionary + if isinstance(expected, dict): + # check if the value is a dictionary and check the dictionary + if not are_dictionaries_almost_equal(expected, actual): + return False + elif isinstance(expected, str): + # check if the value is a string and compare the strings + if expected != actual: + return False + elif isinstance(expected, (list, tuple, set)): + # check if the value is a list, tuple or set and compare the values + if not are_iterables_almost_equal(expected, actual): + return False + elif expected is None: + # check if the value is None and compare the values + if actual is not None: + return False + elif isinstance(expected, (float, int, complex)): + # The value is a number and compare the values + if not math.isclose(expected, actual, abs_tol=abs_tolerance): + return False + else: + raise Exception(f"Unsupported type {type(expected)}") + + return True + + def are_iterables_almost_equal(expected: (list, tuple, set), actual: (list, tuple, set), abs_tolerance: float = 1e-7) -> bool: """ @@ -436,29 +475,10 @@ def are_iterables_almost_equal(expected: (list, tuple, set), actual: (list, tupl # check if the value is a list, tuple or set and compare the values if len(expected) != len(actual): return False + for v_i, actual_i in zip(expected, actual): - if isinstance(v_i, dict): - # check if the value is a dictionary and recursively check the dictionary - if not are_dictionaries_almost_equal(v_i, actual_i): - return False - elif isinstance(v_i, str): - # check if the value is a string and compare the strings - if v_i != actual_i: - return False - elif isinstance(v_i, (list, tuple, set)): - # check if the value is a list, tuple or set and compare the values - if not are_iterables_almost_equal(v_i, actual_i): - return False - elif v_i is None: - # check if the value is None and compare the values - if actual_i is not None: - return False - elif isinstance(v_i, (float, int, complex)): - # The value is a number and compare the values - if not math.isclose(v_i, actual_i, abs_tol=abs_tolerance): - return False - else: - Exception(f"Unsupported type {type(v_i)}") + if not are_values_almost_equal(v_i, actual_i, abs_tolerance): + return False return True @@ -484,30 +504,9 @@ def are_dictionaries_almost_equal(expected: Dict[Any, Any], if k not in actual: return False - # check if values are equal - if isinstance(v, dict): - # check if the value is a dictionary and recursively check the dictionary - if not are_dictionaries_almost_equal(v, actual[k]): - return False - elif isinstance(v, str): - # check if the value is a string and compare the strings - if v != actual[k]: - return False - elif isinstance(v, (list, tuple, set)): - # check if the value is a list, tuple or set and compare the values - if not are_iterables_almost_equal(v, actual[k], abs_tolerance): - return False - - elif v is None: - # check if the value is None and compare the values - if actual[k] is not None: - return False - elif isinstance(v, (float, int, complex)): - # The value is a number and compare the values - if not math.isclose(v, actual[k], abs_tol=abs_tolerance): - return False - else: - Exception(f"Unsupported type {type(v)}") + # check if values are almost equal + if not are_values_almost_equal(v, actual[k], abs_tolerance): + return False # all checks passed return True From e9ddd16e6f39a5f7560f11ebc3edb39de227d984 Mon Sep 17 00:00:00 2001 From: aronnoordam Date: Fri, 2 Aug 2024 10:35:52 +0200 Subject: [PATCH 34/65] auto to array_1d for updated_first_derivative and updated_second_time_derivative --- .../custom_strategies/schemes/generalized_newmark_scheme.hpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/applications/GeoMechanicsApplication/custom_strategies/schemes/generalized_newmark_scheme.hpp b/applications/GeoMechanicsApplication/custom_strategies/schemes/generalized_newmark_scheme.hpp index 5734ec5f454e..0451d3c24681 100644 --- a/applications/GeoMechanicsApplication/custom_strategies/schemes/generalized_newmark_scheme.hpp +++ b/applications/GeoMechanicsApplication/custom_strategies/schemes/generalized_newmark_scheme.hpp @@ -149,7 +149,7 @@ class GeneralizedNewmarkScheme : public GeoMechanicsTimeIntegrationSchemeGetSecondOrderVectorVariables()) { if (!rNode.SolutionStepsDataHas(r_second_order_vector_variable.instance)) continue; - const auto updated_first_derivative = + const array_1d updated_first_derivative = rNode.FastGetSolutionStepValue(r_second_order_vector_variable.first_time_derivative, 1) + (1.0 - GetGamma()) * this->GetDeltaTime() * rNode.FastGetSolutionStepValue(r_second_order_vector_variable.second_time_derivative, 1) + @@ -166,7 +166,7 @@ class GeneralizedNewmarkScheme : public GeoMechanicsTimeIntegrationSchemeGetSecondOrderVectorVariables()) { if (!rNode.SolutionStepsDataHas(r_second_order_vector_variable.instance)) continue; - const auto updated_second_time_derivative = + const array_1d updated_second_time_derivative = ((rNode.FastGetSolutionStepValue(r_second_order_vector_variable.instance, 0) - rNode.FastGetSolutionStepValue(r_second_order_vector_variable.instance, 1)) - this->GetDeltaTime() * rNode.FastGetSolutionStepValue( From cd0c759a916da78ae391a060e2c373e029fcb304 Mon Sep 17 00:00:00 2001 From: Vicente Mataix Ferrandiz Date: Mon, 5 Aug 2024 15:07:01 +0200 Subject: [PATCH 35/65] Remove whitespaces --- .../cpp_tests/utilities/test_parallel_fill_communicator.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/kratos/mpi/tests/cpp_tests/utilities/test_parallel_fill_communicator.cpp b/kratos/mpi/tests/cpp_tests/utilities/test_parallel_fill_communicator.cpp index a8fd3e5a8f76..2459ead003fd 100644 --- a/kratos/mpi/tests/cpp_tests/utilities/test_parallel_fill_communicator.cpp +++ b/kratos/mpi/tests/cpp_tests/utilities/test_parallel_fill_communicator.cpp @@ -20,7 +20,7 @@ #include "mpi/tests/test_utilities/mpi_cpp_test_utilities.h" #include "mpi/utilities/parallel_fill_communicator.h" -namespace Kratos::Testing +namespace Kratos::Testing { KRATOS_TEST_CASE_IN_SUITE(ParallelFillCommunicatorExecute, KratosMPICoreFastSuite) @@ -28,10 +28,10 @@ KRATOS_TEST_CASE_IN_SUITE(ParallelFillCommunicatorExecute, KratosMPICoreFastSuit // The model part Model current_model; ModelPart& r_model_part = current_model.CreateModelPart("Main"); - + // The data communicator const DataCommunicator& r_data_communicator = Testing::GetDefaultDataCommunicator(); - + // MPI data const int rank = r_data_communicator.Rank(); const int world_size = r_data_communicator.Size(); From bdee120c9055137d3cfce90d97089106505b27fb Mon Sep 17 00:00:00 2001 From: Vicente Mataix Ferrandiz Date: Mon, 5 Aug 2024 18:11:15 +0200 Subject: [PATCH 36/65] Adding new test --- .../test_parallel_fill_communicator.cpp | 57 ++++++++++- .../test_utilities/mpi_cpp_test_utilities.cpp | 98 ++++++++++++++++++- .../test_utilities/mpi_cpp_test_utilities.h | 10 ++ .../utilities/parallel_fill_communicator.cpp | 2 +- 4 files changed, 164 insertions(+), 3 deletions(-) diff --git a/kratos/mpi/tests/cpp_tests/utilities/test_parallel_fill_communicator.cpp b/kratos/mpi/tests/cpp_tests/utilities/test_parallel_fill_communicator.cpp index 2459ead003fd..6c175fdf58ae 100644 --- a/kratos/mpi/tests/cpp_tests/utilities/test_parallel_fill_communicator.cpp +++ b/kratos/mpi/tests/cpp_tests/utilities/test_parallel_fill_communicator.cpp @@ -23,7 +23,7 @@ namespace Kratos::Testing { -KRATOS_TEST_CASE_IN_SUITE(ParallelFillCommunicatorExecute, KratosMPICoreFastSuite) +KRATOS_TEST_CASE_IN_SUITE(ParallelFillCommunicatorExecuteBarStructure, KratosMPICoreFastSuite) { // The model part Model current_model; @@ -76,4 +76,59 @@ KRATOS_TEST_CASE_IN_SUITE(ParallelFillCommunicatorExecute, KratosMPICoreFastSuit } } +KRATOS_TEST_CASE_IN_SUITE(ParallelFillCommunicatorExecuteTriangleMesh, KratosMPICoreFastSuite) +{ + // The model part + Model current_model; + ModelPart& r_model_part = current_model.CreateModelPart("Main"); + + // The data communicator + const DataCommunicator& r_data_communicator = Testing::GetDefaultDataCommunicator(); + + // MPI data + const int rank = r_data_communicator.Rank(); + const int world_size = r_data_communicator.Size(); + + // Fill the model part + MPICppTestUtilities::GenerateDistributedTriangleMesh(r_model_part, r_data_communicator); + + // Check that the communicator is correctly filled + const auto& r_neighbours_indices = r_model_part.GetCommunicator().NeighbourIndices(); + if (world_size == 1) { + KRATOS_EXPECT_EQ(r_neighbours_indices.size(), 0); + KRATOS_EXPECT_EQ(r_model_part.GetCommunicator().LocalMesh().NumberOfNodes(), 5); + KRATOS_EXPECT_EQ(r_model_part.GetCommunicator().GhostMesh().NumberOfNodes(), 0); + KRATOS_EXPECT_EQ(r_model_part.GetCommunicator().InterfaceMesh().NumberOfNodes(), 0); + } else if (world_size == 2) { + KRATOS_EXPECT_EQ(r_neighbours_indices.size(), 1); + if (rank == 0) { + KRATOS_EXPECT_EQ(r_neighbours_indices[0], 1); + KRATOS_EXPECT_EQ(r_model_part.GetCommunicator().LocalMesh().NumberOfNodes(), 4); + KRATOS_EXPECT_EQ(r_model_part.GetCommunicator().GhostMesh().NumberOfNodes(), 1); + KRATOS_EXPECT_EQ(r_model_part.GetCommunicator().InterfaceMesh().NumberOfNodes(), 3); + } else if (rank == 1) { + KRATOS_EXPECT_EQ(r_neighbours_indices[0], 0); + KRATOS_EXPECT_EQ(r_model_part.GetCommunicator().LocalMesh().NumberOfNodes(), 1); + KRATOS_EXPECT_EQ(r_model_part.GetCommunicator().GhostMesh().NumberOfNodes(), 2); + KRATOS_EXPECT_EQ(r_model_part.GetCommunicator().InterfaceMesh().NumberOfNodes(), 3); + } + } else { + if (rank == 0) { + KRATOS_EXPECT_EQ(r_neighbours_indices[0], 1); + KRATOS_EXPECT_EQ(r_model_part.GetCommunicator().LocalMesh().NumberOfNodes(), 4); + KRATOS_EXPECT_EQ(r_model_part.GetCommunicator().GhostMesh().NumberOfNodes(), 1); + KRATOS_EXPECT_EQ(r_model_part.GetCommunicator().InterfaceMesh().NumberOfNodes(), 3); + } else if (rank == 1) { + KRATOS_EXPECT_EQ(r_neighbours_indices[0], 0); + KRATOS_EXPECT_EQ(r_model_part.GetCommunicator().LocalMesh().NumberOfNodes(), 1); + KRATOS_EXPECT_EQ(r_model_part.GetCommunicator().GhostMesh().NumberOfNodes(), 2); + KRATOS_EXPECT_EQ(r_model_part.GetCommunicator().InterfaceMesh().NumberOfNodes(), 3); + } else { // The rest of the ranks + KRATOS_EXPECT_EQ(r_model_part.GetCommunicator().LocalMesh().NumberOfNodes(), 0); + KRATOS_EXPECT_EQ(r_model_part.GetCommunicator().GhostMesh().NumberOfNodes(), 0); + KRATOS_EXPECT_EQ(r_model_part.GetCommunicator().InterfaceMesh().NumberOfNodes(), 0); + } + } +} + } // namespace Kratos::Testing \ No newline at end of file diff --git a/kratos/mpi/tests/test_utilities/mpi_cpp_test_utilities.cpp b/kratos/mpi/tests/test_utilities/mpi_cpp_test_utilities.cpp index 9bd73f697ba0..51f2f9259c16 100644 --- a/kratos/mpi/tests/test_utilities/mpi_cpp_test_utilities.cpp +++ b/kratos/mpi/tests/test_utilities/mpi_cpp_test_utilities.cpp @@ -16,12 +16,14 @@ // Project includes #include "geometries/line_2d_2.h" +#include "geometries/triangle_2d_3.h" #include "utilities/global_pointer_utilities.h" #include "mpi/includes/mpi_data_communicator.h" #include "mpi/tests/test_utilities/mpi_cpp_test_utilities.h" #include "mpi/utilities/model_part_communicator_utilities.h" #include "mpi/utilities/parallel_fill_communicator.h" #include "tests/test_utilities/test_bar_element.h" +#include "processes/skin_detection_process.h" namespace Kratos { @@ -172,7 +174,101 @@ void MPICppTestUtilities::GenerateDistributedBarStructure( } } - // Compute communicaton plan and fill communicator meshes correctly + // Compute communication plan and fill communicator meshes correctly + auto filler = ParallelFillCommunicator(rModelPart, rDataCommunicator); + filler.Execute(); +} + +/***********************************************************************************/ +/***********************************************************************************/ + +void MPICppTestUtilities::GenerateDistributedTriangleMesh( + ModelPart& rModelPart, + const DataCommunicator& rDataCommunicator + ) +{ + // Set MPI coomunicator + ModelPartCommunicatorUtilities::SetMPICommunicator(rModelPart, rDataCommunicator); + + // Add variables + rModelPart.AddNodalSolutionStepVariable(PARTITION_INDEX); + + // Create properties + auto p_prop = rModelPart.CreateNewProperties(1, 0); + + // MPI data + const int rank = rDataCommunicator.Rank(); + const int world_size = rDataCommunicator.Size(); + + // Initially everything in one partition + if (world_size == 1) { + auto pnode1 = rModelPart.CreateNewNode(1, 0.0, 0.0, 0.0); + auto pnode2 = rModelPart.CreateNewNode(2, 1.0, 0.0, 0.0); + auto pnode3 = rModelPart.CreateNewNode(3, 1.0, 1.0, 0.0); + auto pnode4 = rModelPart.CreateNewNode(4, 0.0, 1.0, 0.0); + auto pnode5 = rModelPart.CreateNewNode(5, 0.5, 0.5, 0.0); + + /// Add PARTITION_INDEX + for (auto& r_node : rModelPart.Nodes()) { + r_node.FastGetSolutionStepValue(PARTITION_INDEX) = rank; + } + + auto pgeom1 = Kratos::make_shared>(PointerVector{std::vector({pnode1, pnode2, pnode5})}); + rModelPart.AddElement(Kratos::make_intrusive( 1, pgeom1, p_prop)); + auto pgeom2 = Kratos::make_shared>(PointerVector{std::vector({pnode2, pnode3, pnode5})}); + rModelPart.AddElement(Kratos::make_intrusive( 2, pgeom2, p_prop)); + auto pgeom3 = Kratos::make_shared>(PointerVector{std::vector({pnode3, pnode4, pnode5})}); + rModelPart.AddElement(Kratos::make_intrusive( 3, pgeom3, p_prop)); + auto pgeom4 = Kratos::make_shared>(PointerVector{std::vector({pnode4, pnode1, pnode5})}); + rModelPart.AddElement(Kratos::make_intrusive( 4, pgeom4, p_prop)); + } else { // if (world_size == 1) { // TODO: Do more than one partition + if (rank == 0) { + auto pnode1 = rModelPart.CreateNewNode(1, 0.0, 0.0, 0.0); + auto pnode2 = rModelPart.CreateNewNode(2, 1.0, 0.0, 0.0); + auto pnode3 = rModelPart.CreateNewNode(3, 1.0, 1.0, 0.0); + auto pnode4 = rModelPart.CreateNewNode(4, 0.0, 1.0, 0.0); + auto pnode5 = rModelPart.CreateNewNode(5, 0.5, 0.5, 0.0); + + /// Add PARTITION_INDEX + for (auto& r_node : rModelPart.Nodes()) { + r_node.FastGetSolutionStepValue(PARTITION_INDEX) = 0; + } + pnode5->FastGetSolutionStepValue(PARTITION_INDEX) = 1; + + auto pgeom1 = Kratos::make_shared>(PointerVector{std::vector({pnode1, pnode2, pnode5})}); + rModelPart.AddElement(Kratos::make_intrusive( 1, pgeom1, p_prop)); + auto pgeom2 = Kratos::make_shared>(PointerVector{std::vector({pnode2, pnode3, pnode5})}); + rModelPart.AddElement(Kratos::make_intrusive( 2, pgeom2, p_prop)); + auto pgeom4 = Kratos::make_shared>(PointerVector{std::vector({pnode4, pnode1, pnode5})}); + rModelPart.AddElement(Kratos::make_intrusive( 4, pgeom4, p_prop)); + } else if (rank == 1) { + auto pnode3 = rModelPart.CreateNewNode(3, 1.0, 1.0, 0.0); + auto pnode4 = rModelPart.CreateNewNode(4, 0.0, 1.0, 0.0); + auto pnode5 = rModelPart.CreateNewNode(5, 0.5, 0.5, 0.0); + + /// Add PARTITION_INDEX + for (auto& r_node : rModelPart.Nodes()) { + r_node.FastGetSolutionStepValue(PARTITION_INDEX) = 0; + } + pnode5->FastGetSolutionStepValue(PARTITION_INDEX) = 1; + + auto pgeom3 = Kratos::make_shared>(PointerVector{std::vector({pnode3, pnode4, pnode5})}); + rModelPart.AddElement(Kratos::make_intrusive( 3, pgeom3, p_prop)); + } + } + + // Detect skin + Parameters skin_process_parameters = Parameters(R"( + { + "name_auxiliar_model_part" : "SkinModelPart", + "name_auxiliar_condition" : "Condition", + "list_model_parts_to_assign_conditions" : [], + "echo_level" : 0 + })"); + auto skin_process = SkinDetectionProcess<2>(rModelPart, skin_process_parameters); + skin_process.Execute(); + + // Compute communication plan and fill communicator meshes correctly auto filler = ParallelFillCommunicator(rModelPart, rDataCommunicator); filler.Execute(); } diff --git a/kratos/mpi/tests/test_utilities/mpi_cpp_test_utilities.h b/kratos/mpi/tests/test_utilities/mpi_cpp_test_utilities.h index 6d806d1c8180..ecb217eded2d 100644 --- a/kratos/mpi/tests/test_utilities/mpi_cpp_test_utilities.h +++ b/kratos/mpi/tests/test_utilities/mpi_cpp_test_utilities.h @@ -37,6 +37,16 @@ static void GenerateDistributedBarStructure( const DataCommunicator& rDataCommunicator ); +/** +* @brief It generates a triangle mesh +* @param rModelPart The model part to be filled +* @param rDataCommunicator The data communicator +*/ +static void GenerateDistributedTriangleMesh( + ModelPart& rModelPart, + const DataCommunicator& rDataCommunicator + ); + /** * @brief Synchronizes local pointers to global pointers of the given ModelPart using the provided * @details DataCommunicator and returns a shared pointer to a GlobalPointerCommunicator. diff --git a/kratos/mpi/utilities/parallel_fill_communicator.cpp b/kratos/mpi/utilities/parallel_fill_communicator.cpp index 28d9ad4e34c5..790413888e51 100644 --- a/kratos/mpi/utilities/parallel_fill_communicator.cpp +++ b/kratos/mpi/utilities/parallel_fill_communicator.cpp @@ -449,7 +449,7 @@ void ParallelFillCommunicator::GenerateMeshes( } std::vector ids_to_send; - { // Syncronize how many nodes need to be sent/received. + { // Synchronize how many nodes need to be sent/received. int send_tag = Color; int receive_tag = Color; std::size_t recv_buf = r_data_communicator.SendRecv(ids_to_receive.size(), NeighbourPID, send_tag, NeighbourPID, receive_tag); From 12154bc83f3affb3af6d529360fdd111bedab1fc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vicente=20Mataix=20Ferr=C3=A1ndiz?= Date: Tue, 6 Aug 2024 15:33:43 +0200 Subject: [PATCH 37/65] Typo Co-authored-by: Philipp Bucher --- kratos/mpi/tests/test_utilities/mpi_cpp_test_utilities.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/kratos/mpi/tests/test_utilities/mpi_cpp_test_utilities.cpp b/kratos/mpi/tests/test_utilities/mpi_cpp_test_utilities.cpp index 51f2f9259c16..63cdf1ebc529 100644 --- a/kratos/mpi/tests/test_utilities/mpi_cpp_test_utilities.cpp +++ b/kratos/mpi/tests/test_utilities/mpi_cpp_test_utilities.cpp @@ -187,7 +187,7 @@ void MPICppTestUtilities::GenerateDistributedTriangleMesh( const DataCommunicator& rDataCommunicator ) { - // Set MPI coomunicator + // Set MPI communicator ModelPartCommunicatorUtilities::SetMPICommunicator(rModelPart, rDataCommunicator); // Add variables From 42bfe52fbd37fd199e51ea8d135f9fe08574d4a8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vicente=20Mataix=20Ferr=C3=A1ndiz?= Date: Tue, 6 Aug 2024 16:03:24 +0200 Subject: [PATCH 38/65] Duplicated --- kratos/mpi/tests/test_utilities/mpi_cpp_test_utilities.cpp | 3 --- 1 file changed, 3 deletions(-) diff --git a/kratos/mpi/tests/test_utilities/mpi_cpp_test_utilities.cpp b/kratos/mpi/tests/test_utilities/mpi_cpp_test_utilities.cpp index 63cdf1ebc529..f5369eac6e0c 100644 --- a/kratos/mpi/tests/test_utilities/mpi_cpp_test_utilities.cpp +++ b/kratos/mpi/tests/test_utilities/mpi_cpp_test_utilities.cpp @@ -187,9 +187,6 @@ void MPICppTestUtilities::GenerateDistributedTriangleMesh( const DataCommunicator& rDataCommunicator ) { - // Set MPI communicator - ModelPartCommunicatorUtilities::SetMPICommunicator(rModelPart, rDataCommunicator); - // Add variables rModelPart.AddNodalSolutionStepVariable(PARTITION_INDEX); From 1c44c8750fcf76a36af7ebbc34acd66dfe4ba9b1 Mon Sep 17 00:00:00 2001 From: Vicente Mataix Ferrandiz Date: Wed, 7 Aug 2024 19:12:33 +0200 Subject: [PATCH 39/65] [Core] Missing hanging nodes in corresponding model parts to be added --- kratos/processes/skin_detection_process.cpp | 47 ++++++++++++++++++++- 1 file changed, 46 insertions(+), 1 deletion(-) diff --git a/kratos/processes/skin_detection_process.cpp b/kratos/processes/skin_detection_process.cpp index 8bf9a727d26d..dff563609dcb 100644 --- a/kratos/processes/skin_detection_process.cpp +++ b/kratos/processes/skin_detection_process.cpp @@ -219,8 +219,53 @@ void SkinDetectionProcess::FillAuxiliaryModelPart( const SizeType echo_level = mThisParameters["echo_level"].GetInt(); KRATOS_INFO_IF("SkinDetectionProcess", echo_level > 0) << rInverseFaceMap.size() << " have been created" << std::endl; - // Now we set the flag on the nodes. The list of nodes of the auxiliary model part + // Verify that nodes are in the corresponding model part auto& r_nodes_array = rAuxiliaryModelPart.Nodes(); + const auto& r_data_communicator = mrModelPart.GetCommunicator().GetDataCommunicator(); + if (r_data_communicator.IsDistributed()) { + // Wait until all the nodes are created + r_data_communicator.Barrier(); + + // First look into potential nodes to ensure + const int rank = r_data_communicator.Rank(); + const int world_size = r_data_communicator.Size(); + std::vector> nodes_to_ensure(world_size); + for (auto& r_node : r_nodes_array) { + const int partition_index = r_node.FastGetSolutionStepValue(PARTITION_INDEX); + if (rank != partition_index) { + nodes_to_ensure[partition_index].push_back(r_node.Id()); + } + } + + // Now we ensure the nodes + int tag_send = 0; + int tag_recv = 0; + std::vector nodes_to_bring; + for (int i = 0; i < world_size; ++i) { + if (i != rank) { + // Compute the tag hashing origin rank and destination rank + tag_send = 1000 * rank + i; + r_data_communicator.Send(nodes_to_ensure[i], i, tag_send); + } else { + for (int j = 0; j < world_size; ++j) { + if (j != rank) { + // Compute the tag hashing origin rank and destination rank + tag_recv = 1000 * j + rank; + std::vector rec_nodes_to_ensure; + r_data_communicator.Recv(rec_nodes_to_ensure, j, tag_recv); + for (auto node_id : rec_nodes_to_ensure) { + if (!rAuxiliaryModelPart.HasNode(node_id)) { + nodes_to_bring.push_back(node_id); + } + } + } + } + } + } + rAuxiliaryModelPart.AddNodes(nodes_to_bring); + } + + // Now we set the flag on the nodes. The list of nodes of the auxiliary model part VariableUtils().SetFlag(INTERFACE, true, r_nodes_array); // In case we are in MPI we synchronize the INTERFACE flag From 757550f67a9a53d947d0d4a6b018c575dc3cf15e Mon Sep 17 00:00:00 2001 From: Vicente Mataix Ferrandiz Date: Tue, 6 Aug 2024 11:51:48 +0200 Subject: [PATCH 40/65] Unused --- kratos/tests/test_skin_detection_process.py | 1 - 1 file changed, 1 deletion(-) diff --git a/kratos/tests/test_skin_detection_process.py b/kratos/tests/test_skin_detection_process.py index 59e07513cca8..270d14a92207 100644 --- a/kratos/tests/test_skin_detection_process.py +++ b/kratos/tests/test_skin_detection_process.py @@ -3,7 +3,6 @@ import KratosMultiphysics import KratosMultiphysics.KratosUnittest as KratosUnittest import KratosMultiphysics.kratos_utilities as kratos_utils -from KratosMultiphysics.gid_output_process import GiDOutputProcess from KratosMultiphysics.testing.utilities import ReadModelPart def GetFilePath(fileName): From 6b33233bad2c738abcf807fde037d2f5b6b88306 Mon Sep 17 00:00:00 2001 From: Vicente Mataix Ferrandiz Date: Tue, 6 Aug 2024 12:08:44 +0200 Subject: [PATCH 41/65] Warning level --- kratos/tests/test_skin_detection_process.py | 1 + 1 file changed, 1 insertion(+) diff --git a/kratos/tests/test_skin_detection_process.py b/kratos/tests/test_skin_detection_process.py index 270d14a92207..f41fa4c209f6 100644 --- a/kratos/tests/test_skin_detection_process.py +++ b/kratos/tests/test_skin_detection_process.py @@ -88,4 +88,5 @@ def test_NotOnSubModelPartSkinDetectionProcess(self): self.assertEqual(self.model_part.NumberOfConditions(), 112) if __name__ == '__main__': + KratosMultiphysics.Logger.GetDefaultOutput().SetSeverity(KratosMultiphysics.Logger.Severity.WARNING) KratosUnittest.main() From a6ee7a863a4aea2c725d92e09534f8f01a5c8008 Mon Sep 17 00:00:00 2001 From: Vicente Mataix Ferrandiz Date: Tue, 6 Aug 2024 15:41:06 +0200 Subject: [PATCH 42/65] Extend test --- kratos/tests/test_skin_detection_process.py | 29 ++++++++++++++++++++- 1 file changed, 28 insertions(+), 1 deletion(-) diff --git a/kratos/tests/test_skin_detection_process.py b/kratos/tests/test_skin_detection_process.py index f41fa4c209f6..72f989c8981f 100644 --- a/kratos/tests/test_skin_detection_process.py +++ b/kratos/tests/test_skin_detection_process.py @@ -25,7 +25,7 @@ def setUpClass(cls): def tearDownClass(cls): RemoveFiles(cls.mdpa_name) - def test_SkinDetectionProcess(self): + def test_BasicSkinDetectionProcess(self): # We set a flag in the already known node in the skin for node in self.model_part.GetSubModelPart("Skin_Part").Nodes: node.Set(KratosMultiphysics.ACTIVE, True) @@ -36,6 +36,33 @@ def test_SkinDetectionProcess(self): for node in self.model_part.Nodes: self.assertEqual(node.Is(KratosMultiphysics.INTERFACE), node.Is(KratosMultiphysics.ACTIVE)) + # Check the number of conditions created + data_comm = self.model_part.GetCommunicator().GetDataCommunicator() + if data_comm.IsDistributed(): + number_of_conditions = 0 + number_of_conditions += self.model_part.NumberOfConditions() + global_number_of_conditions = data_comm.SumAll(number_of_conditions) + self.assertEqual(global_number_of_conditions, 128) + else: + self.assertEqual(self.model_part.NumberOfConditions(), 128) + + # TODO: To debug, failing with 4 partitions + # # The data communicator + # comm = self.model_part.GetCommunicator() + # data_comm = comm.GetDataCommunicator() + + # # Construct and execute the Parallel fill communicator + # if data_comm.IsDistributed(): + # import KratosMultiphysics.mpi as KratosMPI + # parallel_fill_communicator = KratosMPI.ParallelFillCommunicator(self.model_part, data_comm) + # parallel_fill_communicator.Execute() + + # # Check the number of conditions created + # if data_comm.IsDistributed(): + # self.assertEqual(comm.GlobalNumberOfConditions(), 128) + # else: + # self.assertEqual(self.model_part.NumberOfConditions(), 128) + def test_SkinDetectionProcessWithAssign(self): skin_detection_parameters = KratosMultiphysics.Parameters(""" { From 3b80755ea13221e4d54bdaeb4b0d3e58515b64c7 Mon Sep 17 00:00:00 2001 From: Vicente Mataix Ferrandiz Date: Tue, 6 Aug 2024 15:41:36 +0200 Subject: [PATCH 43/65] Minor --- kratos/tests/test_skin_detection_process.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/kratos/tests/test_skin_detection_process.py b/kratos/tests/test_skin_detection_process.py index 72f989c8981f..64340870af83 100644 --- a/kratos/tests/test_skin_detection_process.py +++ b/kratos/tests/test_skin_detection_process.py @@ -25,7 +25,7 @@ def setUpClass(cls): def tearDownClass(cls): RemoveFiles(cls.mdpa_name) - def test_BasicSkinDetectionProcess(self): + def test_SkinDetectionProcess(self): # We set a flag in the already known node in the skin for node in self.model_part.GetSubModelPart("Skin_Part").Nodes: node.Set(KratosMultiphysics.ACTIVE, True) From b690f8000ba8b2b7391ded80aaab4946f20aeb99 Mon Sep 17 00:00:00 2001 From: Vicente Mataix Ferrandiz Date: Tue, 6 Aug 2024 16:47:02 +0200 Subject: [PATCH 44/65] Cleaning --- kratos/tests/test_skin_detection_process.py | 33 +++++++-------------- 1 file changed, 11 insertions(+), 22 deletions(-) diff --git a/kratos/tests/test_skin_detection_process.py b/kratos/tests/test_skin_detection_process.py index 64340870af83..cd65ac6312ed 100644 --- a/kratos/tests/test_skin_detection_process.py +++ b/kratos/tests/test_skin_detection_process.py @@ -36,33 +36,22 @@ def test_SkinDetectionProcess(self): for node in self.model_part.Nodes: self.assertEqual(node.Is(KratosMultiphysics.INTERFACE), node.Is(KratosMultiphysics.ACTIVE)) + # The data communicator + comm = self.model_part.GetCommunicator() + data_comm = comm.GetDataCommunicator() + + # Construct and execute the Parallel fill communicator + if data_comm.IsDistributed(): + import KratosMultiphysics.mpi as KratosMPI + parallel_fill_communicator = KratosMPI.ParallelFillCommunicator(self.model_part, data_comm) + parallel_fill_communicator.Execute() + # Check the number of conditions created - data_comm = self.model_part.GetCommunicator().GetDataCommunicator() if data_comm.IsDistributed(): - number_of_conditions = 0 - number_of_conditions += self.model_part.NumberOfConditions() - global_number_of_conditions = data_comm.SumAll(number_of_conditions) - self.assertEqual(global_number_of_conditions, 128) + self.assertEqual(comm.GlobalNumberOfConditions(), 128) else: self.assertEqual(self.model_part.NumberOfConditions(), 128) - # TODO: To debug, failing with 4 partitions - # # The data communicator - # comm = self.model_part.GetCommunicator() - # data_comm = comm.GetDataCommunicator() - - # # Construct and execute the Parallel fill communicator - # if data_comm.IsDistributed(): - # import KratosMultiphysics.mpi as KratosMPI - # parallel_fill_communicator = KratosMPI.ParallelFillCommunicator(self.model_part, data_comm) - # parallel_fill_communicator.Execute() - - # # Check the number of conditions created - # if data_comm.IsDistributed(): - # self.assertEqual(comm.GlobalNumberOfConditions(), 128) - # else: - # self.assertEqual(self.model_part.NumberOfConditions(), 128) - def test_SkinDetectionProcessWithAssign(self): skin_detection_parameters = KratosMultiphysics.Parameters(""" { From c4ff337ff4819f1fdb9880d5393ebc9d0bd2f7a5 Mon Sep 17 00:00:00 2001 From: Vicente Mataix Ferrandiz Date: Wed, 7 Aug 2024 10:37:28 +0200 Subject: [PATCH 45/65] Refactor to avoid memory issue --- kratos/tests/test_skin_detection_process.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/kratos/tests/test_skin_detection_process.py b/kratos/tests/test_skin_detection_process.py index cd65ac6312ed..ae37d183ede0 100644 --- a/kratos/tests/test_skin_detection_process.py +++ b/kratos/tests/test_skin_detection_process.py @@ -37,8 +37,7 @@ def test_SkinDetectionProcess(self): self.assertEqual(node.Is(KratosMultiphysics.INTERFACE), node.Is(KratosMultiphysics.ACTIVE)) # The data communicator - comm = self.model_part.GetCommunicator() - data_comm = comm.GetDataCommunicator() + data_comm = self.model_part.GetCommunicator().GetDataCommunicator() # Construct and execute the Parallel fill communicator if data_comm.IsDistributed(): @@ -48,7 +47,7 @@ def test_SkinDetectionProcess(self): # Check the number of conditions created if data_comm.IsDistributed(): - self.assertEqual(comm.GlobalNumberOfConditions(), 128) + self.assertEqual(self.model_part.GetCommunicator().GlobalNumberOfConditions(), 128) else: self.assertEqual(self.model_part.NumberOfConditions(), 128) From eec229e3ef7851c947bc4f5204dee8516a47c613 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vicente=20Mataix=20Ferr=C3=A1ndiz?= Date: Thu, 8 Aug 2024 10:26:34 +0200 Subject: [PATCH 46/65] [Core] Extra space in `skin_detection_process.cpp` --- kratos/processes/skin_detection_process.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/kratos/processes/skin_detection_process.cpp b/kratos/processes/skin_detection_process.cpp index dff563609dcb..9846f3472b60 100644 --- a/kratos/processes/skin_detection_process.cpp +++ b/kratos/processes/skin_detection_process.cpp @@ -269,7 +269,7 @@ void SkinDetectionProcess::FillAuxiliaryModelPart( VariableUtils().SetFlag(INTERFACE, true, r_nodes_array); // In case we are in MPI we synchronize the INTERFACE flag - mrModelPart.GetCommunicator().SynchronizeOrNodalFlags(INTERFACE); + mrModelPart.GetCommunicator().SynchronizeOrNodalFlags(INTERFACE); } /***********************************************************************************/ @@ -578,4 +578,4 @@ template class SkinDetectionProcess<2>; template class SkinDetectionProcess<3>; // class SkinDetectionProcess -} // namespace Kratos \ No newline at end of file +} // namespace Kratos From 418d68342d4fa048b264d348895ba156f7246ead Mon Sep 17 00:00:00 2001 From: aronnoordam Date: Thu, 8 Aug 2024 15:13:43 +0200 Subject: [PATCH 47/65] corrected variable names and comments --- .../strip_load_semi_analytical_solution.py | 255 +++++++++++------- 1 file changed, 158 insertions(+), 97 deletions(-) diff --git a/applications/GeoMechanicsApplication/tests/strip_load_semi_analytical_solution.py b/applications/GeoMechanicsApplication/tests/strip_load_semi_analytical_solution.py index 034bbe41c7d7..387aba88464d 100644 --- a/applications/GeoMechanicsApplication/tests/strip_load_semi_analytical_solution.py +++ b/applications/GeoMechanicsApplication/tests/strip_load_semi_analytical_solution.py @@ -1,3 +1,5 @@ +from typing import Callable + import math import cmath @@ -13,7 +15,7 @@ class StripLoad: - young (float): Young's modulus [Pa] - poisson (float): Poisson's ratio [-] - density (float): density [kg/m^3] - - load (float): load value [N/m] + - load (float): load value [N/m^2] - integral_stepsize (float): dimensionless time step size for solving integrals (default = 0.001) [-] - shear_modulus (float): shear modulus [Pa] - p_wave_modulus (float): P-wave modulus [Pa] @@ -37,7 +39,7 @@ def __init__(self, - youngs_modulus (float): Young's modulus [Pa] - poisson_ratio (float): Poisson's ratio [-] - density (float): density [kg/m^3] - - load (float): load value [N/m] + - load (float): load value [N/m^2] - integral_stepsize (float): dimensionless time step size for solving integrals (default = 0.001) [-] """ @@ -60,27 +62,81 @@ def __init__(self, # epsilon to avoid division by zero self.epsilon = self.integral_stepsize**2 - def __k1(self, x_norm: float, z_norm: float, kappa: float) -> float: + @staticmethod + def __calculate_radius(x_norm: float, z_norm: float) -> float: """ - Imaginary part of the imaginary factor for first integral + Calculate the radius Args: - x_norm (float): dimensionless x coordinate normalised with the line load length [-] - z_norm (float): dimensionless z coordinate normalised with the line load length [-] - - kappa (float): dimensionless time parameter, normalised with line load length and shear wave velocity [-] + + Returns: + - float: dimensionless radius [-] + + """ + + return math.sqrt(x_norm**2 + z_norm**2) + + def __simpsons_rule(self, lower_limit: float, upper_limit: float, function: Callable, x_norm: float, z_norm: float, + radius: float, k0: float) -> float: + """ + Calculate the integral of a function using Simpson's rule + + Args: + - lower_limit (float): lower limit of the integral [-] + - upper_limit (float): upper limit of the integral [-] + - function (Callable): function to integrate [-] + - x_norm (float): dimensionless x coordinate normalised with the line load length [-] + - z_norm (float): dimensionless z coordinate normalised with the line load length [-] + - radius (float): dimensionless radius [-] + - k0 (float): initial imaginary factor for the integral [-] + + Returns: + - float: integral of the function [-] + + """ + + integral = 0 + # set dimensionless integration time parameter to lower limit + kappa = lower_limit + + # solve integral with Simpson's rule + h_1 = 0 + while kappa ** 2 < upper_limit ** 2: + kappa += self.integral_stepsize + h_2 = function(x_norm, z_norm, kappa, radius, k0) + + kappa += self.integral_stepsize + h_3 = function(x_norm, z_norm, kappa, radius, k0) + + integral += (h_1 + 4 * h_2 + h_3) * self.integral_stepsize / 3 + h_1 = h_3 + + return integral + + def __k1(self, x_norm: float, z_norm: float, kappa: float) -> float: + """ + Imaginary part of the imaginary factor for first integral + + Args: + - x_norm (float): dimensionless x coordinate normalized with the line load length [-] + - z_norm (float): dimensionless z coordinate normalized with the line load length [-] + - kappa (float): dimensionless integration time parameter [-] Returns: - float: imaginary factor for the first integral [-] + """ - radius = math.sqrt(x_norm**2 + z_norm**2) + radius = self.__calculate_radius(x_norm, z_norm) kappa_r = kappa**2 - self.eta**2 * radius**2 if kappa_r <= 0: k1 = 0 else: - # dimensionless complex variables following from laplace and fourier transforms + # dimensionless complex variables following from Laplace and Fourier transforms a = complex(kappa * math.sqrt(kappa_r), self.eta**2 * x_norm * z_norm) beta_p = complex(kappa * x_norm / radius**2, (z_norm / radius**2) * math.sqrt(kappa_r)) b1 = 1 - 2 * beta_p**2 @@ -95,14 +151,34 @@ def __k1(self, x_norm: float, z_norm: float, kappa: float) -> float: return k1 - def __f1(self, x_norm: float, z_norm: float, kappa: float) -> float: + def __h1(self, x_norm: float, z_norm: float, kappa: float, radius: float, k1_0: float) -> float: + """ + Integrand of the first integral + + Args: + - x_norm (float): dimensionless x coordinate normalised with the line load length [-] + - z_norm (float): dimensionless z coordinate normalised with the line load length [-] + - kappa (float): dimensionless integration time parameter [-] + - radius (float): dimensionless radius [-] + - k1_0 (float): initial imaginary factor for the first integral [-] + + Returns: + - float: integrand of the first integral [-] + + """ + pz = kappa ** 2 - self.eta ** 2 * z_norm ** 2 + pr = kappa ** 2 - self.eta ** 2 * radius ** 2 + + return (self.__k1(x_norm, z_norm, kappa) - k1_0) / (pz * math.sqrt(pr)) + + def __f1(self, x_norm: float, z_norm: float, tau: float) -> float: """ Calculates the first integral Args: - x_norm (float): dimensionless x coordinate normalised with the line load length [-] - z_norm (float): dimensionless z coordinate normalised with the line load length [-] - - kappa (float): dimensionless time parameter, normalised with line load length and shear wave velocity [-] + - tau (float): dimensionless time parameter, normalised with line load length and shear wave velocity [-] Returns: - float: first integral solution [-] @@ -113,43 +189,26 @@ def __f1(self, x_norm: float, z_norm: float, kappa: float) -> float: if abs(x_norm) < self.epsilon: x_norm = self.epsilon if x_norm >= 0 else -self.epsilon - radius = math.sqrt(x_norm**2 + z_norm**2) + radius = self.__calculate_radius(x_norm, z_norm) # dimensionless time parameter - time_parameter = self.eta * radius + self.epsilon + lower_limit_time = self.eta * radius + self.epsilon - k1_ini = self.__k1(x_norm, z_norm, time_parameter) + k1_ini = self.__k1(x_norm, z_norm, lower_limit_time) - x_new = max(math.sqrt(radius**2 - z_norm**2), self.epsilon) + abs_x_norm = abs(x_norm) # solve first integral with simpson's rule - if kappa**2 <= time_parameter**2: + if tau**2 <= lower_limit_time**2: first_integral = 0 else: - first_integral = ((k1_ini / (self.eta**2 * z_norm * x_new)) * math.atan( - (z_norm * math.sqrt(kappa**2 - self.eta**2 * radius**2)) / (kappa * x_new))) - h1_1 = 0 - - # solve first integral with simpson's rule - while time_parameter**2 < kappa**2: - time_parameter += self.integral_stepsize - - pz = time_parameter**2 - self.eta**2 * z_norm**2 - pr = time_parameter**2 - self.eta**2 * radius**2 + first_integral = ((k1_ini / (self.eta**2 * z_norm * abs_x_norm)) * math.atan( + (z_norm * math.sqrt(tau**2 - self.eta**2 * radius**2)) / (tau * abs_x_norm))) - h1_2 = (self.__k1(x_norm, z_norm, time_parameter) - k1_ini) / (pz * math.sqrt(pr)) + # solve first integral with Simpson's rule + first_integral += self.__simpsons_rule(lower_limit_time, tau, self.__h1, x_norm, z_norm, radius, k1_ini) - time_parameter += self.integral_stepsize - - pz = time_parameter**2 - self.eta**2 * z_norm**2 - pr = time_parameter**2 - self.eta**2 * radius**2 - - h1_3 = (self.__k1(x_norm, z_norm, time_parameter) - k1_ini) / (pz * math.sqrt(pr)) - - first_integral += (h1_1 + 4 * h1_2 + h1_3) * self.integral_stepsize / 3 - h1_1 = h1_3 - - if (kappa > self.eta * z_norm) and (x_norm < 0): + if (tau > self.eta * z_norm) and (x_norm < 0): first_integral += 1 return first_integral @@ -161,16 +220,20 @@ def __k2(self, x_norm: float, z_norm: float, kappa: float) -> float: Args: - x_norm (float): dimensionless x coordinate normalised with the line load length [-] - z_norm (float): dimensionless z coordinate normalised with the line load length [-] - - kappa (float): dimensionless time parameter, normalised with line load length and shear wave velocity [-] + - kappa (float): dimensionless integration time parameter [-] + + Returns: + - float: factor for the second integral [-] + """ - radius = math.sqrt(x_norm**2 + z_norm**2) + radius = self.__calculate_radius(x_norm, z_norm) kappa_r = kappa**2 - radius**2 if kappa_r <= 0: k2 = 0 else: - # dimensionless complex variables following from laplace and fourier transforms + # dimensionless complex variables following from Laplace and Fourier transforms beta_s = complex(kappa * x_norm / radius**2, (z_norm / radius**2) * math.sqrt(kappa_r)) b1 = 1 - 2 * beta_s**2 gp = cmath.sqrt(self.eta**2 - beta_s**2) @@ -183,152 +246,150 @@ def __k2(self, x_norm: float, z_norm: float, kappa: float) -> float: return k2 - def __h2(self, x_norm: float, z_norm: float, time_parameter: float, radius: float, k2_0: float) -> float: + def __h2(self, x_norm: float, z_norm: float, kappa: float, radius: float, k2_0: float) -> float: """ - Imaginary factor for the second integral + Integrand of the second integral Args: - x_norm (float): dimensionless x coordinate normalised with the line load length [-] - z_norm (float): dimensionless z coordinate normalised with the line load length [-] - - time_parameter (float): dimensionless integration time parameter [-] + - kappa (float): dimensionless integration time parameter [-] - radius (float): dimensionless radius [-] - k2_0 (float): initial imaginary factor for the second integral [-] + + Returns: + - float: integrand of the second integral [-] + """ - pr = time_parameter**2 - radius**2 - return (self.__k2(x_norm, z_norm, time_parameter) - k2_0) / math.sqrt(pr) + pr = kappa**2 - radius**2 + return (self.__k2(x_norm, z_norm, kappa) - k2_0) / math.sqrt(pr) - def __f2(self, x_norm: float, z_norm: float, kappa: float) -> float: + def __f2(self, x_norm: float, z_norm: float, tau: float) -> float: """ Calculates the second integral Args: - x_norm (float): dimensionless x coordinate normalised with the line load length [-] - z_norm (float): dimensionless z coordinate normalised with the line load length [-] - - kappa (float): dimensionless time parameter, normalised with line load length and shear wave velocity [-] + - tau (float): dimensionless time parameter, normalised with line load length and shear wave velocity [-] Returns: - float: second integral solution [-] + """ if abs(x_norm) < self.epsilon: x_norm = self.epsilon if x_norm >= 0 else -self.epsilon - radius = math.sqrt(x_norm**2 + z_norm**2) + radius = self.__calculate_radius(x_norm, z_norm) - kappa_r = kappa / radius + tau_r = tau / radius - time_parameter = radius + self.epsilon + lower_limit_time = radius + self.epsilon - k2 = self.__k2(x_norm, z_norm, time_parameter) + k2 = self.__k2(x_norm, z_norm, lower_limit_time) - if kappa**2 <= time_parameter**2: + if tau**2 <= lower_limit_time**2: second_integral = 0 else: - second_integral = k2 * math.log(kappa_r + math.sqrt(kappa_r**2 - 1)) - h2_1 = 0 + second_integral = k2 * math.log(tau_r + math.sqrt(tau_r**2 - 1)) # solve second integral with simpson's rule - while time_parameter**2 < kappa**2: - - time_parameter += self.integral_stepsize - h2_2 = self.__h2(x_norm, z_norm, time_parameter, radius, k2) - - time_parameter += self.integral_stepsize - h2_3 = self.__h2(x_norm, z_norm, time_parameter, radius, k2) - - second_integral += (h2_1 + 4 * h2_2 + h2_3) * self.integral_stepsize / 3 - h2_1 = h2_3 + second_integral += self.__simpsons_rule(lower_limit_time, tau, self.__h2, x_norm, z_norm, radius, k2) return second_integral - def __k3(self, x_norm: float, z_norm: float, kappa: float) -> float: + def __h3(self, x_norm: float, z_norm: float, kappa: float) -> float: """ - Factor for the third integral + Integrand of the third integral Args: - x_norm (float): dimensionless x coordinate normalised with the line load length [-] - z_norm (float): dimensionless z coordinate normalised with the line load length [-] - - kappa (float): dimensionless time parameter, normalised with line load length and shear wave velocity [-] + - kappa (float): dimensionless integration time parameter [-] Returns: - - float: imaginary factor for the third integral [-] + - float: integrand of the third integral [-] """ - radius = math.sqrt(x_norm**2 + z_norm**2) + radius = self.__calculate_radius(x_norm, z_norm) - kappa_q = self.eta * abs(x_norm) + z_norm * math.sqrt(1 - self.eta**2) + tau_q = self.eta * abs(x_norm) + z_norm * math.sqrt(1 - self.eta**2) - if (kappa**2 >= radius**2) or (kappa <= kappa_q) or (x_norm**2 <= self.eta**2 * radius**2): - k3 = 0 + if (kappa**2 >= radius**2) or (kappa <= tau_q) or (x_norm**2 <= self.eta**2 * radius**2): + h3 = 0 else: - beta_q = x_norm * kappa / radius**2 - (z_norm / radius**2) * math.sqrt(radius**2 - kappa**2) + beta_q = (x_norm * kappa - z_norm * math.sqrt(radius**2 - kappa**2)) / radius**2 b2 = (1 - 2 * beta_q**2)**2 numerator = 4 * beta_q * (1 - beta_q**2) * b2 * math.sqrt(beta_q**2 - self.eta**2) denominator = b2**2 + 16 * beta_q**4 * (1 - beta_q**2) * (beta_q**2 - self.eta**2) - k3 = -numerator / (math.pi * denominator * math.sqrt(radius**2 - kappa**2)) + h3 = -numerator / (math.pi * denominator * math.sqrt(radius**2 - kappa**2)) - return k3 + return h3 - def __f3(self, x_norm: float, z_norm: float, kappa: float) -> float: + def __f3(self, x_norm: float, z_norm: float, tau: float) -> float: """ Calculates the third integral Args: - x_norm (float): dimensionless x coordinate normalised with the line load length [-] - z_norm (float): dimensionless z coordinate normalised with the line load length [-] - - kappa (float): dimensionless time parameter, normalised with line load length and shear wave velocity [-] + - tau (float): dimensionless time parameter, normalised with line load length and shear wave velocity [-] Returns: - float: third integral solution [-] """ - radius = math.sqrt(x_norm**2 + z_norm**2) - kappa_s = radius - kappa_q = self.eta * abs(x_norm) + z_norm * math.sqrt(1 - self.eta**2) + radius = self.__calculate_radius(x_norm, z_norm) + tau_s = radius + tau_q = self.eta * abs(x_norm) + z_norm * math.sqrt(1 - self.eta**2) - if (kappa <= kappa_q) or (x_norm**2 <= self.eta**2 * radius**2): + if (tau <= tau_q) or (x_norm**2 <= self.eta**2 * radius**2): third_integral = 0 else: - # kappa_s is the minimum of kappa_s and kappa - kappa_s = min(kappa, kappa_s) + # tau_s is the minimum of tau_s and tau + tau_s = min(tau, tau_s) - # determine integral stepsize as a function of kappa_s and kappa_q + # determine integral stepsize as a function of tau_s and tau_q n_steps = 1000 - stepsize = (kappa_s - kappa_q) / n_steps + stepsize = (tau_s - tau_q) / n_steps third_integral = 0 - time_parameter = kappa_q + stepsize / 2 + lower_limit_time = tau_q + stepsize / 2 + + # set dimensionless integration time parameter to lower limit + kappa = lower_limit_time # solve third integral - while time_parameter < kappa_s: - third_integral += self.__k3(x_norm, z_norm, time_parameter) * stepsize - time_parameter += stepsize + while kappa < tau_s: + third_integral += self.__h3(x_norm, z_norm, kappa) * stepsize + kappa += stepsize return third_integral - def calculate_normalised_vertical_stress(self, x_norm: float, z_norm: float, kappa: float): + def calculate_normalised_vertical_stress(self, x_norm: float, z_norm: float, tau: float): """ Calculate the normalised vertical stress Args: - x_norm (float): dimensionless x coordinate normalised with the line load length [-] - z_norm (float): dimensionless z coordinate normalised with the line load length [-] - - kappa (float): dimensionless time parameter, normalised with line load length and shear wave velocity [-] + - tau (float): dimensionless time parameter, normalised with line load length and shear wave velocity [-] Returns: - float: normalised vertical stress [-] """ - normalised_vertical_stress = self.__f1(x_norm + 1, z_norm, kappa) - self.__f1(x_norm - 1, z_norm, kappa) + \ - self.__f2(x_norm + 1, z_norm, kappa) - self.__f2(x_norm - 1, z_norm, kappa) + \ - self.__f3(x_norm + 1, z_norm, kappa) - self.__f3(x_norm - 1, z_norm, kappa) + normalised_vertical_stress = self.__f1(x_norm + 1, z_norm, tau) - self.__f1(x_norm - 1, z_norm, tau) + \ + self.__f2(x_norm + 1, z_norm, tau) - self.__f2(x_norm - 1, z_norm, tau) + \ + self.__f3(x_norm + 1, z_norm, tau) - self.__f3(x_norm - 1, z_norm, tau) return normalised_vertical_stress def calculate_vertical_stress(self, x: float, z: float, t: float, load_length: float, load_value: float) -> float: @@ -340,7 +401,7 @@ def calculate_vertical_stress(self, x: float, z: float, t: float, load_length: f - z (float): depth from load [m] - t (float): time [s] - load_length (float): length of the line load [m] - - load_value (float): value of the line load [N/m] + - load_value (float): value of the line load [N/m^2] Returns: - float: vertical stress [Pa] @@ -348,8 +409,8 @@ def calculate_vertical_stress(self, x: float, z: float, t: float, load_length: f """ x_norm = x / load_length z_norm = z / load_length - kappa = self.cs * t / load_length + tau = self.cs * t / load_length - normalised_vertical_stress = self.calculate_normalised_vertical_stress(x_norm, z_norm, kappa) - vertical_stress = normalised_vertical_stress * load_value * load_length + normalised_vertical_stress = self.calculate_normalised_vertical_stress(x_norm, z_norm, tau) + vertical_stress = normalised_vertical_stress * load_value return vertical_stress From 51ec3a2af84b94f040a25ca5b09459ed1d620617 Mon Sep 17 00:00:00 2001 From: Suneth Warnakulasuriya <7856520+sunethwarna@users.noreply.github.com> Date: Fri, 9 Aug 2024 11:04:58 +0530 Subject: [PATCH 48/65] change opt_prob_ascii output --- ...timization_problem_ascii_output_process.py | 24 ++++++++++--------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git a/applications/OptimizationApplication/python_scripts/processes/optimization_problem_ascii_output_process.py b/applications/OptimizationApplication/python_scripts/processes/optimization_problem_ascii_output_process.py index 02d32353a7ff..c569fecbadf5 100644 --- a/applications/OptimizationApplication/python_scripts/processes/optimization_problem_ascii_output_process.py +++ b/applications/OptimizationApplication/python_scripts/processes/optimization_problem_ascii_output_process.py @@ -95,21 +95,21 @@ def __init__(self, parameters: Kratos.Parameters, optimization_problem: Optimiza raise RuntimeError("The \"bool_values\" should have only two strings corresponding to False and True values in the mentioned order.") self.list_of_components: 'list[Union[str, ResponseFunction, Control, ExecutionPolicy]]' = [] - list_of_component_names = parameters["list_of_output_components"].GetStringArray() - if len(list_of_component_names) == 1 and list_of_component_names[0] == "all": - list_of_component_names = GetAllComponentFullNamesWithData(optimization_problem) - - for component_name in list_of_component_names: - self.list_of_components.append(GetComponentHavingDataByFullName(component_name, optimization_problem)) - self.list_of_headers: 'list[tuple[Any, dict[str, Header]]]' = [] self.initialized_headers = False + self.list_of_component_names = parameters["list_of_output_components"].GetStringArray() def IsOutputStep(self) -> bool: return True def PrintOutput(self) -> None: if not self.initialized_headers: + if len(self.list_of_component_names) == 1 and self.list_of_component_names[0] == "all": + self.list_of_component_names = GetAllComponentFullNamesWithData(self.optimization_problem) + + for component_name in self.list_of_component_names: + self.list_of_components.append(GetComponentHavingDataByFullName(component_name, self.optimization_problem)) + # now get the buffered data headers self.list_of_headers = self._GetHeaders(lambda x: x.GetBufferedData()) # write the ehader information @@ -168,10 +168,12 @@ def _WriteHeaders(self): componend_data_view = ComponentDataView(component, self.optimization_problem) buffered_dict = componend_data_view.GetUnBufferedData() component_name = componend_data_view.GetComponentName() - msg_header = f"{msg_header}# \t" + component_name + ":\n" - for k, header in header_info_dict.items(): - component_name_header = header.GetHeaderName().strip()[len(component_name)+1:] - msg_header = f"{msg_header}# \t\t" + component_name_header + ": " + header.GetValueStr(buffered_dict[k]).strip() + "\n" + # check if there are values to be written under the component name, if not skip the component. + if len(header_info_dict): + msg_header = f"{msg_header}# \t" + component_name + ":\n" + for k, header in header_info_dict.items(): + component_name_header = header.GetHeaderName().strip()[len(component_name)+1:] + msg_header = f"{msg_header}# \t\t" + component_name_header + ": " + header.GetValueStr(buffered_dict[k]).strip() + "\n" msg_header = f"{msg_header}# ------------ End of initial values ------------\n" msg_header = f"{msg_header}# -----------------------------------------------\n" From 721e8b1d7f8a0bd95e05ef815fcc17c2eb480f53 Mon Sep 17 00:00:00 2001 From: Suneth Warnakulasuriya <7856520+sunethwarna@users.noreply.github.com> Date: Fri, 9 Aug 2024 11:05:18 +0530 Subject: [PATCH 49/65] add scientific notation support --- .../utilities/helper_utilities.py | 20 +++++++------------ 1 file changed, 7 insertions(+), 13 deletions(-) diff --git a/applications/OptimizationApplication/python_scripts/utilities/helper_utilities.py b/applications/OptimizationApplication/python_scripts/utilities/helper_utilities.py index d7fd80c550af..756e9875dd96 100644 --- a/applications/OptimizationApplication/python_scripts/utilities/helper_utilities.py +++ b/applications/OptimizationApplication/python_scripts/utilities/helper_utilities.py @@ -90,20 +90,14 @@ def GetAllComponentFullNamesWithData(optimization_problem: OptimizationProblem) return list_of_components_full_names_with_data def GetComponentHavingDataByFullName(component_full_name: str, optimization_problem: OptimizationProblem) -> Any: - data_container = optimization_problem.GetProblemDataContainer() - - name_data = component_full_name.split(".") + for component_type in optimization_problem.GetComponentContainer().keys(): + snake_case_name = Kratos.StringUtilities.ConvertCamelCaseToSnakeCase(component_type.__name__) + if component_full_name.startswith(snake_case_name): + return optimization_problem.GetComponent(component_full_name[len(snake_case_name) + 1:], component_type) - if len(name_data) == 1: - if data_container.HasValue("object") and data_container["object"].HasValue(component_full_name): - return component_full_name - else: - component_type_str = Kratos.StringUtilities.ConvertSnakeCaseToCamelCase(name_data[0]) - component_name = name_data[1] - - for component_type in optimization_problem.GetComponentContainer().keys(): - if component_type.__name__ == component_type_str: - return optimization_problem.GetComponent(component_name, component_type) + data_container = optimization_problem.GetProblemDataContainer() + if data_container.HasValue("object") and data_container["object"].HasValue(component_full_name): + return component_full_name msg = "" for component_type, dict_of_components in optimization_problem.GetComponentContainer().items(): From 355e28aa9b536b5cbaf85bb87a50ef118ea0a69c Mon Sep 17 00:00:00 2001 From: Suneth Warnakulasuriya <7856520+sunethwarna@users.noreply.github.com> Date: Fri, 9 Aug 2024 11:05:35 +0530 Subject: [PATCH 50/65] add scientific notation support --- .../utilities/response_utilities.py | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/applications/OptimizationApplication/python_scripts/utilities/response_utilities.py b/applications/OptimizationApplication/python_scripts/utilities/response_utilities.py index 7942c0cca722..50436859eca2 100644 --- a/applications/OptimizationApplication/python_scripts/utilities/response_utilities.py +++ b/applications/OptimizationApplication/python_scripts/utilities/response_utilities.py @@ -47,12 +47,15 @@ def GetFunction(function_name: str, optimization_problem: OptimizationProblem, * raise RuntimeError(f"Undefined \"{function_name}\" function. Followings are supported function names:\n\t" + "\n\t".join(functions_map.keys())) def EvaluateValue(response_function: ResponseFunction, optimization_problem: OptimizationProblem) -> float: - response_data = ComponentDataView("evaluated_responses", optimization_problem).GetUnBufferedData() + response_data = ComponentDataView("evaluated_responses", optimization_problem).GetBufferedData() - if not response_data.HasValue(f"values/{response_function.GetName()}"): - response_data.SetValue(f"values/{response_function.GetName()}", response_function.CalculateValue()) + if response_function.GetImplementedPhysicalKratosVariables(): + if not response_data.HasValue(f"values/{response_function.GetName()}"): + response_data.SetValue(f"values/{response_function.GetName()}", response_function.CalculateValue()) - return response_data.GetValue(f"values/{response_function.GetName()}") + return response_data.GetValue(f"values/{response_function.GetName()}") + else: + return response_function.CalculateValue() def EvaluateGradient(response_function: ResponseFunction, physical_variable_collective_expressions: 'dict[SupportedSensitivityFieldVariableTypes, KratosOA.CollectiveExpression]', optimization_problem: OptimizationProblem) -> 'dict[SupportedSensitivityFieldVariableTypes, KratosOA.CollectiveExpression]': # first get the sub_collective expressions for implemented physical kratos variables @@ -153,7 +156,8 @@ def GetValuesAndOperators(response_expression: str, optimization_problem: Optimi index += closing_bracket_position + 2 continue - if current_char in BinaryOperatorValues: + # check for binary operator or scientific notation value + if current_char in BinaryOperatorValues and not (re.match(r"(^[0-9.]+[e|E])$", current_word) and current_char in ["+", "-"]): responses.append(GetResponseFunction(current_word, optimization_problem)) operators.append(current_char) current_word = "" @@ -229,7 +233,7 @@ def __evaluate_operator(list_of_operators: 'list[str]') -> None: def EvaluateResponseExpression(response_expression: str, optimization_problem: OptimizationProblem) -> ResponseFunction: evaluated_response_impl = __EvaluateResponseExpressionImpl(response_expression, optimization_problem) - if not evaluated_response_impl.GetChildResponses() and not evaluated_response_impl.GetImplementedPhysicalKratosVariables(): + if evaluated_response_impl.GetChildResponses() and evaluated_response_impl.GetImplementedPhysicalKratosVariables(): # if the response has children and has some dependence on the variables, then # we need to use the EvaluationResponseFunction to clear the evaluation data # whenever CalculateValue, CalculateGradient is used. From 95497c68134f9466422f8e6db8e6df51efbbb53e Mon Sep 17 00:00:00 2001 From: Suneth Warnakulasuriya <7856520+sunethwarna@users.noreply.github.com> Date: Fri, 9 Aug 2024 11:05:44 +0530 Subject: [PATCH 51/65] update tests --- .../responses/evaluation_response_function.py | 14 ++- .../tests/test_response_utilities.py | 119 +++++++++--------- 2 files changed, 69 insertions(+), 64 deletions(-) diff --git a/applications/OptimizationApplication/python_scripts/responses/evaluation_response_function.py b/applications/OptimizationApplication/python_scripts/responses/evaluation_response_function.py index df1e14a2ade9..6ec32b3af545 100644 --- a/applications/OptimizationApplication/python_scripts/responses/evaluation_response_function.py +++ b/applications/OptimizationApplication/python_scripts/responses/evaluation_response_function.py @@ -18,6 +18,8 @@ def GetImplementedPhysicalKratosVariables(self) -> 'list[SupportedSensitivityFie def Initialize(self) -> None: self.response_function.Initialize() + if not ComponentDataView("evaluated_responses", self.optimization_problem).HasDataBuffer(): + ComponentDataView("evaluated_responses", self.optimization_problem).SetDataBuffer(1) def Check(self) -> None: self.response_function.Check() @@ -33,10 +35,10 @@ def CalculateValue(self) -> float: # so this creates a new data container under the optimization problem to avoid # having to compute the same response value twice. - unbuffered_data = ComponentDataView("evaluated_responses", self.optimization_problem).GetUnBufferedData() + buffered_data = ComponentDataView("evaluated_responses", self.optimization_problem).GetBufferedData() # reset data of the evaluation - self.__ResetEvaluationData(self, unbuffered_data, "values") + self.__ResetEvaluationData(self, buffered_data, "values") # now calculate return self.response_function.CalculateValue() @@ -60,9 +62,9 @@ def __str__(self) -> str: return f"Response [type = {self.__class__.__name__}, name = {self.GetName()}]" @staticmethod - def __ResetEvaluationData(response_function: ResponseFunction, unbuffered_data: BufferedDict, prefix: str) -> None: - if unbuffered_data.HasValue(f"{prefix}/{response_function.GetName()}"): - del unbuffered_data[f"{prefix}/{response_function.GetName()}"] + def __ResetEvaluationData(response_function: ResponseFunction, data: BufferedDict, prefix: str) -> None: + if data.HasValue(f"{prefix}/{response_function.GetName()}"): + del data[f"{prefix}/{response_function.GetName()}"] for child_response in response_function.GetChildResponses(): # now reset the children - EvaluationResponseFunction.__ResetEvaluationData(child_response, unbuffered_data, prefix) + EvaluationResponseFunction.__ResetEvaluationData(child_response, data, prefix) diff --git a/applications/OptimizationApplication/tests/test_response_utilities.py b/applications/OptimizationApplication/tests/test_response_utilities.py index 62d7e07095f0..b1c6febf2669 100644 --- a/applications/OptimizationApplication/tests/test_response_utilities.py +++ b/applications/OptimizationApplication/tests/test_response_utilities.py @@ -123,6 +123,7 @@ def setUp(self) -> None: ComponentDataView(self.r2, self.optimization_problem).SetDataBuffer(1) self.optimization_problem.AddComponent(self.r3) ComponentDataView(self.r3, self.optimization_problem).SetDataBuffer(1) + ComponentDataView("evaluated_responses", self.optimization_problem).SetDataBuffer(1) def test_LiteralResponseCalculateValue1(self): eval_resp = EvaluateResponseExpression("4.0 + 6.0", self.optimization_problem) @@ -237,13 +238,11 @@ def test_CombinedResponseCalculateValue2(self): # followings are intermediate responses, so Algorithm, ResponseRoutine do not see them. Therefore # the value storage is managed by the ResponseFunction it self. - self.assertTrue(ComponentDataView("evaluated_responses", self.optimization_problem).GetUnBufferedData().HasValue(f"values/r1")) - self.assertTrue(ComponentDataView("evaluated_responses", self.optimization_problem).GetUnBufferedData().HasValue(f"values/r2")) - self.assertTrue(ComponentDataView("evaluated_responses", self.optimization_problem).GetUnBufferedData().HasValue(f"values/(r1+r2)")) - - # following is the resultant response function, hence the value storage is managed by the ResponseRoutine - self.assertFalse(self.optimization_problem.HasResponse(eval_resp)) - self.assertFalse(ComponentDataView("evaluated_responses", self.optimization_problem).GetUnBufferedData().HasValue(f"values/((r1+r2)+r2)")) + self.assertTrue(ComponentDataView("evaluated_responses", self.optimization_problem).GetBufferedData().HasValue(f"values/r1")) + self.assertTrue(ComponentDataView("evaluated_responses", self.optimization_problem).GetBufferedData().HasValue(f"values/r2")) + self.assertTrue(ComponentDataView("evaluated_responses", self.optimization_problem).GetBufferedData().HasValue(f"values/(r1+r2)")) + self.assertTrue(self.optimization_problem.HasResponse(eval_resp)) + self.assertFalse(ComponentDataView("evaluated_responses", self.optimization_problem).GetBufferedData().HasValue(f"values/((r1+r2)+r2)")) self.assertFalse(ComponentDataView("evaluated_responses", self.optimization_problem).GetUnBufferedData().HasValue(f"gradients/dr1_dPRESSURE")) self.assertFalse(ComponentDataView("evaluated_responses", self.optimization_problem).GetUnBufferedData().HasValue(f"gradients/dr2_dPRESSURE")) @@ -277,13 +276,11 @@ def test_CombinedResponseCalculateValue3(self): # followings are intermediate responses, so Algorithm, ResponseRoutine do not see them. Therefore # the value storage is managed by the ResponseFunction it self. - self.assertTrue(ComponentDataView("evaluated_responses", self.optimization_problem).GetUnBufferedData().HasValue("values/r1")) - self.assertTrue(ComponentDataView("evaluated_responses", self.optimization_problem).GetUnBufferedData().HasValue("values/r2")) - self.assertTrue(ComponentDataView("evaluated_responses", self.optimization_problem).GetUnBufferedData().HasValue("values/(r1+r2)")) - - # following is the resultant response function, hence the value storage is managed by the ResponseRoutine - self.assertFalse(self.optimization_problem.HasResponse(eval_resp)) - self.assertFalse(self.optimization_problem.HasResponse("((r1+r2)+4.0)")) + self.assertTrue(ComponentDataView("evaluated_responses", self.optimization_problem).GetBufferedData().HasValue("values/r1")) + self.assertTrue(ComponentDataView("evaluated_responses", self.optimization_problem).GetBufferedData().HasValue("values/r2")) + self.assertTrue(ComponentDataView("evaluated_responses", self.optimization_problem).GetBufferedData().HasValue("values/(r1+r2)")) + self.assertTrue(self.optimization_problem.HasResponse(eval_resp)) + self.assertTrue(self.optimization_problem.HasResponse(eval_resp.GetName())) self.assertFalse(ComponentDataView("evaluated_responses", self.optimization_problem).GetUnBufferedData().HasValue("gradients/dr1_dPRESSURE")) self.assertFalse(ComponentDataView("evaluated_responses", self.optimization_problem).GetUnBufferedData().HasValue("gradients/dr2_dPRESSURE")) @@ -317,16 +314,14 @@ def test_CombinedResponseCalculateValue4(self): self.assertTrue(self.optimization_problem.HasResponse("(3.5+(r1*2.0))")) self.assertTrue(self.optimization_problem.HasResponse("((3.5+(r1*2.0))+(r2÷3.0))")) - self.assertTrue(ComponentDataView("evaluated_responses", self.optimization_problem).GetUnBufferedData().HasValue("values/r1")) - self.assertTrue(ComponentDataView("evaluated_responses", self.optimization_problem).GetUnBufferedData().HasValue("values/r2")) - self.assertTrue(ComponentDataView("evaluated_responses", self.optimization_problem).GetUnBufferedData().HasValue("values/(r1*2.0)")) - self.assertTrue(ComponentDataView("evaluated_responses", self.optimization_problem).GetUnBufferedData().HasValue("values/(r2÷3.0)")) - self.assertTrue(ComponentDataView("evaluated_responses", self.optimization_problem).GetUnBufferedData().HasValue("values/(3.5+(r1*2.0))")) - self.assertTrue(ComponentDataView("evaluated_responses", self.optimization_problem).GetUnBufferedData().HasValue("values/((3.5+(r1*2.0))+(r2÷3.0))")) - - # following is the resultant response function, hence the value storage is managed by the ResponseRoutine - self.assertFalse(self.optimization_problem.HasResponse(eval_resp)) - self.assertFalse(self.optimization_problem.HasResponse("(((3.5+(r1*2.0))+(r2/3.0))-4.0)")) + self.assertTrue(ComponentDataView("evaluated_responses", self.optimization_problem).GetBufferedData().HasValue("values/r1")) + self.assertTrue(ComponentDataView("evaluated_responses", self.optimization_problem).GetBufferedData().HasValue("values/r2")) + self.assertTrue(ComponentDataView("evaluated_responses", self.optimization_problem).GetBufferedData().HasValue("values/(r1*2.0)")) + self.assertTrue(ComponentDataView("evaluated_responses", self.optimization_problem).GetBufferedData().HasValue("values/(r2÷3.0)")) + self.assertTrue(ComponentDataView("evaluated_responses", self.optimization_problem).GetBufferedData().HasValue("values/(3.5+(r1*2.0))")) + self.assertTrue(ComponentDataView("evaluated_responses", self.optimization_problem).GetBufferedData().HasValue("values/((3.5+(r1*2.0))+(r2÷3.0))")) + self.assertTrue(self.optimization_problem.HasResponse(eval_resp)) + self.assertTrue(self.optimization_problem.HasResponse(eval_resp.GetName())) self.assertFalse(ComponentDataView("evaluated_responses", self.optimization_problem).GetUnBufferedData().HasValue("gradients/dr1_dPRESSURE")) self.assertFalse(ComponentDataView("evaluated_responses", self.optimization_problem).GetUnBufferedData().HasValue("gradients/dr2_dPRESSURE")) @@ -368,18 +363,17 @@ def test_CombinedResponseCalculateValue5(self): self.assertTrue(self.optimization_problem.HasResponse("(3.5+(((r1*2.0)*r2)÷3.0))")) self.assertTrue(self.optimization_problem.HasResponse("((3.5+(((r1*2.0)*r2)÷3.0))-4.0)")) - self.assertTrue(ComponentDataView("evaluated_responses", self.optimization_problem).GetUnBufferedData().HasValue("values/r1")) - self.assertTrue(ComponentDataView("evaluated_responses", self.optimization_problem).GetUnBufferedData().HasValue("values/r2")) - self.assertTrue(ComponentDataView("evaluated_responses", self.optimization_problem).GetUnBufferedData().HasValue("values/(r1*2.0)")) - self.assertTrue(ComponentDataView("evaluated_responses", self.optimization_problem).GetUnBufferedData().HasValue("values/((r1*2.0)*r2)")) - self.assertTrue(ComponentDataView("evaluated_responses", self.optimization_problem).GetUnBufferedData().HasValue("values/(((r1*2.0)*r2)÷3.0)")) - self.assertTrue(ComponentDataView("evaluated_responses", self.optimization_problem).GetUnBufferedData().HasValue("values/(r1^r2)")) - self.assertTrue(ComponentDataView("evaluated_responses", self.optimization_problem).GetUnBufferedData().HasValue("values/(3.5+(((r1*2.0)*r2)÷3.0))")) - self.assertTrue(ComponentDataView("evaluated_responses", self.optimization_problem).GetUnBufferedData().HasValue("values/((3.5+(((r1*2.0)*r2)÷3.0))-4.0)")) + self.assertTrue(ComponentDataView("evaluated_responses", self.optimization_problem).GetBufferedData().HasValue("values/r1")) + self.assertTrue(ComponentDataView("evaluated_responses", self.optimization_problem).GetBufferedData().HasValue("values/r2")) + self.assertTrue(ComponentDataView("evaluated_responses", self.optimization_problem).GetBufferedData().HasValue("values/(r1*2.0)")) + self.assertTrue(ComponentDataView("evaluated_responses", self.optimization_problem).GetBufferedData().HasValue("values/((r1*2.0)*r2)")) + self.assertTrue(ComponentDataView("evaluated_responses", self.optimization_problem).GetBufferedData().HasValue("values/(((r1*2.0)*r2)÷3.0)")) + self.assertTrue(ComponentDataView("evaluated_responses", self.optimization_problem).GetBufferedData().HasValue("values/(r1^r2)")) + self.assertTrue(ComponentDataView("evaluated_responses", self.optimization_problem).GetBufferedData().HasValue("values/(3.5+(((r1*2.0)*r2)÷3.0))")) + self.assertTrue(ComponentDataView("evaluated_responses", self.optimization_problem).GetBufferedData().HasValue("values/((3.5+(((r1*2.0)*r2)÷3.0))-4.0)")) + self.assertTrue(self.optimization_problem.HasResponse(eval_resp)) + self.assertTrue(self.optimization_problem.HasResponse(eval_resp.GetName())) - # following is the resultant response function, hence the value storage is managed by the ResponseRoutine - self.assertFalse(self.optimization_problem.HasResponse(eval_resp)) - self.assertFalse(self.optimization_problem.HasResponse(eval_resp.GetName())) self.assertFalse(ComponentDataView("evaluated_responses", self.optimization_problem).GetUnBufferedData().HasValue("gradients/dr1_dPRESSURE")) self.assertFalse(ComponentDataView("evaluated_responses", self.optimization_problem).GetUnBufferedData().HasValue("gradients/dr2_dPRESSURE")) @@ -404,6 +398,17 @@ def test_CombinedResponseCalculateValue5(self): self.assertEqual(self.r1.calculate_gradient_calls, 1) self.assertEqual(self.r2.calculate_gradient_calls, 1) + def test_CombinedResponseCalculateValue6(self): + eval_resp = EvaluateResponseExpression("r1 * 1.2e+01 - 2.1E-2", self.optimization_problem) + eval_resp.Initialize() + eval_value = eval_resp.CalculateValue() + self.assertAlmostEqual(eval_value, self.r1.CalculateValue() * 12 - 0.021, 12) + + self.assertTrue(self.optimization_problem.HasResponse(eval_resp)) + self.assertTrue(self.optimization_problem.HasResponse(eval_resp.GetName())) + + self.__CheckGradients([Kratos.PRESSURE], eval_resp, lambda : self.r1.CalculateValue() * 12 - 0.021, 1e-8, 9) + def test_BracketResponseCalculateValue1(self): eval_resp = EvaluateResponseExpression("(4.0)", self.optimization_problem) eval_resp.Initialize() @@ -444,29 +449,27 @@ def test_BracketResponseCalculateValue3(self): self.assertTrue(self.optimization_problem.HasResponse("(((4.0+((r1*2.0)*(r2^2.0)))+log((((2.0+6.0)*(3.0+((4.0-2.0)÷4.0)))+(6.0*r1))))+((6.0÷3.0)+(3.0*(2.0+8.0))))")) self.assertTrue(self.optimization_problem.HasResponse("log((((2.0+6.0)*(3.0+((4.0-2.0)÷4.0)))+(6.0*r1)))")) - self.assertTrue(ComponentDataView("evaluated_responses", self.optimization_problem).GetUnBufferedData().HasValue("values/r1")) - self.assertTrue(ComponentDataView("evaluated_responses", self.optimization_problem).GetUnBufferedData().HasValue("values/r2")) - self.assertTrue(ComponentDataView("evaluated_responses", self.optimization_problem).GetUnBufferedData().HasValue("values/(r1*2.0)")) - self.assertTrue(ComponentDataView("evaluated_responses", self.optimization_problem).GetUnBufferedData().HasValue("values/(r2^2.0)")) - self.assertTrue(ComponentDataView("evaluated_responses", self.optimization_problem).GetUnBufferedData().HasValue("values/((r1*2.0)*(r2^2.0))")) - self.assertTrue(ComponentDataView("evaluated_responses", self.optimization_problem).GetUnBufferedData().HasValue("values/(6.0*r1)")) - self.assertTrue(ComponentDataView("evaluated_responses", self.optimization_problem).GetUnBufferedData().HasValue("values/((4.0+((r1*2.0)*(r2^2.0)))+log((((2.0+6.0)*(3.0+((4.0-2.0)÷4.0)))+(6.0*r1))))")) - self.assertTrue(ComponentDataView("evaluated_responses", self.optimization_problem).GetUnBufferedData().HasValue("values/(((4.0+((r1*2.0)*(r2^2.0)))+log((((2.0+6.0)*(3.0+((4.0-2.0)÷4.0)))+(6.0*r1))))+((6.0÷3.0)+(3.0*(2.0+8.0))))")) - self.assertTrue(ComponentDataView("evaluated_responses", self.optimization_problem).GetUnBufferedData().HasValue("values/log((((2.0+6.0)*(3.0+((4.0-2.0)÷4.0)))+(6.0*r1)))")) - - # following is the resultant response function, hence the value storage is managed by the ResponseRoutine - self.assertFalse(self.optimization_problem.HasResponse(eval_resp)) - self.assertFalse(self.optimization_problem.HasResponse(eval_resp.GetName())) - - self.assertFalse(ComponentDataView("evaluated_responses", self.optimization_problem).GetUnBufferedData().HasValue("gradients/dr1_dPRESSURE")) - self.assertFalse(ComponentDataView("evaluated_responses", self.optimization_problem).GetUnBufferedData().HasValue("gradients/dr2_dPRESSURE")) - self.assertFalse(ComponentDataView("evaluated_responses", self.optimization_problem).GetUnBufferedData().HasValue("gradients/d(r1*2.0)_dPRESSURE")) - self.assertFalse(ComponentDataView("evaluated_responses", self.optimization_problem).GetUnBufferedData().HasValue("gradients/d(r2^2.0)_dPRESSURE")) - self.assertFalse(ComponentDataView("evaluated_responses", self.optimization_problem).GetUnBufferedData().HasValue("gradients/d((r1*2.0)*(r2^2.0))_dPRESSURE")) - self.assertFalse(ComponentDataView("evaluated_responses", self.optimization_problem).GetUnBufferedData().HasValue("gradients/d(6.0*r1)_dPRESSURE")) - self.assertFalse(ComponentDataView("evaluated_responses", self.optimization_problem).GetUnBufferedData().HasValue("gradients/d((4.0+((r1*2.0)*(r2^2.0)))+log((((2.0+6.0)*(3.0+((4.0-2.0)÷4.0)))+(6.0*r1))))_dPRESSURE")) - self.assertFalse(ComponentDataView("evaluated_responses", self.optimization_problem).GetUnBufferedData().HasValue("gradients/d(((4.0+((r1*2.0)*(r2^2.0)))+log((((2.0+6.0)*(3.0+((4.0-2.0)÷4.0)))+(6.0*r1))))+((6.0÷3.0)+(3.0*(2.0+8.0))))_dPRESSURE")) - self.assertFalse(ComponentDataView("evaluated_responses", self.optimization_problem).GetUnBufferedData().HasValue("gradients/dlog((((2.0+6.0)*(3.0+((4.0-2.0)÷4.0)))+(6.0*r1)))_dPRESSURE")) + self.assertTrue(ComponentDataView("evaluated_responses", self.optimization_problem).GetBufferedData().HasValue("values/r1")) + self.assertTrue(ComponentDataView("evaluated_responses", self.optimization_problem).GetBufferedData().HasValue("values/r2")) + self.assertTrue(ComponentDataView("evaluated_responses", self.optimization_problem).GetBufferedData().HasValue("values/(r1*2.0)")) + self.assertTrue(ComponentDataView("evaluated_responses", self.optimization_problem).GetBufferedData().HasValue("values/(r2^2.0)")) + self.assertTrue(ComponentDataView("evaluated_responses", self.optimization_problem).GetBufferedData().HasValue("values/((r1*2.0)*(r2^2.0))")) + self.assertTrue(ComponentDataView("evaluated_responses", self.optimization_problem).GetBufferedData().HasValue("values/(6.0*r1)")) + self.assertTrue(ComponentDataView("evaluated_responses", self.optimization_problem).GetBufferedData().HasValue("values/((4.0+((r1*2.0)*(r2^2.0)))+log((((2.0+6.0)*(3.0+((4.0-2.0)÷4.0)))+(6.0*r1))))")) + self.assertTrue(ComponentDataView("evaluated_responses", self.optimization_problem).GetBufferedData().HasValue("values/(((4.0+((r1*2.0)*(r2^2.0)))+log((((2.0+6.0)*(3.0+((4.0-2.0)÷4.0)))+(6.0*r1))))+((6.0÷3.0)+(3.0*(2.0+8.0))))")) + self.assertTrue(ComponentDataView("evaluated_responses", self.optimization_problem).GetBufferedData().HasValue("values/log((((2.0+6.0)*(3.0+((4.0-2.0)÷4.0)))+(6.0*r1)))")) + self.assertTrue(self.optimization_problem.HasResponse(eval_resp)) + self.assertTrue(self.optimization_problem.HasResponse(eval_resp.GetName())) + + self.assertFalse(ComponentDataView("evaluated_responses", self.optimization_problem).GetBufferedData().HasValue("gradients/dr1_dPRESSURE")) + self.assertFalse(ComponentDataView("evaluated_responses", self.optimization_problem).GetBufferedData().HasValue("gradients/dr2_dPRESSURE")) + self.assertFalse(ComponentDataView("evaluated_responses", self.optimization_problem).GetBufferedData().HasValue("gradients/d(r1*2.0)_dPRESSURE")) + self.assertFalse(ComponentDataView("evaluated_responses", self.optimization_problem).GetBufferedData().HasValue("gradients/d(r2^2.0)_dPRESSURE")) + self.assertFalse(ComponentDataView("evaluated_responses", self.optimization_problem).GetBufferedData().HasValue("gradients/d((r1*2.0)*(r2^2.0))_dPRESSURE")) + self.assertFalse(ComponentDataView("evaluated_responses", self.optimization_problem).GetBufferedData().HasValue("gradients/d(6.0*r1)_dPRESSURE")) + self.assertFalse(ComponentDataView("evaluated_responses", self.optimization_problem).GetBufferedData().HasValue("gradients/d((4.0+((r1*2.0)*(r2^2.0)))+log((((2.0+6.0)*(3.0+((4.0-2.0)÷4.0)))+(6.0*r1))))_dPRESSURE")) + self.assertFalse(ComponentDataView("evaluated_responses", self.optimization_problem).GetBufferedData().HasValue("gradients/d(((4.0+((r1*2.0)*(r2^2.0)))+log((((2.0+6.0)*(3.0+((4.0-2.0)÷4.0)))+(6.0*r1))))+((6.0÷3.0)+(3.0*(2.0+8.0))))_dPRESSURE")) + self.assertFalse(ComponentDataView("evaluated_responses", self.optimization_problem).GetBufferedData().HasValue("gradients/dlog((((2.0+6.0)*(3.0+((4.0-2.0)÷4.0)))+(6.0*r1)))_dPRESSURE")) self.__CheckGradients([Kratos.PRESSURE], eval_resp, lambda : (4.0 + (self.r1.CalculateValue() * 2) * (self.r2.CalculateValue() ** 2) + log((2+6)*(3+(4-2)/4)+6*self.r1.CalculateValue()) + (6.0 / 3.0 + 3 * (2 + 8))) * 2.0, 1e-6, 7) From f16d3455cce4b3045ff1f979f3532fda8e616dd3 Mon Sep 17 00:00:00 2001 From: Suneth Warnakulasuriya <7856520+sunethwarna@users.noreply.github.com> Date: Fri, 9 Aug 2024 15:09:43 +0530 Subject: [PATCH 52/65] remove unwanted outputsfrom ascii output --- .../processes/optimization_problem_ascii_output_process.py | 6 ++++-- .../summary_orig.csv | 1 - .../algorithm_steepest_descent/summary_orig.csv | 1 - .../algorithm_steepest_descent_qnbb/summary_orig.csv | 1 - 4 files changed, 4 insertions(+), 5 deletions(-) diff --git a/applications/OptimizationApplication/python_scripts/processes/optimization_problem_ascii_output_process.py b/applications/OptimizationApplication/python_scripts/processes/optimization_problem_ascii_output_process.py index c569fecbadf5..46ede75da3f3 100644 --- a/applications/OptimizationApplication/python_scripts/processes/optimization_problem_ascii_output_process.py +++ b/applications/OptimizationApplication/python_scripts/processes/optimization_problem_ascii_output_process.py @@ -7,6 +7,7 @@ from KratosMultiphysics.OptimizationApplication.execution_policies.execution_policy import ExecutionPolicy from KratosMultiphysics.OptimizationApplication.utilities.component_data_view import ComponentDataView from KratosMultiphysics.OptimizationApplication.utilities.optimization_problem import OptimizationProblem +from KratosMultiphysics.OptimizationApplication.utilities.buffered_dict import BufferedDict from KratosMultiphysics.OptimizationApplication.utilities.helper_utilities import GetAllComponentFullNamesWithData from KratosMultiphysics.OptimizationApplication.utilities.helper_utilities import GetComponentHavingDataByFullName @@ -111,7 +112,7 @@ def PrintOutput(self) -> None: self.list_of_components.append(GetComponentHavingDataByFullName(component_name, self.optimization_problem)) # now get the buffered data headers - self.list_of_headers = self._GetHeaders(lambda x: x.GetBufferedData()) + self.list_of_headers = self._GetHeaders(lambda x: x.GetBufferedData() if x.HasDataBuffer() else BufferedDict()) # write the ehader information self._WriteHeaders() self.initialized_headers = True @@ -206,5 +207,6 @@ def _GetHeaders(self, dict_getter_method) -> 'list[tuple[Any, dict[str, Header] if header_name in [header.GetHeaderName().strip() for header in header_info_dict.values()]: Kratos.Logger.PrintWarning(self.__class__.__name__, "Second value with same header name = \"" + header_name + "\" found.") header_info_dict[k] = Header(header_name, v, self.format_info) - list_of_headers.append([component, header_info_dict]) + if len(header_info_dict): + list_of_headers.append([component, header_info_dict]) return list_of_headers \ No newline at end of file diff --git a/applications/OptimizationApplication/tests/algorithm_tests/analysis_based_tests/algorithm_nesterov_accelerated_gradient/summary_orig.csv b/applications/OptimizationApplication/tests/algorithm_tests/analysis_based_tests/algorithm_nesterov_accelerated_gradient/summary_orig.csv index c3fd2c0eb2b5..c4caaeb9297a 100644 --- a/applications/OptimizationApplication/tests/algorithm_tests/analysis_based_tests/algorithm_nesterov_accelerated_gradient/summary_orig.csv +++ b/applications/OptimizationApplication/tests/algorithm_tests/analysis_based_tests/algorithm_nesterov_accelerated_gradient/summary_orig.csv @@ -3,7 +3,6 @@ # Timestamp : not_specified # ----------------------------------------------- # --------------- Initial values ---------------- -# algorithm: # strain_energy: # initial_value: 2.045937642e-02 # ------------ End of initial values ------------ diff --git a/applications/OptimizationApplication/tests/algorithm_tests/analysis_based_tests/algorithm_steepest_descent/summary_orig.csv b/applications/OptimizationApplication/tests/algorithm_tests/analysis_based_tests/algorithm_steepest_descent/summary_orig.csv index 4b22168e1941..1defae9d1af0 100644 --- a/applications/OptimizationApplication/tests/algorithm_tests/analysis_based_tests/algorithm_steepest_descent/summary_orig.csv +++ b/applications/OptimizationApplication/tests/algorithm_tests/analysis_based_tests/algorithm_steepest_descent/summary_orig.csv @@ -3,7 +3,6 @@ # Timestamp : not_specified # ----------------------------------------------- # --------------- Initial values ---------------- -# algorithm: # strain_energy: # initial_value: 2.045937642e-02 # ------------ End of initial values ------------ diff --git a/applications/OptimizationApplication/tests/algorithm_tests/analysis_based_tests/algorithm_steepest_descent_qnbb/summary_orig.csv b/applications/OptimizationApplication/tests/algorithm_tests/analysis_based_tests/algorithm_steepest_descent_qnbb/summary_orig.csv index 4105f7ddcc90..22893d0ebc99 100644 --- a/applications/OptimizationApplication/tests/algorithm_tests/analysis_based_tests/algorithm_steepest_descent_qnbb/summary_orig.csv +++ b/applications/OptimizationApplication/tests/algorithm_tests/analysis_based_tests/algorithm_steepest_descent_qnbb/summary_orig.csv @@ -3,7 +3,6 @@ # Timestamp : not_specified # ----------------------------------------------- # --------------- Initial values ---------------- -# algorithm: # strain_energy: # initial_value: 2.045937642e-02 # ------------ End of initial values ------------ From 9c9ee0cfcec987d3953241cdccd37f16facf0d41 Mon Sep 17 00:00:00 2001 From: Suneth Warnakulasuriya <7856520+sunethwarna@users.noreply.github.com> Date: Fri, 9 Aug 2024 15:16:06 +0530 Subject: [PATCH 53/65] remove unwanted outputsfrom ascii output --- .../tests/auxiliary_files/system_identification_summary_ref.csv | 1 - 1 file changed, 1 deletion(-) diff --git a/applications/SystemIdentificationApplication/tests/auxiliary_files/system_identification_summary_ref.csv b/applications/SystemIdentificationApplication/tests/auxiliary_files/system_identification_summary_ref.csv index a9af07ae3494..f2c0c703b202 100644 --- a/applications/SystemIdentificationApplication/tests/auxiliary_files/system_identification_summary_ref.csv +++ b/applications/SystemIdentificationApplication/tests/auxiliary_files/system_identification_summary_ref.csv @@ -3,7 +3,6 @@ # Timestamp : not_specified # ----------------------------------------------- # --------------- Initial values ---------------- -# algorithm: # damage_response: # initial_value: 7.924977798e-04 # ------------ End of initial values ------------ From b37159ed3704991d39cec50f6ee1ac6a65bc2feb Mon Sep 17 00:00:00 2001 From: Guozhen Jing Date: Fri, 9 Aug 2024 20:48:32 +0200 Subject: [PATCH 54/65] [MPM] Moving enforcement of nonconforming SLIP from MPMBoundaryRotationUtility to to the relevant Condition (#12018) * Allow MPMParticleBaseCondition access to rotationUtility by passing and setting a static pointer * Refactor MPMBoundaryRotationUtility, shifting imposition of non-conforming SLIP to condition * Rename IsPenalty to IsParticleBased * Replace legacy IS_STRUCTURE by PARTICLE_BASED_SLIP * Modify RotateAux and extract RotateRHSAux to enable easy rotation to global frame * Prevent rotation for particle-based slip in scheme for conditions and elements * Rotate penalty-based contributions back to global frame after updating for SLIP * Move ApplySlipCondition inside the if statement for clarity * Add test for penalty-based nonconforming slip * Remove CalculateReactionForces from MPMBoundaryRotationUtility (since RHS contributions from particle-based slip boundaries are expected to result in correct tangential contributions) * specify "MPMParticleBaseCondition::" in cpp file involving the typedef-ed RotationToolType * missing KRATOS_API * leftover * rename non-conforming slip test case to particle_based_slip_test * Cleanup after merge * Cleanup after merging * Make available overloaded RevertRotate from base class in MPMBoundaryRotationUtility * update analysis file --------- Co-authored-by: Philipp Bucher Co-authored-by: V. Singer --- .../mpm_particle_base_condition.cpp | 13 + .../mpm_particle_base_condition.h | 21 +- ...m_particle_penalty_dirichlet_condition.cpp | 41 +- .../custom_python/mpm_python_application.cpp | 1 + .../mpm_residual_based_bossak_scheme.hpp | 57 +- .../mpm_boundary_rotation_utility.h | 155 +-- .../MPMApplication/mpm_application.cpp | 1 + .../mpm_application_variables.cpp | 1 + .../mpm_application_variables.h | 1 + .../apply_mpm_slip_boundary_process.py | 3 - .../MPMApplication/tests/mpm_test_factory.py | 5 +- .../slip_boundary_test_Body.mdpa | 0 .../slip_boundary_test_Grid.mdpa | 0 .../slip_boundary_test_materials.json | 0 .../slip_boundary_test_parameters.json | 16 +- .../slip_boundary_test_results.json | 0 .../slip_boundary_test_results2.json | 0 .../particle_based_slip_test_Body.mdpa | 45 + .../particle_based_slip_test_Grid.mdpa | 120 ++ .../particle_based_slip_test_materials.json | 21 + .../particle_based_slip_test_parameters.json | 93 ++ .../particle_based_slip_test_results.json | 1198 +++++++++++++++++ .../tests/test_MPMApplication.py | 2 + 23 files changed, 1642 insertions(+), 152 deletions(-) rename applications/MPMApplication/tests/slip_tests/{ => conforming}/slip_boundary_test_Body.mdpa (100%) rename applications/MPMApplication/tests/slip_tests/{ => conforming}/slip_boundary_test_Grid.mdpa (100%) rename applications/MPMApplication/tests/slip_tests/{ => conforming}/slip_boundary_test_materials.json (100%) rename applications/MPMApplication/tests/slip_tests/{ => conforming}/slip_boundary_test_parameters.json (87%) rename applications/MPMApplication/tests/slip_tests/{ => conforming}/slip_boundary_test_results.json (100%) rename applications/MPMApplication/tests/slip_tests/{ => conforming}/slip_boundary_test_results2.json (100%) create mode 100644 applications/MPMApplication/tests/slip_tests/particle_based/particle_based_slip_test_Body.mdpa create mode 100644 applications/MPMApplication/tests/slip_tests/particle_based/particle_based_slip_test_Grid.mdpa create mode 100644 applications/MPMApplication/tests/slip_tests/particle_based/particle_based_slip_test_materials.json create mode 100644 applications/MPMApplication/tests/slip_tests/particle_based/particle_based_slip_test_parameters.json create mode 100644 applications/MPMApplication/tests/slip_tests/particle_based/particle_based_slip_test_results.json diff --git a/applications/MPMApplication/custom_conditions/particle_based_conditions/mpm_particle_base_condition.cpp b/applications/MPMApplication/custom_conditions/particle_based_conditions/mpm_particle_base_condition.cpp index 2e93cd805dc7..66e71a3658ef 100644 --- a/applications/MPMApplication/custom_conditions/particle_based_conditions/mpm_particle_base_condition.cpp +++ b/applications/MPMApplication/custom_conditions/particle_based_conditions/mpm_particle_base_condition.cpp @@ -396,6 +396,19 @@ double MPMParticleBaseCondition::GetIntegrationWeight() return m_area; } +void MPMParticleBaseCondition::SetRotationUtility(const MPMParticleBaseCondition::RotationToolType *pRotationUtility) +{ + MPMParticleBaseCondition::p_rotation_tool = pRotationUtility; +} + +const MPMParticleBaseCondition::RotationToolType& MPMParticleBaseCondition::GetRotationTool(){ + if(p_rotation_tool){ + return *p_rotation_tool; + } else { + KRATOS_ERROR << "Rotation tool must be set via SetRotationUtility() before use!" << std::endl; + } +} + } // Namespace Kratos diff --git a/applications/MPMApplication/custom_conditions/particle_based_conditions/mpm_particle_base_condition.h b/applications/MPMApplication/custom_conditions/particle_based_conditions/mpm_particle_base_condition.h index 220f6df432f6..1bc78450ec37 100644 --- a/applications/MPMApplication/custom_conditions/particle_based_conditions/mpm_particle_base_condition.h +++ b/applications/MPMApplication/custom_conditions/particle_based_conditions/mpm_particle_base_condition.h @@ -11,8 +11,7 @@ // -#if !defined(KRATOS_MPM_PARTICLE_BASE_CONDITION_3D_H_INCLUDED ) -#define KRATOS_MPM_PARTICLE_BASE_CONDITION_3D_H_INCLUDED +#pragma once // System includes @@ -21,6 +20,7 @@ // Project includes #include "includes/define.h" #include "includes/condition.h" +#include "custom_utilities/mpm_boundary_rotation_utility.h" #include "mpm_application_variables.h" namespace Kratos @@ -45,7 +45,7 @@ namespace Kratos ///@name Kratos Classes ///@{ -class MPMParticleBaseCondition +class KRATOS_API(MPM_APPLICATION) MPMParticleBaseCondition : public Condition { @@ -82,6 +82,7 @@ class MPMParticleBaseCondition ///@name Type Definitions typedef std::size_t SizeType; + typedef MPMBoundaryRotationUtility RotationToolType; ///@{ // Counted pointer of MPMParticleBaseCondition @@ -274,6 +275,12 @@ class MPMParticleBaseCondition const std::vector >& rValues, const ProcessInfo& rCurrentProcessInfo) override; + /** + * Intended to be called in Initialize() of the instance that owns the rotationUtility (currently Scheme) to + * allow access to the rotation utility by particle-based conditions + */ + static void SetRotationUtility(const RotationToolType *pRotationUtility); + ///@} ///@name Inquiry ///@{ @@ -292,6 +299,8 @@ class MPMParticleBaseCondition ///@name Protected static Member Variables ///@{ + + ///@} ///@name Protected member Variables ///@{ @@ -347,6 +356,8 @@ class MPMParticleBaseCondition ///@name Protected Access ///@{ + static const RotationToolType& GetRotationTool(); + ///@} ///@name Protected Inquiry ///@{ @@ -358,6 +369,8 @@ class MPMParticleBaseCondition private: ///@name Static Member Variables ///@{ + // for use of static: refer to discussion at https://github.com/KratosMultiphysics/Kratos/pull/12018 + static inline const RotationToolType *p_rotation_tool = nullptr; ///@} @@ -424,5 +437,3 @@ class MPMParticleBaseCondition ///@{ } // namespace Kratos. - -#endif // KRATOS_MPM_PARTICLE_BASE_DIRICHLET_CONDITION_3D_H_INCLUDED defined diff --git a/applications/MPMApplication/custom_conditions/particle_based_conditions/mpm_particle_penalty_dirichlet_condition.cpp b/applications/MPMApplication/custom_conditions/particle_based_conditions/mpm_particle_penalty_dirichlet_condition.cpp index ddc3687549c8..e8edafc88af9 100644 --- a/applications/MPMApplication/custom_conditions/particle_based_conditions/mpm_particle_penalty_dirichlet_condition.cpp +++ b/applications/MPMApplication/custom_conditions/particle_based_conditions/mpm_particle_penalty_dirichlet_condition.cpp @@ -86,7 +86,7 @@ void MPMParticlePenaltyDirichletCondition::InitializeSolutionStep( const Process { r_geometry[i].SetLock(); r_geometry[i].Set(SLIP); - r_geometry[i].FastGetSolutionStepValue(IS_STRUCTURE) = 2.0; + r_geometry[i].SetValue(PARTICLE_BASED_SLIP, true); r_geometry[i].FastGetSolutionStepValue(NORMAL) += Variables.N[i] * m_normal; r_geometry[i].UnSetLock(); } @@ -203,6 +203,7 @@ void MPMParticlePenaltyDirichletCondition::CalculateAll( { noalias(rLeftHandSideMatrix) += prod(trans(shape_function), shape_function); rLeftHandSideMatrix *= m_penalty * this->GetIntegrationWeight(); + } if ( CalculateResidualVectorFlag == true ) @@ -210,6 +211,40 @@ void MPMParticlePenaltyDirichletCondition::CalculateAll( noalias(rRightHandSideVector) -= prod(prod(trans(shape_function), shape_function), gap_function); rRightHandSideVector *= m_penalty * this->GetIntegrationWeight(); } + + if (Is(SLIP)){ + // rotate to normal-tangential frame + if (CalculateStiffnessMatrixFlag == true){ + GetRotationTool().Rotate(rLeftHandSideMatrix, rRightHandSideVector, GetGeometry()); + } else { + GetRotationTool().Rotate(rRightHandSideVector, GetGeometry()); + } + + if (CalculateStiffnessMatrixFlag == true) { + for (unsigned int i = 0; i < matrix_size; ++i) { + for (unsigned int j = 0; j < matrix_size; ++j) { + // erase tangential DoFs + if (j%block_size != 0 || i%block_size != 0) + rLeftHandSideMatrix(i, j) = 0; + } + } + } + + if (CalculateResidualVectorFlag == true) { + for (unsigned int j = 0; j < matrix_size; j++) { + if (j % block_size != 0) // tangential DoF + rRightHandSideVector[j] = 0.0; + } + } + + // rotate back to global frame + if (CalculateStiffnessMatrixFlag == true){ + GetRotationTool().RevertRotate(rLeftHandSideMatrix, rRightHandSideVector, GetGeometry()); + } else { + GetRotationTool().RevertRotate(rRightHandSideVector, GetGeometry()); + } + + } } KRATOS_CATCH( "" ) @@ -266,12 +301,12 @@ void MPMParticlePenaltyDirichletCondition::FinalizeSolutionStep( const ProcessIn GeometryType& r_geometry = GetGeometry(); const unsigned int number_of_nodes = r_geometry.PointsNumber(); - // Here MPC normal vector and IS_STRUCTURE are reset + // Here MPC normal vector, SLIP, and PARTICLE_BASED_SLIP are reset for ( unsigned int i = 0; i < number_of_nodes; i++ ) { r_geometry[i].SetLock(); r_geometry[i].Reset(SLIP); - r_geometry[i].FastGetSolutionStepValue(IS_STRUCTURE) = 0.0; + r_geometry[i].SetValue(PARTICLE_BASED_SLIP, false); r_geometry[i].FastGetSolutionStepValue(NORMAL).clear(); r_geometry[i].UnSetLock(); } diff --git a/applications/MPMApplication/custom_python/mpm_python_application.cpp b/applications/MPMApplication/custom_python/mpm_python_application.cpp index a55a58600949..57a5f68b376e 100644 --- a/applications/MPMApplication/custom_python/mpm_python_application.cpp +++ b/applications/MPMApplication/custom_python/mpm_python_application.cpp @@ -114,6 +114,7 @@ namespace Python{ // Essential Boundary variables KRATOS_REGISTER_IN_PYTHON_VARIABLE(m, PENALTY_FACTOR); KRATOS_REGISTER_IN_PYTHON_VARIABLE(m, MPC_BOUNDARY_CONDITION_TYPE); + KRATOS_REGISTER_IN_PYTHON_VARIABLE(m, PARTICLE_BASED_SLIP); // Nodal load variables KRATOS_REGISTER_IN_PYTHON_3D_VARIABLE_WITH_COMPONENTS(m, POINT_LOAD ) diff --git a/applications/MPMApplication/custom_strategies/schemes/mpm_residual_based_bossak_scheme.hpp b/applications/MPMApplication/custom_strategies/schemes/mpm_residual_based_bossak_scheme.hpp index 6483f755f96e..0ec33b97c048 100644 --- a/applications/MPMApplication/custom_strategies/schemes/mpm_residual_based_bossak_scheme.hpp +++ b/applications/MPMApplication/custom_strategies/schemes/mpm_residual_based_bossak_scheme.hpp @@ -29,6 +29,7 @@ #include "solving_strategies/schemes/residual_based_implicit_time_scheme.h" #include "solving_strategies/schemes/residual_based_bossak_displacement_scheme.hpp" #include "custom_utilities/mpm_boundary_rotation_utility.h" +#include "custom_conditions/particle_based_conditions/mpm_particle_base_condition.h" #include "utilities/parallel_utilities.h" namespace Kratos @@ -104,7 +105,7 @@ class MPMResidualBasedBossakScheme unsigned int BlockSize, double Alpha = 0.0, double NewmarkBeta = 0.25, bool IsDynamic = true) :ResidualBasedBossakDisplacementScheme(Alpha, NewmarkBeta), - mGridModelPart(rGridModelPart), mRotationTool(DomainSize, BlockSize, IS_STRUCTURE) + mGridModelPart(rGridModelPart), mRotationTool(DomainSize, BlockSize) { // To distinguish quasi-static and dynamic mIsDynamic = IsDynamic; @@ -124,7 +125,7 @@ class MPMResidualBasedBossakScheme :BossakBaseType(rOther) ,mGridModelPart(rOther.mGridModelPart) ,mFrictionIsActive(rOther.mFrictionIsActive) - ,mRotationTool(rOther.mDomainSize,rOther.mBlockSize,IS_STRUCTURE) + ,mRotationTool(rOther.mDomainSize,rOther.mBlockSize) { } @@ -145,6 +146,13 @@ class MPMResidualBasedBossakScheme //*************************************************************************** //*************************************************************************** + void Initialize(ModelPart& rModelPart) override { + MPMParticleBaseCondition::SetRotationUtility(&mRotationTool); + + BossakBaseType::Initialize(rModelPart); + } + + /** * @brief Performing the update of the solution * @details Incremental update within newton iteration. It updates the state variables at the end of the time step u_{n+1}^{k+1}= u_{n+1}^{k}+ \Delta u @@ -265,8 +273,8 @@ class MPMResidualBasedBossakScheme void FinalizeNonLinIteration(ModelPart &rModelPart, TSystemMatrixType &rA, TSystemVectorType &rDx, TSystemVectorType &rb) override { - // clear any nodal reaction values on penalty boundary - ClearReactionOnPenaltyBoundary(); + // clear any nodal reaction values for conforming friction (needed in current penalty-based formulation) + ClearConformingFrictionReaction(); BossakBaseType::FinalizeNonLinIteration(rModelPart, rA, rDx, rb); @@ -429,7 +437,7 @@ class MPMResidualBasedBossakScheme const double mu = rConstNode.GetValue(FRICTION_COEFFICIENT); // rotate friction forces stored in REACTION to global coordinates on conforming boundaries - if (!mRotationTool.IsPenalty(rConstNode) && rConstNode.Is(SLIP) && mu > 0) { + if (mRotationTool.IsConformingSlip(rNode) && mu > 0) { mRotationTool.RotateVector(rNode.FastGetSolutionStepValue(REACTION), rNode, true); } }); @@ -466,9 +474,13 @@ class MPMResidualBasedBossakScheme BossakBaseType::AddDynamicsToRHS(rCurrentElement, RHS_Contribution, mMatrix.D[this_thread], mMatrix.M[this_thread], rCurrentProcessInfo); } - // If there is a slip condition, apply it on a rotated system of coordinates - mRotationTool.Rotate(LHS_Contribution,RHS_Contribution,rCurrentElement.GetGeometry()); - mRotationTool.ElementApplySlipCondition(LHS_Contribution,RHS_Contribution,rCurrentElement.GetGeometry()); + // Rotate contributions (to match coordinates for slip conditions) + if(!mRotationTool.IsParticleBasedSlip(rCurrentElement.GetGeometry())){ + // prevent rotation in case of particle-based slip (handled by condition itself) + mRotationTool.Rotate(LHS_Contribution, RHS_Contribution, rCurrentElement.GetGeometry()); + mRotationTool.ApplySlipCondition(LHS_Contribution,RHS_Contribution,rCurrentElement.GetGeometry()); + } + KRATOS_CATCH( "" ) } @@ -503,9 +515,12 @@ class MPMResidualBasedBossakScheme BossakBaseType::AddDynamicsToRHS(rCurrentElement, RHS_Contribution, mMatrix.D[this_thread], mMatrix.M[this_thread], rCurrentProcessInfo); } - // If there is a slip condition, apply it on a rotated system of coordinates - mRotationTool.RotateRHS(RHS_Contribution,rCurrentElement.GetGeometry()); - mRotationTool.ElementApplySlipCondition(RHS_Contribution,rCurrentElement.GetGeometry()); + // Rotate contributions (to match coordinates for slip conditions) + if(!mRotationTool.IsParticleBasedSlip(rCurrentElement.GetGeometry())){ + // prevent rotation in case of particle-based slip (handled by condition itself) + mRotationTool.Rotate(RHS_Contribution, rCurrentElement.GetGeometry()); + mRotationTool.ApplySlipCondition(RHS_Contribution,rCurrentElement.GetGeometry()); + } KRATOS_CATCH( "" ) } @@ -543,8 +558,12 @@ class MPMResidualBasedBossakScheme } // Rotate contributions (to match coordinates for slip conditions) - mRotationTool.Rotate(LHS_Contribution,RHS_Contribution,rCurrentCondition.GetGeometry()); - mRotationTool.ConditionApplySlipCondition(LHS_Contribution,RHS_Contribution,rCurrentCondition.GetGeometry()); + if(!mRotationTool.IsParticleBasedSlip(rCurrentCondition.GetGeometry())){ + // prevent rotation in case of particle-based slip (handled by condition itself) + mRotationTool.Rotate(LHS_Contribution, RHS_Contribution, rCurrentCondition.GetGeometry()); + mRotationTool.ApplySlipCondition(LHS_Contribution,RHS_Contribution,rCurrentCondition.GetGeometry()); + } + KRATOS_CATCH( "" ) } @@ -577,8 +596,12 @@ class MPMResidualBasedBossakScheme } // Rotate contributions (to match coordinates for slip conditions) - mRotationTool.RotateRHS(RHS_Contribution,rCurrentCondition.GetGeometry()); - mRotationTool.ConditionApplySlipCondition(RHS_Contribution,rCurrentCondition.GetGeometry()); + if(!mRotationTool.IsParticleBasedSlip(rCurrentCondition.GetGeometry())){ + // prevent rotation in case of particle-based slip (handled by condition itself) + mRotationTool.Rotate(RHS_Contribution, rCurrentCondition.GetGeometry()); + mRotationTool.ApplySlipCondition(RHS_Contribution,rCurrentCondition.GetGeometry()); + } + KRATOS_CATCH( "" ) } @@ -599,13 +622,13 @@ class MPMResidualBasedBossakScheme unsigned int mBlockSize; MPMBoundaryRotationUtility mRotationTool; - void ClearReactionOnPenaltyBoundary() const + void ClearConformingFrictionReaction() const { block_for_each(mGridModelPart.Nodes(), [&](Node& rNode) { const Node& rConstNode = rNode; // const Node reference to avoid issues with previously unset GetValue() - if( mRotationTool.IsPenalty(rConstNode) ) + if( mRotationTool.IsConformingSlip(rConstNode) && rConstNode.GetValue(FRICTION_COEFFICIENT) > 0 ) rNode.FastGetSolutionStepValue(REACTION).clear(); }); } diff --git a/applications/MPMApplication/custom_utilities/mpm_boundary_rotation_utility.h b/applications/MPMApplication/custom_utilities/mpm_boundary_rotation_utility.h index a3be434a371b..b8303a5c7d7f 100644 --- a/applications/MPMApplication/custom_utilities/mpm_boundary_rotation_utility.h +++ b/applications/MPMApplication/custom_utilities/mpm_boundary_rotation_utility.h @@ -25,6 +25,7 @@ #include "geometries/geometry.h" #include "utilities/coordinate_transformation_utilities.h" #include "utilities/parallel_utilities.h" +#include "mpm_application_variables.h" namespace Kratos { @@ -62,6 +63,7 @@ class MPMBoundaryRotationUtility: public CoordinateTransformationUtils::Rotate; + using CoordinateTransformationUtils::RevertRotate; typedef Node NodeType; @@ -78,9 +80,8 @@ class MPMBoundaryRotationUtility: public CoordinateTransformationUtils& rVariable): - CoordinateTransformationUtils(DomainSize,BlockSize,SLIP), mrFlagVariable(rVariable) + const unsigned int BlockSize): + CoordinateTransformationUtils(DomainSize,BlockSize,SLIP) {} /// Destructor. @@ -121,13 +122,23 @@ class MPMBoundaryRotationUtility: public CoordinateTransformationUtilsRotate(rLocalVector,rGeometry); - } + GeometryType& rGeometry) const + { + if (this->GetBlockSize() == this->GetDomainSize()) // irreducible case + { + if (this->GetDomainSize() == 2) this->template RotateAuxPure<2,true>(rLocalMatrix,rLocalVector,rGeometry); + else if (this->GetDomainSize() == 3) this->template RotateAuxPure<3,true>(rLocalMatrix,rLocalVector,rGeometry); + } + else // mixed formulation case + { + if (this->GetDomainSize() == 2) this->template RotateAux<2,3,true>(rLocalMatrix,rLocalVector,rGeometry); + else if (this->GetDomainSize() == 3) this->template RotateAux<3,4,true>(rLocalMatrix,rLocalVector,rGeometry); + } + + } /// Apply roler type boundary conditions to the rotated local contributions. /** This function takes the rotated local system contributions so each @@ -145,7 +156,9 @@ class MPMBoundaryRotationUtility: public CoordinateTransformationUtilsIsSlip(rGeometry[itNode]) ) + // Checks for conforming slip + // [ non-conforming SLIP BCs are treated within the resp. condition itself ] + if( this->IsConformingSlip(rGeometry[itNode]) ) { // We fix the first displacement dof (normal component) for each rotated block unsigned int j = itNode * this->GetBlockSize(); @@ -231,115 +244,26 @@ class MPMBoundaryRotationUtility: public CoordinateTransformationUtilsApplySlipCondition(dummyMatrix, rLocalVector, rGeometry); } - // An extra function to distinguish the application of slip in element considering penalty imposition - void ElementApplySlipCondition(TLocalMatrixType& rLocalMatrix, - TLocalVectorType& rLocalVector, - GeometryType& rGeometry) const - { - // If it is not a penalty element, do as standard - // Otherwise, if it is a penalty element, don't do anything - if (!this->IsPenalty(rGeometry)) - { - this->ApplySlipCondition(rLocalMatrix, rLocalVector, rGeometry); - } - } - - // An extra function to distinguish the application of slip in element considering penalty imposition (RHS Version) - void ElementApplySlipCondition(TLocalVectorType& rLocalVector, - GeometryType& rGeometry) const - { - // If it is not a penalty element, do as standard - // Otherwise, if it is a penalty element, don't do anything - if (!this->IsPenalty(rGeometry)) - { - this->ApplySlipCondition(rLocalVector, rGeometry); - } - } - - // An extra function to distinguish the application of slip in condition considering penalty imposition - void ConditionApplySlipCondition(TLocalMatrixType& rLocalMatrix, - TLocalVectorType& rLocalVector, - GeometryType& rGeometry) const - { - // If it is not a penalty condition, do as standard - if (!this->IsPenalty(rGeometry)) - { - this->ApplySlipCondition(rLocalMatrix, rLocalVector, rGeometry); - } - // Otherwise, do the following modification - else - { - const unsigned int LocalSize = rLocalVector.size(); - - if (LocalSize > 0) - { - const unsigned int block_size = this->GetBlockSize(); - TLocalMatrixType temp_matrix = ZeroMatrix(rLocalMatrix.size1(),rLocalMatrix.size2()); - for(unsigned int itNode = 0; itNode < rGeometry.PointsNumber(); ++itNode) - { - if(this->IsSlip(rGeometry[itNode]) ) - { - // We fix the first displacement dof (normal component) for each rotated block - unsigned int j = itNode * block_size; - - // Copy all normal value in LHS to the temp_matrix - // [ does nothing for dummy rLocalMatrix (size1() == 0) -- RHS only case ] - for (unsigned int i = j; i < rLocalMatrix.size1(); i+= block_size) - { - temp_matrix(i,j) = rLocalMatrix(i,j); - temp_matrix(j,i) = rLocalMatrix(j,i); - } - - // Remove all other value in RHS than the normal component - for(unsigned int i = j; i < (j + block_size); ++i) - { - if (i!=j) rLocalVector[i] = 0.0; - } - } - } - // All entries in penalty matrix zeroed out except for normal component - // [ no effect in case of empty dummy rLocalMatrix ] - rLocalMatrix = temp_matrix; - } - } - } - - // An extra function to distinguish the application of slip in condition considering penalty imposition (RHS Version) - void ConditionApplySlipCondition(TLocalVectorType& rLocalVector, - GeometryType& rGeometry) const - { - // creates an empty dummy matrix to pass into the 'full' ConditionApplySlipCondition -- this dummy matrix is - // ignored, effectively only updating the RHS - TLocalMatrixType dummyMatrix; - this->ConditionApplySlipCondition(dummyMatrix, rLocalVector, rGeometry); - } - - - bool IsPenalty(const NodeType& rNode) const + bool IsParticleBasedSlip(const NodeType& rNode) const { + return rNode.GetValue(PARTICLE_BASED_SLIP); + } - if(this->IsSlip(rNode) ) + // Checking whether it is normal element or penalty element + bool IsParticleBasedSlip(const GeometryType& rGeometry) const + { + for(unsigned int itNode = 0; itNode < rGeometry.PointsNumber(); ++itNode) { - const double identifier = rNode.FastGetSolutionStepValue(mrFlagVariable); - const double tolerance = 1.e-6; - if (identifier > 1.00 + tolerance) + if(IsParticleBasedSlip(rGeometry[itNode])) return true; } return false; } - // Checking whether it is normal element or penalty element - bool IsPenalty(const GeometryType& rGeometry) const - { - for(unsigned int itNode = 0; itNode < rGeometry.PointsNumber(); ++itNode) - { - if(IsPenalty(rGeometry[itNode])) - return true; - } - - return false; - } + bool IsConformingSlip(const NodeType& rNode) const { + return rNode.Is(SLIP) && !IsParticleBasedSlip(rNode); + } /// Same functionalities as RotateVelocities, just to have a clear function naming virtual void RotateDisplacements(ModelPart& rModelPart) const @@ -359,7 +283,9 @@ class MPMBoundaryRotationUtility: public CoordinateTransformationUtils(rModelPart.Nodes().size()); iii++) { ModelPart::NodeIterator itNode = it_begin+iii; - if( this->IsSlip(*itNode) ) + + // rotate conforming slip ONLY -- particle-based slip is handled by the relevant condition + if( this->IsConformingSlip(*itNode) ) { //this->RotationOperator(Rotation,); if(this->GetDomainSize() == 3) @@ -404,7 +330,8 @@ class MPMBoundaryRotationUtility: public CoordinateTransformationUtils(rModelPart.Nodes().size()); iii++) { ModelPart::NodeIterator itNode = it_begin+iii; - if( this->IsSlip(*itNode) ) + // rotate conforming slip ONLY -- particle-based slip is handled by the relevant condition + if( this->IsConformingSlip(*itNode) ) { if(this->GetDomainSize() == 3) { @@ -443,7 +370,7 @@ class MPMBoundaryRotationUtility: public CoordinateTransformationUtilsFastGetSolutionStepValue(NODAL_MASS, 0); - if( this->IsPenalty(*itNode) && nodal_mass > std::numeric_limits::epsilon()) + if( this->IsConformingSlip(*itNode) && nodal_mass > std::numeric_limits::epsilon()) { if(this->GetDomainSize() == 3) { @@ -668,8 +595,6 @@ class MPMBoundaryRotationUtility: public CoordinateTransformationUtils& mrFlagVariable; - ///@} ///@name Private Operators diff --git a/applications/MPMApplication/mpm_application.cpp b/applications/MPMApplication/mpm_application.cpp index 5fb29be8b275..550ba9e2101e 100644 --- a/applications/MPMApplication/mpm_application.cpp +++ b/applications/MPMApplication/mpm_application.cpp @@ -199,6 +199,7 @@ namespace Kratos // Essential Boundary Conditions KRATOS_REGISTER_VARIABLE( MPC_BOUNDARY_CONDITION_TYPE ) KRATOS_REGISTER_VARIABLE( PENALTY_FACTOR ) + KRATOS_REGISTER_VARIABLE( PARTICLE_BASED_SLIP ) // Nodal load variables KRATOS_REGISTER_3D_VARIABLE_WITH_COMPONENTS(POINT_LOAD) diff --git a/applications/MPMApplication/mpm_application_variables.cpp b/applications/MPMApplication/mpm_application_variables.cpp index 403d40af3b2b..651822706496 100644 --- a/applications/MPMApplication/mpm_application_variables.cpp +++ b/applications/MPMApplication/mpm_application_variables.cpp @@ -70,6 +70,7 @@ namespace Kratos // Essential Boundary Conditions KRATOS_CREATE_VARIABLE( double, PENALTY_FACTOR ) KRATOS_CREATE_VARIABLE( int, MPC_BOUNDARY_CONDITION_TYPE ) + KRATOS_CREATE_VARIABLE( bool, PARTICLE_BASED_SLIP ) // Nodal load variables KRATOS_CREATE_3D_VARIABLE_WITH_COMPONENTS(POINT_LOAD) diff --git a/applications/MPMApplication/mpm_application_variables.h b/applications/MPMApplication/mpm_application_variables.h index b8e9e0ccdf2d..ee03cf0f83e9 100644 --- a/applications/MPMApplication/mpm_application_variables.h +++ b/applications/MPMApplication/mpm_application_variables.h @@ -121,6 +121,7 @@ namespace Kratos // Essential Boundary Conditions KRATOS_DEFINE_APPLICATION_VARIABLE( MPM_APPLICATION, double, PENALTY_FACTOR ) KRATOS_DEFINE_APPLICATION_VARIABLE( MPM_APPLICATION, int, MPC_BOUNDARY_CONDITION_TYPE ) + KRATOS_DEFINE_APPLICATION_VARIABLE( MPM_APPLICATION, bool, PARTICLE_BASED_SLIP ) // Natural Boundary Conditions // Nodal load variables diff --git a/applications/MPMApplication/python_scripts/apply_mpm_slip_boundary_process.py b/applications/MPMApplication/python_scripts/apply_mpm_slip_boundary_process.py index e266a2de21ac..0f3e1b411d8f 100644 --- a/applications/MPMApplication/python_scripts/apply_mpm_slip_boundary_process.py +++ b/applications/MPMApplication/python_scripts/apply_mpm_slip_boundary_process.py @@ -41,11 +41,8 @@ def __init__(self, Model, settings ): self.flip_normal = (self.option == "flip_normal") - #TODO: Remove the IS_STRUCTURE variable set as soon as the flag SLIP migration is done for node in self.model_part.Nodes: node.Set(KratosMultiphysics.SLIP, True) - node.SetValue(KratosMultiphysics.IS_STRUCTURE,1.0) - node.SetSolutionStepValue(KratosMultiphysics.IS_STRUCTURE,0,1.0) node.SetValue(KratosMultiphysics.FRICTION_COEFFICIENT, self.friction_coefficient) node.SetValue(KratosMPM.TANGENTIAL_PENALTY_FACTOR, self.tangential_penalty_factor) node.Set(KratosMultiphysics.MODIFIED, self.flip_normal) diff --git a/applications/MPMApplication/tests/mpm_test_factory.py b/applications/MPMApplication/tests/mpm_test_factory.py index f053898ba1a7..d37a3f1e8af0 100644 --- a/applications/MPMApplication/tests/mpm_test_factory.py +++ b/applications/MPMApplication/tests/mpm_test_factory.py @@ -108,7 +108,10 @@ class PenaltyImpositionBeamCantileverStaticHyperelasticSelfWeightLoad2DQuadTest( ### Slip Boundary Tests class SlipBoundaryTest(MPMTestFactory): - file_name = "slip_tests/slip_boundary_test" + file_name = "slip_tests/conforming/slip_boundary_test" + +class PenaltyBasedSlipTest(MPMTestFactory): + file_name = "slip_tests/particle_based/particle_based_slip_test" ### Explicit time integration tests class ExplicitOscillatingPointUSLTest(MPMTestFactory): diff --git a/applications/MPMApplication/tests/slip_tests/slip_boundary_test_Body.mdpa b/applications/MPMApplication/tests/slip_tests/conforming/slip_boundary_test_Body.mdpa similarity index 100% rename from applications/MPMApplication/tests/slip_tests/slip_boundary_test_Body.mdpa rename to applications/MPMApplication/tests/slip_tests/conforming/slip_boundary_test_Body.mdpa diff --git a/applications/MPMApplication/tests/slip_tests/slip_boundary_test_Grid.mdpa b/applications/MPMApplication/tests/slip_tests/conforming/slip_boundary_test_Grid.mdpa similarity index 100% rename from applications/MPMApplication/tests/slip_tests/slip_boundary_test_Grid.mdpa rename to applications/MPMApplication/tests/slip_tests/conforming/slip_boundary_test_Grid.mdpa diff --git a/applications/MPMApplication/tests/slip_tests/slip_boundary_test_materials.json b/applications/MPMApplication/tests/slip_tests/conforming/slip_boundary_test_materials.json similarity index 100% rename from applications/MPMApplication/tests/slip_tests/slip_boundary_test_materials.json rename to applications/MPMApplication/tests/slip_tests/conforming/slip_boundary_test_materials.json diff --git a/applications/MPMApplication/tests/slip_tests/slip_boundary_test_parameters.json b/applications/MPMApplication/tests/slip_tests/conforming/slip_boundary_test_parameters.json similarity index 87% rename from applications/MPMApplication/tests/slip_tests/slip_boundary_test_parameters.json rename to applications/MPMApplication/tests/slip_tests/conforming/slip_boundary_test_parameters.json index 2b2e7291c64b..ddd15976f706 100644 --- a/applications/MPMApplication/tests/slip_tests/slip_boundary_test_parameters.json +++ b/applications/MPMApplication/tests/slip_tests/conforming/slip_boundary_test_parameters.json @@ -16,10 +16,10 @@ "scheme_type" : "newmark", "model_import_settings" : { "input_type" : "mdpa", - "input_filename" : "slip_tests/slip_boundary_test_Body" + "input_filename" : "slip_tests/conforming/slip_boundary_test_Body" }, "material_import_settings" : { - "materials_filename" : "slip_tests/slip_boundary_test_materials.json" + "materials_filename" : "slip_tests/conforming/slip_boundary_test_materials.json" }, "time_stepping" : { "time_step" : 0.05 @@ -34,10 +34,10 @@ "processes_sub_model_part_list" : ["DISPLACEMENT_Displacement_Auto1","Slip2D_Slip_Auto1"], "grid_model_import_settings" : { "input_type" : "mdpa", - "input_filename" : "slip_tests/slip_boundary_test_Grid" + "input_filename" : "slip_tests/conforming/slip_boundary_test_Grid" }, "pressure_dofs" : false, - "auxiliary_variables_list" : ["NORMAL","IS_STRUCTURE"] + "auxiliary_variables_list" : ["NORMAL"] }, "processes" : { "constraints_process_list" : [{ @@ -65,7 +65,7 @@ "process_name" : "MPMFromJsonCheckResultProcess", "Parameters" : { "check_variables" : ["MP_VELOCITY"], - "input_file_name" : "slip_tests/slip_boundary_test_results.json", + "input_file_name" : "slip_tests/conforming/slip_boundary_test_results.json", "model_part_name" : "MPM_Material", "time_frequency" : 0.09 } @@ -77,7 +77,7 @@ "process_name" : "FromJsonCheckResultProcess", "Parameters" : { "check_variables" : ["NORMAL"], - "input_file_name" : "slip_tests/slip_boundary_test_results2.json", + "input_file_name" : "slip_tests/conforming/slip_boundary_test_results2.json", "model_part_name" : "Background_Grid.Slip2D_Slip_Auto1", "time_frequency" : 1.49 } @@ -101,7 +101,7 @@ "process_name" : "MPMJsonOutputProcess", "Parameters" : { "gauss_points_output_variables" : ["MP_VELOCITY"], - "output_file_name" : "slip_tests/slip_boundary_test_results.json", + "output_file_name" : "slip_tests/conforming/slip_boundary_test_results.json", "model_part_name" : "MPM_Material", "time_frequency" : 0.09 } @@ -113,7 +113,7 @@ "process_name" : "JsonOutputProcess", "Parameters" : { "output_variables" : ["NORMAL"], - "output_file_name" : "slip_tests/slip_boundary_test_results2.json", + "output_file_name" : "slip_tests/conforming/slip_boundary_test_results2.json", "model_part_name" : "Background_Grid.Slip2D_Slip_Auto1", "time_frequency" : 1.49 } diff --git a/applications/MPMApplication/tests/slip_tests/slip_boundary_test_results.json b/applications/MPMApplication/tests/slip_tests/conforming/slip_boundary_test_results.json similarity index 100% rename from applications/MPMApplication/tests/slip_tests/slip_boundary_test_results.json rename to applications/MPMApplication/tests/slip_tests/conforming/slip_boundary_test_results.json diff --git a/applications/MPMApplication/tests/slip_tests/slip_boundary_test_results2.json b/applications/MPMApplication/tests/slip_tests/conforming/slip_boundary_test_results2.json similarity index 100% rename from applications/MPMApplication/tests/slip_tests/slip_boundary_test_results2.json rename to applications/MPMApplication/tests/slip_tests/conforming/slip_boundary_test_results2.json diff --git a/applications/MPMApplication/tests/slip_tests/particle_based/particle_based_slip_test_Body.mdpa b/applications/MPMApplication/tests/slip_tests/particle_based/particle_based_slip_test_Body.mdpa new file mode 100644 index 000000000000..291c219f4609 --- /dev/null +++ b/applications/MPMApplication/tests/slip_tests/particle_based/particle_based_slip_test_Body.mdpa @@ -0,0 +1,45 @@ +Begin ModelPartData +// VARIABLE_NAME value +End ModelPartData + +Begin Properties 0 +End Properties +Begin Nodes + 17 1.22474487139159 0.7071067811865478 0.0 + 19 1.0953353488403292 0.22414386804201353 0.0 + 21 0.9659258262890683 -0.25881904510252074 0.0 + 24 0.7417819582470554 0.836516303737808 0.0 + 26 0.6123724356957949 0.3535533905932742 0.0 + 28 0.48296291314453416 -0.12940952255126037 0.0 + 31 0.25881904510252074 0.9659258262890683 0.0 + 33 0.12940952255126037 0.48296291314453416 0.0 + 35 0.0 0.0 0.0 +End Nodes + + +Begin Elements MPMUpdatedLagrangian2D4N// GUI group identifier: Material domain Auto1 + 1 0 28 26 33 35 + 2 0 21 19 26 28 + 3 0 26 24 31 33 + 4 0 19 17 24 26 +End Elements + +Begin SubModelPart Parts_Material_domain_Material_domain_Auto1 // Group Material domain Auto1 // Subtree Parts_Material_domain + Begin SubModelPartNodes + 17 + 19 + 21 + 24 + 26 + 28 + 31 + 33 + 35 + End SubModelPartNodes + Begin SubModelPartElements + 1 + 2 + 3 + 4 + End SubModelPartElements +End SubModelPart diff --git a/applications/MPMApplication/tests/slip_tests/particle_based/particle_based_slip_test_Grid.mdpa b/applications/MPMApplication/tests/slip_tests/particle_based/particle_based_slip_test_Grid.mdpa new file mode 100644 index 000000000000..3e59055f675e --- /dev/null +++ b/applications/MPMApplication/tests/slip_tests/particle_based/particle_based_slip_test_Grid.mdpa @@ -0,0 +1,120 @@ +Begin ModelPartData +// VARIABLE_NAME value +End ModelPartData + +Begin Properties 0 +End Properties +Begin Nodes + 1 3.1565965239697262 0.1894686909815062 0.0 + 2 2.673633610825192 0.3188782135327665 0.0 + 3 3.0013050969082133 -0.3900868047919351 0.0 + 4 2.5183421837636804 -0.26067728224067477 0.0 + 6 2.1906706976806576 0.44828773608402694 0.0 + 8 2.035379270619146 -0.13126775968941423 0.0 + 9 2.8460136698467005 -0.9696423005653764 0.0 + 10 2.363050756702166 -0.8402327780141159 0.0 + 12 1.7077077845361235 0.5776972586352873 0.0 + 13 1.880087843557632 -0.7108232554628554 0.0 + 14 1.5524163574746108 -0.00185823713815364 0.0 + 16 1.3971249304130982 -0.581413732911595 0.0 + 18 1.2247448713915892 0.7071067811865477 0.0 + 20 1.0694534443300765 0.12755128541310667 0.0 + 23 0.9141620172685639 -0.45200421036033456 0.0 + 25 0.741781958247055 0.8365163037378079 0.0 + 27 0.5864905311855424 0.2569608079643673 0.0 + 30 0.4311991041240299 -0.32259468780907413 0.0 + 32 0.25881904510252074 0.9659258262890683 0.0 + 34 0.1035276180410083 0.3863703305156273 0.0 + 37 -0.051763809020504155 -0.1931851652578137 0.0 + 5 2.897777478867205 -0.7764571353075622 0.0 + 7 2.414814565722671 -0.6470476127563018 0.0 + 11 1.9318516525781366 -0.5176380902050415 0.0 + 15 1.4488887394336025 -0.3882285676537811 0.0 + 22 0.9659258262890683 -0.25881904510252074 0.0 + 29 0.48296291314453416 -0.12940952255126037 0.0 + 36 0.0 0.0 0.0 +End Nodes + + +Begin Elements Element2D4N// GUI group identifier: Grid Auto1 + 5 0 30 27 34 37 + 6 0 23 20 27 30 + 7 0 16 14 20 23 + 8 0 13 8 14 16 + 9 0 10 4 8 13 + 10 0 9 3 4 10 + 11 0 27 25 32 34 + 12 0 20 18 25 27 + 13 0 14 12 18 20 + 14 0 8 6 12 14 + 15 0 4 2 6 8 + 16 0 3 1 2 4 +End Elements + +Begin Conditions LineCondition2D2N// GUI group identifier: ground + 1 0 36 29 + 2 0 29 22 + 3 0 22 15 + 4 0 15 11 + 5 0 11 7 + 6 0 7 5 +End Conditions + +Begin SubModelPart Parts_Grid_Grid_Auto1 // Group Grid Auto1 // Subtree Parts_Grid + Begin SubModelPartNodes + 1 + 2 + 3 + 4 + 6 + 8 + 9 + 10 + 12 + 13 + 14 + 16 + 18 + 20 + 23 + 25 + 27 + 30 + 32 + 34 + 37 + End SubModelPartNodes + Begin SubModelPartElements + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + 13 + 14 + 15 + 16 + End SubModelPartElements +End SubModelPart +Begin SubModelPart Slip2D_ground // Group ground // Subtree Slip2D + Begin SubModelPartNodes + 5 + 7 + 11 + 15 + 22 + 29 + 36 + End SubModelPartNodes + Begin SubModelPartConditions + 1 + 2 + 3 + 4 + 5 + 6 + End SubModelPartConditions +End SubModelPart diff --git a/applications/MPMApplication/tests/slip_tests/particle_based/particle_based_slip_test_materials.json b/applications/MPMApplication/tests/slip_tests/particle_based/particle_based_slip_test_materials.json new file mode 100644 index 000000000000..236f2594ef43 --- /dev/null +++ b/applications/MPMApplication/tests/slip_tests/particle_based/particle_based_slip_test_materials.json @@ -0,0 +1,21 @@ +{ + "properties": [ + { + "Material": { + "Tables": null, + "Variables": { + "DENSITY": 1000.0, + "MATERIAL_POINTS_PER_ELEMENT": 4, + "POISSON_RATIO": 0, + "THICKNESS": 1.0, + "YOUNG_MODULUS": 200000000000.0 + }, + "constitutive_law": { + "name": "LinearElasticIsotropicPlaneStrain2DLaw" + } + }, + "model_part_name": "Initial_MPM_Material.Parts_Material_domain_Material_domain_Auto1", + "properties_id": 1 + } + ] +} \ No newline at end of file diff --git a/applications/MPMApplication/tests/slip_tests/particle_based/particle_based_slip_test_parameters.json b/applications/MPMApplication/tests/slip_tests/particle_based/particle_based_slip_test_parameters.json new file mode 100644 index 000000000000..e72c779bb663 --- /dev/null +++ b/applications/MPMApplication/tests/slip_tests/particle_based/particle_based_slip_test_parameters.json @@ -0,0 +1,93 @@ +{ + "problem_data": { + "problem_name": "particle_based_slip_test", + "parallel_type": "OpenMP", + "echo_level": 0, + "start_time": 0.0, + "end_time": 0.499 + }, + "solver_settings": { + "time_stepping": { + "time_step": 0.05 + }, + "solver_type": "Dynamic", + "model_part_name": "MPM_Material", + "domain_size": 2, + "echo_level": 0, + "analysis_type": "non_linear", + "time_integration_method": "implicit", + "scheme_type": "newmark", + "model_import_settings": { + "input_type": "mdpa", + "input_filename": "slip_tests/particle_based/particle_based_slip_test_Body" + }, + "material_import_settings": { + "materials_filename": "slip_tests/particle_based/particle_based_slip_test_materials.json" + }, + "convergence_criterion": "residual_criterion", + "displacement_relative_tolerance": 0.0001, + "displacement_absolute_tolerance": 1e-09, + "residual_relative_tolerance": 0.0001, + "residual_absolute_tolerance": 1e-09, + "max_iteration": 10, + "grid_model_import_settings": { + "input_type": "mdpa", + "input_filename": "slip_tests/particle_based/particle_based_slip_test_Grid" + }, + "pressure_dofs": false, + "linear_solver_settings": { + "solver_type": "LinearSolversApplication.sparse_lu" + }, + "auxiliary_variables_list": [ + "NORMAL", + "NODAL_AREA" + ] + }, + "processes": { + "constraints_process_list": [], + "loads_process_list": [], + "list_other_processes": [ + { + "python_module": "apply_mpm_particle_dirichlet_condition_process", + "kratos_module": "KratosMultiphysics.MPMApplication", + "Parameters": { + "material_points_per_condition": 1, + "penalty_factor": 1000000000000.0, + "constrained": "slip", + "model_part_name": "Background_Grid.Slip2D_ground" + } + } + ], + "gravity": [ + { + "python_module": "assign_gravity_to_material_point_process", + "kratos_module": "KratosMultiphysics.MPMApplication", + "process_name": "AssignGravityToMaterialPointProcess", + "Parameters": { + "model_part_name": "MPM_Material", + "variable_name": "MP_VOLUME_ACCELERATION", + "modulus": 10, + "direction": [ + 0.0, + -1.0, + 0.0 + ] + } + } + ] + + }, + "print_output_process" : [{ + "python_module" : "mpm_json_output_process", + "kratos_module" : "KratosMultiphysics.MPMApplication", + "help" : "", + "process_name" : "MPMJsonOutputProcess", + "Parameters" : { + "gauss_points_output_variables" : ["MP_DISPLACEMENT", "MP_VELOCITY"], + "output_file_name" : "slip_tests/particle_based/particle_based_slip_test_results.json", + "model_part_name" : "MPM_Material", + "time_frequency" : 0.49 + } + }], + "analysis_stage": "KratosMultiphysics.MPMApplication.mpm_analysis" +} \ No newline at end of file diff --git a/applications/MPMApplication/tests/slip_tests/particle_based/particle_based_slip_test_results.json b/applications/MPMApplication/tests/slip_tests/particle_based/particle_based_slip_test_results.json new file mode 100644 index 000000000000..bf576724cd9b --- /dev/null +++ b/applications/MPMApplication/tests/slip_tests/particle_based/particle_based_slip_test_results.json @@ -0,0 +1,1198 @@ +{ + "TIME": [ + 0.05, + 0.1, + 0.15000000000000002, + 0.2, + 0.25, + 0.3, + 0.35, + 0.39999999999999997, + 0.44999999999999996, + 0.49999999999999994 + ], + "MP_29": { + "MP_DISPLACEMENT_X": [ + 0.003124996243381927, + 0.01249999925479919, + 0.028124994729083176, + 0.04999999778673761, + 0.07812499015324446, + 0.11249999330201532, + 0.15312498402381775, + 0.19999998624375245, + 0.2531249783505615, + 0.31249998104316 + ], + "MP_DISPLACEMENT_Y": [ + -0.0008373686997729644, + -0.003349384785875654, + -0.0075361176947820845, + -0.013397498113498843, + -0.020933595125684337, + -0.030144338972980522, + -0.04102980364791079, + -0.0535899119813818, + -0.06782474010256899, + -0.08373421387965352 + ], + "MP_DISPLACEMENT_Z": [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "MP_VELOCITY_X": [ + 0.12499984973527703, + 0.25000066252318465, + 0.37499881178556943, + 0.5000016250536136, + 0.6249979480658896, + 0.7500021922643815, + 0.8749973495207972, + 1.0000028658174067, + 1.124996571360945, + 1.2500036531052277 + ], + "MP_VELOCITY_Y": [ + -0.03349474799091858, + -0.06698507774496427, + -0.10048543452094051, + -0.1339689000078757, + -0.16747563719761374, + -0.2009536554052363, + -0.23446545699041382, + -0.26793837654805525, + -0.3014557158091553, + -0.3349227159059223 + ], + "MP_VELOCITY_Z": [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ] + }, + "MP_30": { + "MP_DISPLACEMENT_X": [ + 0.0031249896035009006, + 0.012499996215725107, + 0.02812498574064088, + 0.049999992310671926, + 0.07812498141430443, + 0.11249998783872955, + 0.15312497506431275, + 0.19999998218950082, + 0.25312497103187354, + 0.3124999780202098 + ], + "MP_DISPLACEMENT_Y": [ + -0.0008373844947019267, + -0.0033493837564595526, + -0.007536132636127192, + -0.013397496479564916, + -0.02093360956336561, + -0.030144337407649345, + -0.041029817395823974, + -0.053589909730334034, + -0.0678247528301566, + -0.0837342097310332 + ], + "MP_DISPLACEMENT_Z": [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "MP_VELOCITY_X": [ + 0.12499958414003604, + 0.25000068459211633, + 0.3749988195216577, + 0.5000015205309595, + 0.6249980377396334, + 0.7500022021756771, + 0.8749972956649704, + 1.0000029028705733, + 1.12499660982445, + 1.2500037299821092 + ], + "MP_VELOCITY_Y": [ + -0.03349537978807713, + -0.0669847719173294, + -0.10048533069575893, + -0.1339690184790652, + -0.16747551050944495, + -0.20095367715692214, + -0.23446549210322698, + -0.2679382500295959, + -0.30145564428349425, + -0.33492261282603036 + ], + "MP_VELOCITY_Z": [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ] + }, + "MP_31": { + "MP_DISPLACEMENT_X": [ + 0.003124989574447178, + 0.01249999549882486, + 0.02812498510800358, + 0.04999999095907294, + 0.07812498082071259, + 0.11249998651827778, + 0.15312497679077638, + 0.19999998270037622, + 0.25312497334460027, + 0.3124999794686582 + ], + "MP_DISPLACEMENT_Y": [ + -0.000837386122379659, + -0.0033493867228684042, + -0.007536136638224936, + -0.013397501825314257, + -0.020933613489367855, + -0.030144342652436512, + -0.04102981694350639, + -0.05358991071024061, + -0.06782475204572865, + -0.08373420945123786 + ], + "MP_DISPLACEMENT_Z": [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "MP_VELOCITY_X": [ + 0.1249995829778871, + 0.25000069078374487, + 0.3749988148511861, + 0.5000014951626155, + 0.6249980547990504, + 0.7500022001631205, + 0.8749973762817123, + 1.0000030029929503, + 1.1249966547442771, + 1.2500037890782687 + ], + "MP_VELOCITY_Y": [ + -0.03349544489518635, + -0.06698479850117867, + -0.10048536632187567, + -0.1339691076752553, + -0.1674754419897088, + -0.20095368359817808, + -0.23446535803452434, + -0.2679381043849694, + -0.3014556859805243, + -0.33492255558306 + ], + "MP_VELOCITY_Z": [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ] + }, + "MP_32": { + "MP_DISPLACEMENT_X": [ + 0.0031249956463067757, + 0.012499998426542147, + 0.028124993532838746, + 0.04999999631328086, + 0.07812498916304236, + 0.11249999186373785, + 0.15312498213620876, + 0.19999998502210392, + 0.25312497697780567, + 0.31249998043062727 + ], + "MP_DISPLACEMENT_Y": [ + -0.0008373677958294638, + -0.0033493872773133755, + -0.007536118771823131, + -0.013397502997978195, + -0.020933595230913718, + -0.030144343730234974, + -0.041029796815772734, + -0.053589909538513086, + -0.06782472994823928, + -0.08373420607098836 + ], + "MP_DISPLACEMENT_Z": [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "MP_VELOCITY_X": [ + 0.12499982585227101, + 0.2500006636464412, + 0.37499881599584606, + 0.5000016063590612, + 0.6249979759013122, + 0.7500021987201829, + 0.8749973059540905, + 1.0000028356023143, + 1.1249965716130337, + 1.250003720875353 + ], + "MP_VELOCITY_Y": [ + -0.033494711833178537, + -0.06698503013165488, + -0.10048542642059455, + -0.1339689720724983, + -0.16747552689891784, + -0.20095364169183816, + -0.23446521751160554, + -0.2679380562734583, + -0.301455552868203, + -0.3349223604568391 + ], + "MP_VELOCITY_Z": [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ] + }, + "MP_33": { + "MP_DISPLACEMENT_X": [ + 0.00312499974172882, + 0.012500001156527283, + 0.028124999803509944, + 0.05000000083633218, + 0.078124996465905, + 0.11249999641181278, + 0.15312499137835833, + 0.19999999233080545, + 0.2531249893206013, + 0.31249999078408774 + ], + "MP_DISPLACEMENT_Y": [ + -0.0008373610689951349, + -0.0033493787488254583, + -0.007536105145171976, + -0.013397488013074152, + -0.020933580648551227, + -0.03014432916257919, + -0.04102979090154476, + -0.053589903058914715, + -0.06782472590793058, + -0.08373420192796877 + ], + "MP_DISPLACEMENT_Z": [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "MP_VELOCITY_X": [ + 0.12499998966915278, + 0.25000070727020834, + 0.37499882511253557, + 0.5000016583057451, + 0.6249979634646491, + 0.750002207803885, + 0.8749974009636503, + 1.0000030159316011, + 1.1249967536833458, + 1.250003820788491 + ], + "MP_VELOCITY_Y": [ + -0.03349444275980536, + -0.06698498492214662, + -0.10048539342682275, + -0.13396878707370816, + -0.16747569537700857, + -0.20095361906127787, + -0.2344654815571078, + -0.26793824916197956, + -0.3014554391364545, + -0.33492255521403885 + ], + "MP_VELOCITY_Z": [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ] + }, + "MP_34": { + "MP_DISPLACEMENT_X": [ + 0.0031249904928229463, + 0.012499997611966414, + 0.028124987752758276, + 0.04999999477216681, + 0.0781249834558024, + 0.11249999014080508, + 0.15312497579388584, + 0.1999999824685116, + 0.2531249700378402, + 0.31249997707243843 + ], + "MP_DISPLACEMENT_Y": [ + -0.0008373785442925569, + -0.003349378031255849, + -0.0075361220318714405, + -0.013397486664595198, + -0.020933597617325064, + -0.03014432787530863, + -0.041029807043614114, + -0.05358990118918204, + -0.06782474231732119, + -0.08373420036516341 + ], + "MP_DISPLACEMENT_Z": [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "MP_VELOCITY_X": [ + 0.12499961971291784, + 0.2500006710909698, + 0.37499880916994033, + 0.5000015468208387, + 0.6249980023368631, + 0.7500021959418347, + 0.874997250534495, + 1.0000028433125565, + 1.1249965506402526, + 1.2500036279957065 + ], + "MP_VELOCITY_Y": [ + -0.03349514177170221, + -0.0669847362236057, + -0.10048532923014714, + -0.13396892176413028, + -0.1674755999972804, + -0.20095365440466736, + -0.23446551596198079, + -0.2679381562023711, + -0.3014554768358343, + -0.3349226591223353 + ], + "MP_VELOCITY_Z": [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ] + }, + "MP_35": { + "MP_DISPLACEMENT_X": [ + 0.003124989849578947, + 0.01249999677786228, + 0.028124986462943653, + 0.04999999330596736, + 0.07812498216980221, + 0.11249998873441898, + 0.15312497527323687, + 0.1999999822247572, + 0.2531249703765378, + 0.3124999775126209 + ], + "MP_DISPLACEMENT_Y": [ + -0.0008373824641596077, + -0.0033493814427034635, + -0.007536128665758556, + -0.013397492517531182, + -0.020933605020826876, + -0.030144333743818627, + -0.04102981339925973, + -0.05358990653469383, + -0.0678247492013199, + -0.08373420682471687 + ], + "MP_DISPLACEMENT_Z": [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "MP_VELOCITY_X": [ + 0.12499959398315785, + 0.2500006788990737, + 0.37499881842808275, + 0.5000015333728949, + 0.6249980255339186, + 0.7500021998280538, + 0.8749972779397892, + 1.00000288202566, + 1.1249965867943494, + 1.25000369315614 + ], + "MP_VELOCITY_Y": [ + -0.03349529856638429, + -0.06698475678397608, + -0.10048531895789191, + -0.13396897245305633, + -0.1674755420331708, + -0.20095367242738257, + -0.23446549873961586, + -0.26793819972691363, + -0.30145557688233265, + -0.33492265827158846 + ], + "MP_VELOCITY_Z": [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ] + }, + "MP_36": { + "MP_DISPLACEMENT_X": [ + 0.003124997340746956, + 0.012499999974400038, + 0.028124996456380554, + 0.049999998919669775, + 0.07812499237930368, + 0.11249999429418114, + 0.15312498680164238, + 0.19999998839436856, + 0.2531249823512025, + 0.31249998426478387 + ], + "MP_DISPLACEMENT_Y": [ + -0.0008373668973231384, + -0.003349382545201388, + -0.007536113879591357, + -0.013397494389601857, + -0.020933590434711536, + -0.030144335871305987, + -0.041029799470642, + -0.05358990957514121, + -0.06782473670878156, + -0.08373421102177732 + ], + "MP_DISPLACEMENT_Z": [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "MP_VELOCITY_X": [ + 0.12499989362987823, + 0.2500006733159461, + 0.37499881532885804, + 0.5000016357117281, + 0.6249979517893753, + 0.7500021889564371, + 0.8749973685977235, + 1.0000029217665227, + 1.1249966256676371, + 1.2500036833710615 + ], + "MP_VELOCITY_Y": [ + -0.03349467589292554, + -0.06698506896959308, + -0.100485422116701, + -0.13396886216754428, + -0.16747566422016139, + -0.20095366613841842, + -0.23446547868538828, + -0.26793833581218923, + -0.3014556600657223, + -0.33492271878992114 + ], + "MP_VELOCITY_Z": [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ] + }, + "MP_37": { + "MP_DISPLACEMENT_X": [ + 0.0031249857918317996, + 0.012499993905740326, + 0.028124980067191177, + 0.04999998825598111, + 0.07812497546181629, + 0.11249998385640748, + 0.15312497065981956, + 0.19999997958630705, + 0.25312496671850176, + 0.3124999755421032 + ], + "MP_DISPLACEMENT_Y": [ + -0.0008373907564016869, + -0.0033493830863840753, + -0.0075361383449107896, + -0.013397495354820502, + -0.020933615049735253, + -0.030144336328184224, + -0.04102982281224091, + -0.05358990847569937, + -0.06782475804872018, + -0.0837342081442936 + ], + "MP_DISPLACEMENT_Z": [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "MP_VELOCITY_X": [ + 0.12499943167327202, + 0.250000747228771, + 0.37499880741187763, + 0.5000014214368006, + 0.6249981132674607, + 0.7500022022040792, + 0.8749973081132982, + 1.0000029627522835, + 1.1249965737960823, + 1.2500037278503564 + ], + "MP_VELOCITY_Y": [ + -0.03349563025606748, + -0.06698443692253284, + -0.10048537929093554, + -0.1339691920362683, + -0.16747535894432283, + -0.20095369235280014, + -0.23446556435578014, + -0.26793815747212046, + -0.30145562264542247, + -0.3349226239607286 + ], + "MP_VELOCITY_Z": [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ] + }, + "MP_38": { + "MP_DISPLACEMENT_X": [ + 0.0031249806244504873, + 0.012499990747036633, + 0.02812497235121004, + 0.049999982715442315, + 0.0781249673472971, + 0.11249997841709605, + 0.15312496472419468, + 0.19999997604399453, + 0.25312496086560127, + 0.3124999721469722 + ], + "MP_DISPLACEMENT_Y": [ + -0.0008373991106707491, + -0.0033493821741864037, + -0.007536145946589365, + -0.013397493821078847, + -0.020933622353093848, + -0.03014433485611092, + -0.041029830036403564, + -0.05358990677663311, + -0.06782476502326226, + -0.08373420603132037 + ], + "MP_DISPLACEMENT_Z": [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "MP_VELOCITY_X": [ + 0.1249992249780195, + 0.2500008345401887, + 0.3749987902011367, + 0.5000012852224669, + 0.624998216812052, + 0.7500022019710405, + 0.8749973270690069, + 1.000003045784175, + 1.1249965221662643, + 1.2500037227414178 + ], + "MP_VELOCITY_Y": [ + -0.033495964426830005, + -0.0669839751322158, + -0.10048545035962421, + -0.13396943238571712, + -0.16747514969032423, + -0.20095371308364016, + -0.23446566480559763, + -0.26793803103886304, + -0.30145559424311863, + -0.3349226424283074 + ], + "MP_VELOCITY_Z": [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ] + }, + "MP_39": { + "MP_DISPLACEMENT_X": [ + 0.003124980010386399, + 0.012499989919540395, + 0.028124971058947908, + 0.049999981253750964, + 0.07812496595175802, + 0.1124999769840135, + 0.15312496459885472, + 0.19999997557460142, + 0.253124960317619, + 0.31249997152810743 + ], + "MP_DISPLACEMENT_Y": [ + -0.000837401877337435, + -0.003349385353320127, + -0.0075361512851983906, + -0.013397499365490093, + -0.020933628140305686, + -0.03014434027369802, + -0.04102983344181155, + -0.053589910164488136, + -0.06782476889290551, + -0.08373420961289166 + ], + "MP_DISPLACEMENT_Z": [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "MP_VELOCITY_X": [ + 0.12499920041545594, + 0.250000817849033, + 0.37499877781194213, + 0.5000012682241046, + 0.624998235790418, + 0.7500022000633453, + 0.8749973696470942, + 1.000003066618972, + 1.124996461967355, + 1.2500036866709532 + ], + "MP_VELOCITY_Y": [ + -0.03349607509349744, + -0.06698401175103458, + -0.10048547078164607, + -0.13396950039586558, + -0.16747508880876952, + -0.2009537141621886, + -0.23446559866470568, + -0.26793799868794066, + -0.30145569614309453, + -0.33492266462611286 + ], + "MP_VELOCITY_Z": [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ] + }, + "MP_40": { + "MP_DISPLACEMENT_X": [ + 0.0031249855258989085, + 0.012499993144103598, + 0.02812497916658177, + 0.0499999868599754, + 0.07812497453912813, + 0.11249998249044667, + 0.15312497165726352, + 0.19999997970920028, + 0.2531249678832854, + 0.31249997615408154 + ], + "MP_DISPLACEMENT_Y": [ + -0.0008373928869389839, + -0.0033493861467346502, + -0.0075361429365511795, + -0.013397500788503734, + -0.02093361979383379, + -0.03014434165044641, + -0.04102982403795583, + -0.053589910496606226, + -0.06782475930788394, + -0.08373420955720744 + ], + "MP_DISPLACEMENT_Z": [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "MP_VELOCITY_X": [ + 0.12499942103595632, + 0.250000743958379, + 0.37499879942840253, + 0.5000013994742161, + 0.6249981310017809, + 0.7500022001381299, + 0.8749973743270442, + 1.0000030313810904, + 1.1249965754943065, + 1.2500037472543255 + ], + "MP_VELOCITY_Y": [ + -0.03349571547755934, + -0.06698446853118362, + -0.10048540909244894, + -0.1339692726145048, + -0.16747529408088419, + -0.20095369679380207, + -0.23446545975491198, + -0.2679380609620761, + -0.30145569173307957, + -0.33492260318381384 + ], + "MP_VELOCITY_Z": [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ] + }, + "MP_41": { + "MP_DISPLACEMENT_X": [ + 0.003124986704625462, + 0.012499995307650535, + 0.02812498210801897, + 0.049999990732218044, + 0.07812497753843496, + 0.11249998620352913, + 0.15312497155879126, + 0.19999998023532767, + 0.25312496631001036, + 0.3124999751761273 + ], + "MP_DISPLACEMENT_Y": [ + -0.0008373853786277539, + -0.003349377469129871, + -0.007536128407761694, + -0.013397485647085833, + -0.020933604009740703, + -0.030144326907363732, + -0.041029814052577884, + -0.05358990093892038, + -0.06782474969707022, + -0.08373420050882459 + ], + "MP_DISPLACEMENT_Z": [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "MP_VELOCITY_X": [ + 0.12499946818501846, + 0.25000074505114767, + 0.3749988063608688, + 0.5000014490056345, + 0.6249980773122621, + 0.7500022052848964, + 0.8749972727658923, + 1.0000029262879169, + 1.124996558346942, + 1.2500036527517382 + ], + "MP_VELOCITY_Y": [ + -0.03349541514511008, + -0.06698441175195331, + -0.10048537552454195, + -0.13396908595496357, + -0.16747545281642706, + -0.20095366848969565, + -0.23446561258413282, + -0.26793812284231666, + -0.301455509216552, + -0.334922721467774 + ], + "MP_VELOCITY_Z": [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ] + }, + "MP_42": { + "MP_DISPLACEMENT_X": [ + 0.003124981642023129, + 0.012499992170820939, + 0.02812497451665004, + 0.049999985228562804, + 0.07812496959080854, + 0.1124999808496833, + 0.15312496604334297, + 0.19999997737228453, + 0.25312496160840176, + 0.31249997289191467 + ], + "MP_DISPLACEMENT_Y": [ + -0.0008373944904033591, + -0.0033493766998679507, + -0.007536136892254295, + -0.01339748425600375, + -0.020933612515170213, + -0.030144325584168588, + -0.04102982344617905, + -0.053589900639129925, + -0.06782475960375985, + -0.08373420075350951 + ], + "MP_DISPLACEMENT_Z": [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "MP_VELOCITY_X": [ + 0.12499926568092515, + 0.2500008498603681, + 0.3749988028568285, + 0.5000013147781057, + 0.624998181480063, + 0.750002218725602, + 0.8749973081122548, + 1.000003047507583, + 1.1249965747544097, + 1.2500036928080178 + ], + "MP_VELOCITY_Y": [ + -0.03349577961613428, + -0.0669839631593756, + -0.10048544227268154, + -0.13396931271088142, + -0.1674752488543536, + -0.20095368728710994, + -0.23446574725951144, + -0.2679380785767468, + -0.30145555362970267, + -0.33492280611761055 + ], + "MP_VELOCITY_Z": [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ] + }, + "MP_43": { + "MP_DISPLACEMENT_X": [ + 0.0031249810616462326, + 0.012499991350483084, + 0.028124973276442814, + 0.049999983781963485, + 0.0781249683106824, + 0.1124999794566594, + 0.15312496529666866, + 0.1999999766152439, + 0.2531249611902949, + 0.31249997247320005 + ], + "MP_DISPLACEMENT_Y": [ + -0.000837397131347729, + -0.0033493798546690608, + -0.007536142092908524, + -0.013397489767635178, + -0.02093361817402819, + -0.030144330918491915, + -0.04102982720317134, + -0.05358990417357274, + -0.06782476260166236, + -0.08373420382420237 + ], + "MP_DISPLACEMENT_Z": [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "MP_VELOCITY_X": [ + 0.12499924246584926, + 0.2500008430585756, + 0.37499879713565715, + 0.5000012979712831, + 0.6249982025156687, + 0.7500022090829415, + 0.8749973184074142, + 1.0000030498916912, + 1.124996549284158, + 1.2500037101646353 + ], + "MP_VELOCITY_Y": [ + -0.03349588525390912, + -0.06698396233678167, + -0.10048544173061177, + -0.13396938131317482, + -0.16747519028514768, + -0.20095370286711922, + -0.23446569933727546, + -0.26793804270322397, + -0.301455563240428, + -0.33492271214242797 + ], + "MP_VELOCITY_Z": [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ] + }, + "MP_44": { + "MP_DISPLACEMENT_X": [ + 0.0031249861076706282, + 0.012499994483260047, + 0.02812498086240846, + 0.04999998927933262, + 0.07812497628695822, + 0.11249998481084886, + 0.153124970990568, + 0.19999997982032555, + 0.2531249664175613, + 0.31249997533869567 + ], + "MP_DISPLACEMENT_Y": [ + -0.0008373887445557563, + -0.003349380769394013, + -0.007536134421311036, + -0.013397491352029204, + -0.020933610660114833, + -0.030144332544008355, + -0.04102981930173501, + -0.05358990551755159, + -0.06782475491944542, + -0.0837342055283144 + ], + "MP_DISPLACEMENT_Z": [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "MP_VELOCITY_X": [ + 0.12499944430682511, + 0.25000074725936705, + 0.3749988096051768, + 0.500001434265022, + 0.6249981000095031, + 0.7500022038029837, + 0.8749972937373691, + 1.0000029514088684, + 1.1249965707435357, + 1.250003700344459 + ], + "MP_VELOCITY_Y": [ + -0.03349554978223029, + -0.06698442268901356, + -0.10048536885410286, + -0.13396914381695835, + -0.16747539429351818, + -0.20095368516335962, + -0.2344655824251345, + -0.2679381328403975, + -0.30145557025381436, + -0.33492267999042896 + ], + "MP_VELOCITY_Z": [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ] + } +} \ No newline at end of file diff --git a/applications/MPMApplication/tests/test_MPMApplication.py b/applications/MPMApplication/tests/test_MPMApplication.py index 2aaba03d2a8a..2ca2bbe6d535 100644 --- a/applications/MPMApplication/tests/test_MPMApplication.py +++ b/applications/MPMApplication/tests/test_MPMApplication.py @@ -30,6 +30,7 @@ from mpm_test_factory import PenaltyImpositionBeamCantileverStaticHyperelasticSelfWeightLoad2DQuadTest as TPenaltyImpositionBeamCantileverStaticHyperelasticSelfWeightLoad2DQuadTest from mpm_test_factory import SlipBoundaryTest as TSlipBoundaryTest +from mpm_test_factory import PenaltyBasedSlipTest as TPenaltyBasedSlipTest from mpm_test_factory import FrictionConformingTest as TFrictionConformingTest @@ -108,6 +109,7 @@ def AssembleTestSuites(): # TODO: Look further into this test as they are still failing for AMatrix smallSuite.addTest(TSlipBoundaryTest('test_execution')) # FIXME: + smallSuite.addTest(TPenaltyBasedSlipTest('test_execution')) smallSuite.addTest(TFrictionConformingTest('test_execution')) From 389d154828783fb67cfb68c1f7ae13a093bb32da Mon Sep 17 00:00:00 2001 From: Suneth Warnakulasuriya <7856520+sunethwarna@users.noreply.github.com> Date: Sat, 10 Aug 2024 08:38:10 +0530 Subject: [PATCH 55/65] fix clear data for sub items --- .../python_scripts/utilities/buffered_dict.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/applications/OptimizationApplication/python_scripts/utilities/buffered_dict.py b/applications/OptimizationApplication/python_scripts/utilities/buffered_dict.py index 38d34d159fa8..2a6bd076b506 100644 --- a/applications/OptimizationApplication/python_scripts/utilities/buffered_dict.py +++ b/applications/OptimizationApplication/python_scripts/utilities/buffered_dict.py @@ -183,7 +183,7 @@ def SetValue(self, key: str, value: Any, step_index: int = 0, overwrite: bool = current_key = key[:pos] if not current_key in self.__sub_items.keys(): # no existing key found then create it. - self.__AddSubItem(current_key, BufferedDict(self.GetBufferSize())) + self.__AddSubItem(current_key, BufferedDict(self.GetBufferSize(), self.__clear_buffer_when_advancing)) self.__sub_items[current_key].SetValue(key[pos+1:], value, step_index, overwrite) From 64c9a04e882bca94098ecbf63257b616a7a36608 Mon Sep 17 00:00:00 2001 From: Suneth Warnakulasuriya <7856520+sunethwarna@users.noreply.github.com> Date: Sat, 10 Aug 2024 08:38:22 +0530 Subject: [PATCH 56/65] add a test --- .../tests/test_buffered_dict.py | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/applications/OptimizationApplication/tests/test_buffered_dict.py b/applications/OptimizationApplication/tests/test_buffered_dict.py index 03ce27f4890b..59ba65e8fbb7 100644 --- a/applications/OptimizationApplication/tests/test_buffered_dict.py +++ b/applications/OptimizationApplication/tests/test_buffered_dict.py @@ -177,6 +177,17 @@ def test_Buffers(self): self.assertEqual(buffered_data.GetValue("data/sub_1/sub_sub").GetBufferSize(), 4) self.assertEqual(buffered_data.GetValue("data/sub_2").GetBufferSize(), 5) + def test_Unbuffered(self): + unbuffered_data = BufferedDict(1, False) + unbuffered_data.SetValue("data/sub_1/sub_sub/value", 4.0) + unbuffered_data.SetValue("data/sub_2/value", 2.0) + + unbuffered_data.AdvanceStep() + unbuffered_data.AdvanceStep() + + self.assertEqual(unbuffered_data.GetValue("data/sub_1/sub_sub/value"), 4.0) + self.assertEqual(unbuffered_data.GetValue("data/sub_2/value"), 2.0) + def test_GetParent(self): buffered_data = BufferedDict(3) buffered_data.SetValue("data/sub_1/sub_sub", BufferedDict(4)) From e9fb9fe371c8731eed54a0b11a2fb40057a1057a Mon Sep 17 00:00:00 2001 From: matekelemen Date: Sat, 10 Aug 2024 06:54:48 +0200 Subject: [PATCH 57/65] link to cxx stdlib from homebrew --- scripts/mac_build | 42 +++++++++++++++++++++++++++--------------- 1 file changed, 27 insertions(+), 15 deletions(-) diff --git a/scripts/mac_build b/scripts/mac_build index fdfeac4e23f7..4c9655eb2763 100755 --- a/scripts/mac_build +++ b/scripts/mac_build @@ -80,7 +80,8 @@ build_dir="${source_dir}/build" # <== path to the build director install_dir="$(get_site_packages_dir)" # <== path to install kratos to clean=0 # <== clean the build and install directories, then exit app_names="" # <== list of app names to build -cmake_arguments=() # <== list of options to pass to CMake +cmake_arguments="" # <== semicolon-separated list of options to pass to CMake +cmake_cxx_flags="" # <== value to set for CMAKE_CXX_FLAGS # Function to append the list of built applications add_app() { @@ -137,7 +138,11 @@ while getopts ":h C b: i: t: j: a: o:" arg; do add_app "$OPTARG" ;; o) # Add CMake option - cmake_arguments=("${cmake_arguments[@]}" "$OPTARG") + if [[ "$OPTARG" == -DCMAKE_CXX_FLAGS* ]]; then + cmake_cxx_flags="${cmake_cxx_flags}${OPTARG#*-DCMAKE_CXX_FLAGS=} " + else + cmake_arguments="$cmake_arguments;$OPTARG" + fi ;; \?) # Unrecognized argumnet echo "Error: unrecognized argument: -$OPTARG" @@ -196,23 +201,33 @@ if ! command -v brew &> /dev/null; then exit 1 fi -check_homebrew_package() { - if ! brew list "$1" >/dev/null 2>&1; then - echo "Error: missing dependency: $1" - echo "Consider running 'brew install $1'" - exit 1 - fi +found_package="" +get_homebrew_package() { + found_package="" + package_versions="$(brew search --formula "/$1@[0-9]+/")" + for package_version in $(echo $package_versions | tr ' ' '\n' | sort -r | tr '\n' ' '); do + if brew list "$package_version" >/dev/null 2>&1; then + found_package="$package_version" + echo "using '$package_version' for dependency '$1'" + return 0 + fi + done + + echo "Error: no installed version of '$1' was found." + echo "Consider running 'brew install $1'." + exit 1 } # Check whether LLVM is installed, and populate related paths -check_homebrew_package llvm -toolchain_root="$(brew --prefix llvm)" +get_homebrew_package llvm +toolchain_root="$(brew --prefix $found_package)" toolchain_bin="${toolchain_root}/bin" toolchain_lib="${toolchain_root}/lib" toolchain_include="${toolchain_root}/include" +cmake_cxx_flags="-L${toolchain_lib}/c++ -L${toolchain_lib} -lunwind $cmake_cxx_flags" # Check other required homebrew dependencies -check_homebrew_package boost +get_homebrew_package boost check_recommended_homebrew_package() { if ! command -v "$1" >/dev/null 2>&1; then @@ -257,10 +272,7 @@ if ! cmake \ "-DCMAKE_BUILD_TYPE:STRING=${build_type}" \ "-DCMAKE_C_COMPILER:STRING=${toolchain_bin}/clang" \ "-DCMAKE_CXX_COMPILER:STRING=${toolchain_bin}/clang++" \ - "-DOPENMP_LIBRARIES:STRING=${toolchain_lib}" \ - "-DOPENMP_INCLUDES:STRING=${toolchain_include}" \ - "-DOPENMP_C:STRING=${toolchain_bin}/clang" \ - "-DOPENMP_CXX:STRING=${toolchain_bin}/clang++" \ + "-DCMAKE_CXX_FLAGS=${cmake_cxx_flags}" \ "-DCMAKE_COLOR_DIAGNOSTICS:BOOL=ON" \ "$ccache_flag" \ "-DUSE_MPI:BOOL=$mpi_flag" \ From 67ed335f9262071e483cc70b7576ea847e1d83f6 Mon Sep 17 00:00:00 2001 From: Suneth Warnakulasuriya <7856520+sunethwarna@users.noreply.github.com> Date: Thu, 15 Aug 2024 10:23:22 +0530 Subject: [PATCH 58/65] bug fix --- .../python_scripts/responses/damage_detection_response.py | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/applications/SystemIdentificationApplication/python_scripts/responses/damage_detection_response.py b/applications/SystemIdentificationApplication/python_scripts/responses/damage_detection_response.py index 2dd43d4c6360..e7f282ca5290 100644 --- a/applications/SystemIdentificationApplication/python_scripts/responses/damage_detection_response.py +++ b/applications/SystemIdentificationApplication/python_scripts/responses/damage_detection_response.py @@ -96,12 +96,7 @@ def Check(self) -> None: def Finalize(self) -> None: self.adjoint_analysis.Finalize() - def GetEvaluatedModelPart(self) -> Kratos.ModelPart: - if self.model_part is None: - raise RuntimeError("Please call DamageDetectionResponse::Initialize first.") - return self.model_part - - def GetAnalysisModelPart(self) -> Kratos.ModelPart: + def GetInfluencingModelPart(self) -> Kratos.ModelPart: if self.analysis_model_part is None: raise RuntimeError("Please call DamageDetectionResponse::Initialize first.") return self.analysis_model_part From 12643ed3c88b92031a28199721c2c24713930c1d Mon Sep 17 00:00:00 2001 From: IAntonau Date: Fri, 16 Aug 2024 11:59:40 +0200 Subject: [PATCH 59/65] [SiApp] p-norm damage resp (#12373) * save * adding p-norm to sensor sum * test case * revert files * apply changes suggested by Suneth * Update applications/SystemIdentificationApplication/custom_python/add_custom_sensors_to_python.cpp Co-authored-by: Suneth Warnakulasuriya * save * adding testing * reverting ref values --------- Co-authored-by: IAntonau Co-authored-by: Suneth Warnakulasuriya --- .../add_custom_sensors_to_python.cpp | 2 +- ...measurement_residual_response_function.cpp | 30 +++- .../measurement_residual_response_function.h | 4 +- .../controls/material_properties_control.py | 2 +- .../responses/damage_detection_response.py | 2 +- .../system_identification_static_analysis.py | 5 +- .../adjoint_material_parameters.json | 3 + .../adjoint_project_parameters.json | 77 ++++++++++ .../optimization_parameters.json | 133 ++++++++++++++++++ .../sensor_data.json | 109 ++++++++++++++ ...stem_identification_p_norm_summary_ref.csv | 20 +++ .../tests/test_system_identification.py | 19 +++ 12 files changed, 396 insertions(+), 10 deletions(-) create mode 100644 applications/SystemIdentificationApplication/tests/auxiliary_files/system_identification_p_norm/adjoint_material_parameters.json create mode 100644 applications/SystemIdentificationApplication/tests/auxiliary_files/system_identification_p_norm/adjoint_project_parameters.json create mode 100644 applications/SystemIdentificationApplication/tests/auxiliary_files/system_identification_p_norm/optimization_parameters.json create mode 100644 applications/SystemIdentificationApplication/tests/auxiliary_files/system_identification_p_norm/sensor_data.json create mode 100644 applications/SystemIdentificationApplication/tests/auxiliary_files/system_identification_p_norm_summary_ref.csv diff --git a/applications/SystemIdentificationApplication/custom_python/add_custom_sensors_to_python.cpp b/applications/SystemIdentificationApplication/custom_python/add_custom_sensors_to_python.cpp index 3c4ffa27b90f..866e9ad71103 100644 --- a/applications/SystemIdentificationApplication/custom_python/add_custom_sensors_to_python.cpp +++ b/applications/SystemIdentificationApplication/custom_python/add_custom_sensors_to_python.cpp @@ -99,7 +99,7 @@ void AddCustomSensorsToPython(pybind11::module& m) ; py::class_(sensor_module, "MeasurementResidualResponseFunction") - .def(py::init<>()) + .def(py::init(), py::arg("p_coefficient")) .def("AddSensor", &MeasurementResidualResponseFunction::AddSensor, py::arg("sensor")) .def("Clear", &MeasurementResidualResponseFunction::Clear) .def("GetSensorsList", &MeasurementResidualResponseFunction::GetSensorsList) diff --git a/applications/SystemIdentificationApplication/custom_sensors/measurement_residual_response_function.cpp b/applications/SystemIdentificationApplication/custom_sensors/measurement_residual_response_function.cpp index eec5fc2645c6..fbdac3f7ee24 100644 --- a/applications/SystemIdentificationApplication/custom_sensors/measurement_residual_response_function.cpp +++ b/applications/SystemIdentificationApplication/custom_sensors/measurement_residual_response_function.cpp @@ -6,7 +6,8 @@ // // License: SystemIdentificationApplication/license.txt // -// Main authors: Suneth Warnakulasuriya +// Main authors: Suneth Warnakulasuriya, +// Ihar Antonau // // System includes @@ -87,7 +88,8 @@ struct PartialSensitivity } // namespace MeasurementResidualResponseFunctionUtilities -MeasurementResidualResponseFunction::MeasurementResidualResponseFunction() +MeasurementResidualResponseFunction::MeasurementResidualResponseFunction(const double PCoefficient) + : mPCoefficient(PCoefficient) { mResponseGradientList.resize(ParallelUtilities::GetNumThreads()); } @@ -147,10 +149,13 @@ double MeasurementResidualResponseFunction::CalculateValue(ModelPart& rModelPart double value = 0.0; for (auto& p_sensor : mpSensorsList) { const double sensor_value = p_sensor->CalculateValue(rModelPart); - value += p_sensor->GetWeight() * std::pow(sensor_value - p_sensor->GetValue(SENSOR_MEASURED_VALUE), 2) * 0.5; p_sensor->SetSensorValue(sensor_value); + const double current_sensor_error_square = std::pow(sensor_value - p_sensor->GetValue(SENSOR_MEASURED_VALUE), 2) * 0.5; + p_sensor->SetValue(SENSOR_ERROR, current_sensor_error_square); + value += std::pow(p_sensor->GetWeight() * current_sensor_error_square, mPCoefficient); } - return value; + return std::pow(value, 1 / mPCoefficient); + KRATOS_CATCH(""); } @@ -170,11 +175,26 @@ void MeasurementResidualResponseFunction::CalculateDerivative( rResponseGradient.clear(); auto& local_sensor_response_gradient = mResponseGradientList[OpenMPUtils::ThisThread()]; + double temp = 0.0; + for (auto& p_sensor : mpSensorsList) { + temp += ( std::pow( p_sensor->GetValue(SENSOR_ERROR) * 0.5 * p_sensor->GetWeight(), mPCoefficient ) ); + } + const double c1 = 1 / mPCoefficient * std::pow( temp, 1/mPCoefficient - 1 ); + + temp = 0.0; + for (auto& p_sensor : mpSensorsList) { + temp += std::pow( p_sensor->GetWeight() * 0.5 * p_sensor->GetValue(SENSOR_ERROR), mPCoefficient - 1 ); + } + + const double c2 = mPCoefficient * temp; + for (auto& p_sensor : mpSensorsList) { TCalculationType::Calculate(*p_sensor, local_sensor_response_gradient, rResidualGradient, rArgs...); - noalias(rResponseGradient) += local_sensor_response_gradient * (p_sensor->GetWeight() * (p_sensor->GetSensorValue() - p_sensor->GetValue(SENSOR_MEASURED_VALUE))); + const double error = std::sqrt( p_sensor->GetValue(SENSOR_ERROR) ); + noalias(rResponseGradient) += c1 * c2 * error * local_sensor_response_gradient; } + KRATOS_CATCH(""); } diff --git a/applications/SystemIdentificationApplication/custom_sensors/measurement_residual_response_function.h b/applications/SystemIdentificationApplication/custom_sensors/measurement_residual_response_function.h index 2569bff1189a..980964199c7d 100644 --- a/applications/SystemIdentificationApplication/custom_sensors/measurement_residual_response_function.h +++ b/applications/SystemIdentificationApplication/custom_sensors/measurement_residual_response_function.h @@ -50,7 +50,7 @@ class KRATOS_API(DIGITAL_TWIN_APPLICATION) MeasurementResidualResponseFunction : ///@{ /// Constructor. - MeasurementResidualResponseFunction(); + MeasurementResidualResponseFunction(const double PCoeficient); /// Destructor. ~MeasurementResidualResponseFunction() override = default; @@ -155,6 +155,8 @@ class KRATOS_API(DIGITAL_TWIN_APPLICATION) MeasurementResidualResponseFunction : ///@name Member Variables ///@{ + double mPCoefficient; + std::vector mpSensorsList; std::vector mResponseGradientList; diff --git a/applications/SystemIdentificationApplication/python_scripts/controls/material_properties_control.py b/applications/SystemIdentificationApplication/python_scripts/controls/material_properties_control.py index f521c8e95c2b..52163cc2da60 100644 --- a/applications/SystemIdentificationApplication/python_scripts/controls/material_properties_control.py +++ b/applications/SystemIdentificationApplication/python_scripts/controls/material_properties_control.py @@ -199,4 +199,4 @@ def _UpdateAndOutputFields(self, update: ContainerExpressionTypes) -> None: un_buffered_data.SetValue(f"{self.controlled_physical_variable.Name()}_physical_phi_derivative", self.physical_phi_derivative_field.Clone(), overwrite=True) def __str__(self) -> str: - return f"Control [type = {self.__class__.__name__}, name = {self.GetName()}, model part name = {self.adjoint_model_part_operation.GetModelPartFullName()}, control variable = {self.controlled_physical_variable.Name()}" + return f"Control [type = {self.__class__.__name__}, name = {self.GetName()}, model part name = {self.adjoint_model_part_operation.GetModelPartFullName()}, control variable = {self.controlled_physical_variable.Name()}" \ No newline at end of file diff --git a/applications/SystemIdentificationApplication/python_scripts/responses/damage_detection_response.py b/applications/SystemIdentificationApplication/python_scripts/responses/damage_detection_response.py index e7f282ca5290..f88de059aa8d 100644 --- a/applications/SystemIdentificationApplication/python_scripts/responses/damage_detection_response.py +++ b/applications/SystemIdentificationApplication/python_scripts/responses/damage_detection_response.py @@ -92,7 +92,7 @@ def Initialize(self) -> None: def Check(self) -> None: pass - + def Finalize(self) -> None: self.adjoint_analysis.Finalize() diff --git a/applications/SystemIdentificationApplication/python_scripts/sensor_sensitivity_solvers/system_identification_static_analysis.py b/applications/SystemIdentificationApplication/python_scripts/sensor_sensitivity_solvers/system_identification_static_analysis.py index c8911ae3a14c..1fccbfd03e27 100644 --- a/applications/SystemIdentificationApplication/python_scripts/sensor_sensitivity_solvers/system_identification_static_analysis.py +++ b/applications/SystemIdentificationApplication/python_scripts/sensor_sensitivity_solvers/system_identification_static_analysis.py @@ -22,6 +22,7 @@ def Initialize(self): "perturbation_size" : 1e-8, "adapt_perturbation_size" : true, "list_of_sensors" : [], + "p_coefficient" : 1, "output_settings" : { "output_sensor_sensitivity_fields": false, "output_folder" : "Optimization_Results/sensor_sensitivity_fields" @@ -36,7 +37,9 @@ def Initialize(self): model_part.ProcessInfo[KratosSI.ADAPT_PERTURBATION_SIZE] = sensor_settings["adapt_perturbation_size"].GetBool() self.listof_sensors = GetSensors(model_part, sensor_settings["list_of_sensors"].values()) - self.measurement_residual_response_function = KratosSI.Sensors.MeasurementResidualResponseFunction() + p_coefficient = sensor_settings["p_coefficient"].GetDouble() + self.measurement_residual_response_function = KratosSI.Sensors.MeasurementResidualResponseFunction(p_coefficient) + for sensor in self.listof_sensors: sensor.SetValue(KratosSI.SENSOR_MEASURED_VALUE, 0.0) self.measurement_residual_response_function.AddSensor(sensor) diff --git a/applications/SystemIdentificationApplication/tests/auxiliary_files/system_identification_p_norm/adjoint_material_parameters.json b/applications/SystemIdentificationApplication/tests/auxiliary_files/system_identification_p_norm/adjoint_material_parameters.json new file mode 100644 index 000000000000..85b9c6d34737 --- /dev/null +++ b/applications/SystemIdentificationApplication/tests/auxiliary_files/system_identification_p_norm/adjoint_material_parameters.json @@ -0,0 +1,3 @@ +{ + "properties": [] +} \ No newline at end of file diff --git a/applications/SystemIdentificationApplication/tests/auxiliary_files/system_identification_p_norm/adjoint_project_parameters.json b/applications/SystemIdentificationApplication/tests/auxiliary_files/system_identification_p_norm/adjoint_project_parameters.json new file mode 100644 index 000000000000..ac2fd0dd7560 --- /dev/null +++ b/applications/SystemIdentificationApplication/tests/auxiliary_files/system_identification_p_norm/adjoint_project_parameters.json @@ -0,0 +1,77 @@ +{ + "problem_data": { + "problem_name": "benchmark_2", + "parallel_type": "OpenMP", + "start_time": 0, + "end_time": 1, + "echo_level": 0 + }, + "sensor_settings": { + "perturbation_size": 1e-8, + "adapt_perturbation_size": true, + "p_coefficient": 4, + "@include_json": "auxiliary_files/system_identification/sensor_data.json" + }, + "solver_settings": { + "solver_type": "adjoint_static", + "analysis_type": "linear", + "model_part_name": "AdjointStructure", + "domain_size": 3, + "time_stepping": { + "time_step": 1.0 + }, + "compute_reactions": false, + "move_mesh_flag": false, + "sensitivity_settings": { + "sensitivity_model_part_name": "all_nodes_elements_model_part", + "element_data_value_sensitivity_variables": [ + "YOUNG_MODULUS" + ], + "build_mode": "static" + }, + "echo_level": 0, + "rotation_dofs": true, + "model_import_settings": { + "input_type": "use_input_model_part" + }, + "material_import_settings": { + "materials_filename": "auxiliary_files/system_identification/adjoint_material_parameters.json" + }, + "linear_solver_settings": { + "solver_type": "amgcl" + } + }, + "processes": { + "constraints_process_list": [ + { + "python_module": "assign_vector_variable_process", + "kratos_module": "KratosMultiphysics", + "help": "This process fixes the selected components of a given vector variable", + "process_name": "AssignVectorVariableProcess", + "Parameters": { + "mesh_id": 0, + "model_part_name": "AdjointStructure.BoundPtsType7", + "variable_name": "ADJOINT_DISPLACEMENT", + "value": [ + 0.0, + 0.0, + 0.0 + ], + "constrained": [ + true, + true, + true + ], + "interval": [ + 0.0, + "End" + ] + } + } + ], + "loads_process_list": [], + "list_other_processes": [] + }, + "output_processes": {}, + "analysis_stage": "KratosMultiphysics.SystemIdentificationApplication.sensor_sensitivity_solvers.sensor_sensitivity_static_analysis" +} \ No newline at end of file diff --git a/applications/SystemIdentificationApplication/tests/auxiliary_files/system_identification_p_norm/optimization_parameters.json b/applications/SystemIdentificationApplication/tests/auxiliary_files/system_identification_p_norm/optimization_parameters.json new file mode 100644 index 000000000000..b2903ff8c6a0 --- /dev/null +++ b/applications/SystemIdentificationApplication/tests/auxiliary_files/system_identification_p_norm/optimization_parameters.json @@ -0,0 +1,133 @@ +{ + "problem_data": { + "parallel_type": "OpenMP", + "echo_level": 0 + }, + "model_parts": [ + { + "type": "mdpa_model_part_controller", + "settings": { + "model_part_name": "AdjointStructure", + "domain_size": 3, + "input_filename": "auxiliary_files/structure" + } + }, + { + "type": "connectivity_preserving_model_part_controller", + "settings": { + "transformation_settings": [ + { + "source_model_part_name": "AdjointStructure", + "destination_model_part_name": "Structure", + "destination_element_name": "ShellThinElement3D3N", + "destination_condition_name": "LineLoadCondition3D2N" + } + ] + } + } + ], + "analyses": [ + { + "name": "Structure_static", + "type": "kratos_analysis_execution_policy", + "settings": { + "model_part_names": [ + "Structure" + ], + "analysis_module": "KratosMultiphysics.StructuralMechanicsApplication", + "analysis_type": "StructuralMechanicsAnalysis", + "analysis_settings": { + "@include_json": "auxiliary_files/system_identification/primal_project_parameters.json" + } + } + } + ], + "responses": [ + { + "name": "damage_response", + "type": "damage_detection_response", + "module": "KratosMultiphysics.SystemIdentificationApplication.responses", + "settings": { + "evaluated_model_part_names": [ + "AdjointStructure" + ], + "adjoint_parameters": { + "@include_json": "auxiliary_files/system_identification_p_norm/adjoint_project_parameters.json" + }, + "test_analysis_list": [ + { + "primal_analysis_name": "Structure_static", + "sensor_measurement_csv_file": "auxiliary_files/damaged_problem/measured_data_ref.csv", + "weight": 1.0 + } + ] + } + } + ], + "controls": [ + { + "name": "material_control", + "type": "material_properties_control", + "module": "KratosMultiphysics.SystemIdentificationApplication.controls", + "settings": { + "model_part_names": [ + { + "primal_model_part_name": "Structure", + "adjoint_model_part_name": "AdjointStructure" + } + ], + "control_variable_name": "YOUNG_MODULUS", + "control_variable_bounds": [ + 0.0, + 30000000000.0 + ], + "filter_settings": { + "filter_type": "explicit_filter", + "filter_radius_settings": { + "filter_radius": 5.0, + "filter_radius_type": "constant" + } + } + } + } + ], + "algorithm_settings": { + "type": "algorithm_steepest_descent", + "settings": { + "echo_level": 0, + "line_search": { + "type": "const_step", + "init_step": 0.01, + "gradient_scaling": "inf_norm" + }, + "conv_settings": { + "type": "max_iter", + "max_iter": 5 + } + }, + "controls": [ + "material_control" + ], + "objective": { + "response_name": "damage_response", + "type": "minimization", + "scaling": 1.0 + } + }, + "processes": { + "kratos_processes": {}, + "optimization_data_processes": { + "output_processes": [ + { + "type": "optimization_problem_ascii_output_process", + "module": "KratosMultiphysics.OptimizationApplication.processes", + "settings": { + "output_file_name": "auxiliary_files/summary_p_norm.csv", + "write_kratos_version": false, + "write_time_stamp": false + } + } + ] + } + } +} \ No newline at end of file diff --git a/applications/SystemIdentificationApplication/tests/auxiliary_files/system_identification_p_norm/sensor_data.json b/applications/SystemIdentificationApplication/tests/auxiliary_files/system_identification_p_norm/sensor_data.json new file mode 100644 index 000000000000..3cf0a099f65c --- /dev/null +++ b/applications/SystemIdentificationApplication/tests/auxiliary_files/system_identification_p_norm/sensor_data.json @@ -0,0 +1,109 @@ +{ + "list_of_sensors": [ + { + "type": "displacement_sensor", + "name": "disp_x_99", + "location": [ + 58.54103333333333, + 15.060899999999998, + 0.0 + ], + "direction": [ + 1.0, + 0.0, + 0.0 + ], + "weight": 1.0 + }, + { + "type": "displacement_sensor", + "name": "disp_x_108", + "location": [ + 59.34613333333333, + 26.242666666666665, + 0.0 + ], + "direction": [ + 1.0, + 0.0, + 0.0 + ], + "weight": 1.0 + }, + { + "type": "displacement_sensor", + "name": "disp_x_89", + "location": [ + 59.49563333333333, + 3.304283333333333, + 0.0 + ], + "direction": [ + 1.0, + 0.0, + 0.0 + ], + "weight": 1.0 + }, + { + "type": "displacement_sensor", + "name": "disp_x_422", + "location": [ + 10.403176666666667, + 15.740466666666666, + 0.0 + ], + "direction": [ + 1.0, + 0.0, + 0.0 + ], + "weight": 1.0 + }, + { + "type": "displacement_sensor", + "name": "disp_x_142", + "location": [ + 34.94099999999999, + 12.744933333333332, + 0.0 + ], + "direction": [ + 1.0, + 0.0, + 0.0 + ], + "weight": 1.0 + }, + { + "type": "displacement_sensor", + "name": "disp_x_486", + "location": [ + 57.3192, + 20.114866666666664, + 0.0 + ], + "direction": [ + 1.0, + 0.0, + 0.0 + ], + "weight": 1.0 + }, + { + "type": "displacement_sensor", + "name": "disp_x_94", + "location": [ + 59.23526666666667, + 8.81829, + 0.0 + ], + "direction": [ + 1.0, + 0.0, + 0.0 + ], + "weight": 1.0 + } + ] +} \ No newline at end of file diff --git a/applications/SystemIdentificationApplication/tests/auxiliary_files/system_identification_p_norm_summary_ref.csv b/applications/SystemIdentificationApplication/tests/auxiliary_files/system_identification_p_norm_summary_ref.csv new file mode 100644 index 000000000000..971304c126c6 --- /dev/null +++ b/applications/SystemIdentificationApplication/tests/auxiliary_files/system_identification_p_norm_summary_ref.csv @@ -0,0 +1,20 @@ +# Optimization problem ascii output +# Kratos version: not_given +# Timestamp : not_specified +# ----------------------------------------------- +# --------------- Initial values ---------------- +# algorithm: +# damage_response: +# initial_value: 2.148297976e-04 +# ------------ End of initial values ------------ +# ----------------------------------------------- +# ------------ Start of step values ------------- +# Headers: +# STEP, algorithm:std_obj_value, algorithm:rel_obj[%], algorithm:abs_obj[%], damage_response:value + 0, 2.148297976e-04, 0.000000000e+00, 0.000000000e+00, 2.148297976e-04 + 1, 2.055824507e-04, -4.304499192e+00, -4.304499192e+00, 2.055824507e-04 + 2, 1.966577468e-04, -4.341179814e+00, -8.458812956e+00, 1.966577468e-04 + 3, 1.880459899e-04, -4.379058066e+00, -1.246745469e+01, 1.880459899e-04 + 4, 1.797379508e-04, -4.418088938e+00, -1.633472039e+01, 1.797379508e-04 + 5, 1.717248431e-04, -4.458216926e+00, -2.006470005e+01, 1.717248431e-04 +# End of file \ No newline at end of file diff --git a/applications/SystemIdentificationApplication/tests/test_system_identification.py b/applications/SystemIdentificationApplication/tests/test_system_identification.py index 5e33fc473660..a8a16e956794 100644 --- a/applications/SystemIdentificationApplication/tests/test_system_identification.py +++ b/applications/SystemIdentificationApplication/tests/test_system_identification.py @@ -39,6 +39,25 @@ def test_SystemIdentification(self): }""") CompareTwoFilesCheckProcess(params).Execute() + def test_SystemIdentificationPNorm(self): + model = Kratos.Model() + with open("auxiliary_files/system_identification_p_norm/optimization_parameters.json", "r") as file_input: + params = Kratos.Parameters(file_input.read()) + + analysis = OptimizationAnalysis(model, params) + analysis.Run() + + params = Kratos.Parameters("""{ + "reference_file_name" : "auxiliary_files/system_identification_p_norm_summary_ref.csv", + "output_file_name" : "auxiliary_files/summary_p_norm.csv", + "remove_output_file" : true, + "comparison_type" : "csv_file", + "tolerance" : 1e-5, + "relative_tolerance" : 1e-6, + "dimension" : 3 + }""") + CompareTwoFilesCheckProcess(params).Execute() + if __name__ == '__main__': UnitTest.main() From dd799665986b2cd03b19cc6a00a0ac2e1a5d66bd Mon Sep 17 00:00:00 2001 From: Anne van de Graaf Date: Mon, 19 Aug 2024 16:16:09 +0200 Subject: [PATCH 60/65] Added `override`s for member function `Info` (#12629) The aim of this commit is to make debugging easier by providing class-specific information. --- .../custom_conditions/Pw_condition.cpp | 6 ++++++ .../custom_conditions/Pw_condition.hpp | 2 ++ .../custom_conditions/Pw_normal_flux_condition.cpp | 6 ++++++ .../custom_conditions/Pw_normal_flux_condition.hpp | 3 ++- .../custom_conditions/Pw_point_flux_condition.cpp | 6 ++++++ .../custom_conditions/Pw_point_flux_condition.hpp | 2 ++ .../custom_conditions/T_condition.cpp | 6 ++++++ .../custom_conditions/T_condition.h | 2 ++ .../custom_conditions/T_microclimate_flux_condition.cpp | 6 ++++++ .../custom_conditions/T_microclimate_flux_condition.h | 2 ++ .../custom_conditions/T_normal_flux_condition.cpp | 6 ++++++ .../custom_conditions/T_normal_flux_condition.h | 2 ++ .../custom_conditions/U_Pw_condition.cpp | 6 ++++++ .../custom_conditions/U_Pw_condition.hpp | 3 ++- .../custom_conditions/U_Pw_face_load_condition.cpp | 6 ++++++ .../custom_conditions/U_Pw_face_load_condition.hpp | 3 ++- .../U_Pw_face_load_interface_condition.cpp | 6 ++++++ .../U_Pw_face_load_interface_condition.hpp | 3 ++- .../custom_conditions/U_Pw_force_condition.cpp | 6 ++++++ .../custom_conditions/U_Pw_force_condition.hpp | 3 ++- .../custom_conditions/U_Pw_normal_face_load_condition.cpp | 6 ++++++ .../custom_conditions/U_Pw_normal_face_load_condition.hpp | 3 ++- .../custom_conditions/U_Pw_normal_flux_FIC_condition.cpp | 6 ++++++ .../custom_conditions/U_Pw_normal_flux_FIC_condition.hpp | 3 ++- .../custom_conditions/U_Pw_normal_flux_condition.cpp | 6 ++++++ .../custom_conditions/U_Pw_normal_flux_condition.hpp | 3 ++- .../U_Pw_normal_flux_interface_condition.cpp | 6 ++++++ .../U_Pw_normal_flux_interface_condition.hpp | 3 ++- .../U_Pw_normal_lysmer_absorbing_condition.cpp | 7 ++++++- .../U_Pw_normal_lysmer_absorbing_condition.hpp | 3 ++- .../axisymmetric_U_Pw_normal_face_load_condition.cpp | 6 ++++++ .../axisymmetric_U_Pw_normal_face_load_condition.hpp | 2 ++ ...tric_line_normal_fluid_flux_2D_diff_order_condition.cpp | 5 +++++ ...tric_line_normal_fluid_flux_2D_diff_order_condition.hpp | 2 ++ ...isymmetric_line_normal_load_2D_diff_order_condition.cpp | 5 +++++ ...isymmetric_line_normal_load_2D_diff_order_condition.hpp | 2 ++ .../general_U_Pw_diff_order_condition.cpp | 2 ++ .../general_U_Pw_diff_order_condition.hpp | 2 ++ .../line_load_2D_diff_order_condition.cpp | 2 ++ .../line_load_2D_diff_order_condition.hpp | 2 ++ .../line_normal_fluid_flux_2D_diff_order_condition.cpp | 5 +++++ .../line_normal_fluid_flux_2D_diff_order_condition.hpp | 2 ++ .../line_normal_load_2D_diff_order_condition.cpp | 5 +++++ .../line_normal_load_2D_diff_order_condition.hpp | 2 ++ .../surface_load_3D_diff_order_condition.cpp | 5 +++++ .../surface_load_3D_diff_order_condition.hpp | 2 ++ .../surface_normal_fluid_flux_3D_diff_order_condition.cpp | 5 +++++ .../surface_normal_fluid_flux_3D_diff_order_condition.hpp | 2 ++ .../surface_normal_load_3D_diff_order_condition.cpp | 5 +++++ .../surface_normal_load_3D_diff_order_condition.hpp | 2 ++ .../custom_conditions/thermal_point_flux_condition.cpp | 6 ++++++ .../custom_conditions/thermal_point_flux_condition.h | 2 ++ 52 files changed, 193 insertions(+), 11 deletions(-) diff --git a/applications/GeoMechanicsApplication/custom_conditions/Pw_condition.cpp b/applications/GeoMechanicsApplication/custom_conditions/Pw_condition.cpp index 807aa5afd7da..e72f0d514cb0 100644 --- a/applications/GeoMechanicsApplication/custom_conditions/Pw_condition.cpp +++ b/applications/GeoMechanicsApplication/custom_conditions/Pw_condition.cpp @@ -133,6 +133,12 @@ Condition::DofsVectorType PwCondition::GetDofs() const return Geo::DofUtilities::ExtractDofsFromNodes(GetGeometry(), WATER_PRESSURE); } +template +std::string PwCondition::Info() const +{ + return "PwCondition"; +} + //---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- template class PwCondition<2, 1>; template class PwCondition<2, 2>; diff --git a/applications/GeoMechanicsApplication/custom_conditions/Pw_condition.hpp b/applications/GeoMechanicsApplication/custom_conditions/Pw_condition.hpp index bfdec97b0ea8..492732388255 100644 --- a/applications/GeoMechanicsApplication/custom_conditions/Pw_condition.hpp +++ b/applications/GeoMechanicsApplication/custom_conditions/Pw_condition.hpp @@ -75,6 +75,8 @@ class KRATOS_API(GEO_MECHANICS_APPLICATION) PwCondition : public Condition void EquationIdVector(EquationIdVectorType& rResult, const ProcessInfo&) const override; + std::string Info() const override; + //---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- protected: diff --git a/applications/GeoMechanicsApplication/custom_conditions/Pw_normal_flux_condition.cpp b/applications/GeoMechanicsApplication/custom_conditions/Pw_normal_flux_condition.cpp index b8318c090acd..6810bdf8d742 100644 --- a/applications/GeoMechanicsApplication/custom_conditions/Pw_normal_flux_condition.cpp +++ b/applications/GeoMechanicsApplication/custom_conditions/Pw_normal_flux_condition.cpp @@ -87,6 +87,12 @@ void PwNormalFluxCondition::CalculateAndAddRHS(VectorType& rRig rRightHandSideVector += rVariables.PVector; } +template +std::string PwNormalFluxCondition::Info() const +{ + return "PwNormalFluxCondition"; +} + template class PwNormalFluxCondition<2, 2>; template class PwNormalFluxCondition<2, 3>; template class PwNormalFluxCondition<2, 4>; diff --git a/applications/GeoMechanicsApplication/custom_conditions/Pw_normal_flux_condition.hpp b/applications/GeoMechanicsApplication/custom_conditions/Pw_normal_flux_condition.hpp index d4b2f54de377..93d2db1ce7e6 100644 --- a/applications/GeoMechanicsApplication/custom_conditions/Pw_normal_flux_condition.hpp +++ b/applications/GeoMechanicsApplication/custom_conditions/Pw_normal_flux_condition.hpp @@ -64,6 +64,8 @@ class KRATOS_API(GEO_MECHANICS_APPLICATION) PwNormalFluxCondition : public PwCon NodesArrayType const& ThisNodes, PropertiesType::Pointer pProperties) const override; + std::string Info() const override; + //---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- protected: @@ -102,7 +104,6 @@ class KRATOS_API(GEO_MECHANICS_APPLICATION) PwNormalFluxCondition : public PwCon { KRATOS_SERIALIZE_LOAD_BASE_CLASS(rSerializer, Condition) } - }; // class PwNormalFluxCondition. } // namespace Kratos. \ No newline at end of file diff --git a/applications/GeoMechanicsApplication/custom_conditions/Pw_point_flux_condition.cpp b/applications/GeoMechanicsApplication/custom_conditions/Pw_point_flux_condition.cpp index c0aac4633104..fa5b8cb16172 100644 --- a/applications/GeoMechanicsApplication/custom_conditions/Pw_point_flux_condition.cpp +++ b/applications/GeoMechanicsApplication/custom_conditions/Pw_point_flux_condition.cpp @@ -50,6 +50,12 @@ void PwPointFluxCondition::CalculateRHS(Vector& rRightHandSideV rRightHandSideVector[0] = this->GetGeometry()[0].FastGetSolutionStepValue(NORMAL_FLUID_FLUX); } +template +std::string PwPointFluxCondition::Info() const +{ + return "PwPointFluxCondition"; +} + template class PwPointFluxCondition<2, 1>; template class PwPointFluxCondition<3, 1>; diff --git a/applications/GeoMechanicsApplication/custom_conditions/Pw_point_flux_condition.hpp b/applications/GeoMechanicsApplication/custom_conditions/Pw_point_flux_condition.hpp index 3bb5772425ae..73d7ecabcd5b 100644 --- a/applications/GeoMechanicsApplication/custom_conditions/Pw_point_flux_condition.hpp +++ b/applications/GeoMechanicsApplication/custom_conditions/Pw_point_flux_condition.hpp @@ -43,6 +43,8 @@ class KRATOS_API(GEO_MECHANICS_APPLICATION) PwPointFluxCondition : public PwCond NodesArrayType const& rThisNodes, PropertiesType::Pointer pProperties) const override; + std::string Info() const override; + protected: void CalculateRHS(Vector& rRightHandSideVector, const ProcessInfo&) override; diff --git a/applications/GeoMechanicsApplication/custom_conditions/T_condition.cpp b/applications/GeoMechanicsApplication/custom_conditions/T_condition.cpp index 1565134b4e33..4aa464fc369a 100644 --- a/applications/GeoMechanicsApplication/custom_conditions/T_condition.cpp +++ b/applications/GeoMechanicsApplication/custom_conditions/T_condition.cpp @@ -90,6 +90,12 @@ Condition::DofsVectorType GeoTCondition::GetDofs() const return Geo::DofUtilities::ExtractDofsFromNodes(this->GetGeometry(), TEMPERATURE); } +template +std::string GeoTCondition::Info() const +{ + return "GeoTCondition"; +} + template class GeoTCondition<2, 1>; template class GeoTCondition<2, 2>; template class GeoTCondition<2, 3>; diff --git a/applications/GeoMechanicsApplication/custom_conditions/T_condition.h b/applications/GeoMechanicsApplication/custom_conditions/T_condition.h index 7d11a5aa18af..4b9d9d639063 100644 --- a/applications/GeoMechanicsApplication/custom_conditions/T_condition.h +++ b/applications/GeoMechanicsApplication/custom_conditions/T_condition.h @@ -51,6 +51,8 @@ class KRATOS_API(GEO_MECHANICS_APPLICATION) GeoTCondition : public Condition void EquationIdVector(EquationIdVectorType& rResult, const ProcessInfo&) const override; + std::string Info() const override; + protected: virtual void CalculateAll(MatrixType& rLeftHandSideMatrix, VectorType& rRightHandSideVector, diff --git a/applications/GeoMechanicsApplication/custom_conditions/T_microclimate_flux_condition.cpp b/applications/GeoMechanicsApplication/custom_conditions/T_microclimate_flux_condition.cpp index 9d358d2e8633..639edc7f37e7 100644 --- a/applications/GeoMechanicsApplication/custom_conditions/T_microclimate_flux_condition.cpp +++ b/applications/GeoMechanicsApplication/custom_conditions/T_microclimate_flux_condition.cpp @@ -400,6 +400,12 @@ double GeoTMicroClimateFluxCondition::CalculateSurfaceRoughness return 1.0 / (1.0 + 15.0 * RichardsonBulkModulus * coefficient); } +template +std::string GeoTMicroClimateFluxCondition::Info() const +{ + return "GeoTMicroClimateFluxCondition"; +} + template class GeoTMicroClimateFluxCondition<2, 2>; template class GeoTMicroClimateFluxCondition<2, 3>; template class GeoTMicroClimateFluxCondition<2, 4>; diff --git a/applications/GeoMechanicsApplication/custom_conditions/T_microclimate_flux_condition.h b/applications/GeoMechanicsApplication/custom_conditions/T_microclimate_flux_condition.h index 06d249e7a55c..e9faef1df9fe 100644 --- a/applications/GeoMechanicsApplication/custom_conditions/T_microclimate_flux_condition.h +++ b/applications/GeoMechanicsApplication/custom_conditions/T_microclimate_flux_condition.h @@ -63,6 +63,8 @@ class KRATOS_API(GEO_MECHANICS_APPLICATION) GeoTMicroClimateFluxCondition Vector& rRightHandSideVector, const ProcessInfo& rCurrentProcessInfo) override; + std::string Info() const override; + private: void InitializeProperties(); diff --git a/applications/GeoMechanicsApplication/custom_conditions/T_normal_flux_condition.cpp b/applications/GeoMechanicsApplication/custom_conditions/T_normal_flux_condition.cpp index 288619cb9688..20f7912cea30 100644 --- a/applications/GeoMechanicsApplication/custom_conditions/T_normal_flux_condition.cpp +++ b/applications/GeoMechanicsApplication/custom_conditions/T_normal_flux_condition.cpp @@ -80,6 +80,12 @@ void GeoTNormalFluxCondition::CalculateRHS(Vector& r } } +template +std::string GeoTNormalFluxCondition::Info() const +{ + return "GeoTNormalFluxCondition"; +} + template class GeoTNormalFluxCondition<2, 2>; template class GeoTNormalFluxCondition<2, 3>; template class GeoTNormalFluxCondition<2, 4>; diff --git a/applications/GeoMechanicsApplication/custom_conditions/T_normal_flux_condition.h b/applications/GeoMechanicsApplication/custom_conditions/T_normal_flux_condition.h index 90df7be0993e..15e208392f85 100644 --- a/applications/GeoMechanicsApplication/custom_conditions/T_normal_flux_condition.h +++ b/applications/GeoMechanicsApplication/custom_conditions/T_normal_flux_condition.h @@ -44,6 +44,8 @@ class KRATOS_API(GEO_MECHANICS_APPLICATION) GeoTNormalFluxCondition : public Geo NewId, this->GetGeometry().Create(rThisNodes), pProperties); } + std::string Info() const override; + protected: void CalculateRHS(Vector& rRightHandSideVector, const ProcessInfo& CurrentProcessInfo) override; diff --git a/applications/GeoMechanicsApplication/custom_conditions/U_Pw_condition.cpp b/applications/GeoMechanicsApplication/custom_conditions/U_Pw_condition.cpp index 96e9d5f1c762..525f41efad69 100644 --- a/applications/GeoMechanicsApplication/custom_conditions/U_Pw_condition.cpp +++ b/applications/GeoMechanicsApplication/custom_conditions/U_Pw_condition.cpp @@ -126,6 +126,12 @@ Condition::DofsVectorType UPwCondition::GetDofs() const return Geo::DofUtilities::ExtractUPwDofsFromNodes(GetGeometry(), TDim); } +template +std::string UPwCondition::Info() const +{ + return "UPwCondition"; +} + //---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- template class UPwCondition<2, 1>; template class UPwCondition<2, 2>; diff --git a/applications/GeoMechanicsApplication/custom_conditions/U_Pw_condition.hpp b/applications/GeoMechanicsApplication/custom_conditions/U_Pw_condition.hpp index ef45f54ce5f5..42db499845e7 100644 --- a/applications/GeoMechanicsApplication/custom_conditions/U_Pw_condition.hpp +++ b/applications/GeoMechanicsApplication/custom_conditions/U_Pw_condition.hpp @@ -77,6 +77,8 @@ class KRATOS_API(GEO_MECHANICS_APPLICATION) UPwCondition : public Condition void EquationIdVector(EquationIdVectorType& rResult, const ProcessInfo&) const override; + std::string Info() const override; + //---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- protected: @@ -106,7 +108,6 @@ class KRATOS_API(GEO_MECHANICS_APPLICATION) UPwCondition : public Condition { KRATOS_SERIALIZE_LOAD_BASE_CLASS(rSerializer, Condition) } - }; // class UPwCondition. } // namespace Kratos. diff --git a/applications/GeoMechanicsApplication/custom_conditions/U_Pw_face_load_condition.cpp b/applications/GeoMechanicsApplication/custom_conditions/U_Pw_face_load_condition.cpp index 67777996d1aa..b42d64f33bab 100644 --- a/applications/GeoMechanicsApplication/custom_conditions/U_Pw_face_load_condition.cpp +++ b/applications/GeoMechanicsApplication/custom_conditions/U_Pw_face_load_condition.cpp @@ -73,6 +73,12 @@ void UPwFaceLoadCondition::CalculateRHS(VectorType& rRig } } +template +std::string UPwFaceLoadCondition::Info() const +{ + return "UPwFaceLoadCondition"; +} + template class UPwFaceLoadCondition<2, 2>; template class UPwFaceLoadCondition<2, 3>; template class UPwFaceLoadCondition<2, 4>; diff --git a/applications/GeoMechanicsApplication/custom_conditions/U_Pw_face_load_condition.hpp b/applications/GeoMechanicsApplication/custom_conditions/U_Pw_face_load_condition.hpp index 0b08f79880ed..fad86a8edb9e 100644 --- a/applications/GeoMechanicsApplication/custom_conditions/U_Pw_face_load_condition.hpp +++ b/applications/GeoMechanicsApplication/custom_conditions/U_Pw_face_load_condition.hpp @@ -62,6 +62,8 @@ class KRATOS_API(GEO_MECHANICS_APPLICATION) UPwFaceLoadCondition : public UPwCon NodesArrayType const& ThisNodes, PropertiesType::Pointer pProperties) const override; + std::string Info() const override; + //---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- protected: @@ -91,7 +93,6 @@ class KRATOS_API(GEO_MECHANICS_APPLICATION) UPwFaceLoadCondition : public UPwCon { KRATOS_SERIALIZE_LOAD_BASE_CLASS(rSerializer, Condition) } - }; // class UPwFaceLoadCondition. } // namespace Kratos. \ No newline at end of file diff --git a/applications/GeoMechanicsApplication/custom_conditions/U_Pw_face_load_interface_condition.cpp b/applications/GeoMechanicsApplication/custom_conditions/U_Pw_face_load_interface_condition.cpp index fd2f437686b3..181ef4e27302 100644 --- a/applications/GeoMechanicsApplication/custom_conditions/U_Pw_face_load_interface_condition.cpp +++ b/applications/GeoMechanicsApplication/custom_conditions/U_Pw_face_load_interface_condition.cpp @@ -318,6 +318,12 @@ double UPwFaceLoadInterfaceCondition<3, 4>::CalculateIntegrationCoefficient(cons KRATOS_CATCH("") } +template +std::string UPwFaceLoadInterfaceCondition::Info() const +{ + return "UPwFaceLoadInterfaceCondition"; +} + //---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- template class UPwFaceLoadInterfaceCondition<2, 2>; diff --git a/applications/GeoMechanicsApplication/custom_conditions/U_Pw_face_load_interface_condition.hpp b/applications/GeoMechanicsApplication/custom_conditions/U_Pw_face_load_interface_condition.hpp index bf87a906666b..ca54198a2bd8 100644 --- a/applications/GeoMechanicsApplication/custom_conditions/U_Pw_face_load_interface_condition.hpp +++ b/applications/GeoMechanicsApplication/custom_conditions/U_Pw_face_load_interface_condition.hpp @@ -65,6 +65,8 @@ class KRATOS_API(GEO_MECHANICS_APPLICATION) UPwFaceLoadInterfaceCondition void Initialize(const ProcessInfo& rCurrentProcessInfo) override; + std::string Info() const override; + //---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- protected: @@ -109,7 +111,6 @@ class KRATOS_API(GEO_MECHANICS_APPLICATION) UPwFaceLoadInterfaceCondition { KRATOS_SERIALIZE_LOAD_BASE_CLASS(rSerializer, Condition) } - }; // class UPwFaceLoadInterfaceCondition. } // namespace Kratos. diff --git a/applications/GeoMechanicsApplication/custom_conditions/U_Pw_force_condition.cpp b/applications/GeoMechanicsApplication/custom_conditions/U_Pw_force_condition.cpp index 8666e22268ef..21e78f753be0 100644 --- a/applications/GeoMechanicsApplication/custom_conditions/U_Pw_force_condition.cpp +++ b/applications/GeoMechanicsApplication/custom_conditions/U_Pw_force_condition.cpp @@ -39,6 +39,12 @@ void UPwForceCondition::CalculateRHS(VectorType& rRightH } } +template +std::string UPwForceCondition::Info() const +{ + return "UPwForceCondition"; +} + //---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- template class UPwForceCondition<2, 1>; diff --git a/applications/GeoMechanicsApplication/custom_conditions/U_Pw_force_condition.hpp b/applications/GeoMechanicsApplication/custom_conditions/U_Pw_force_condition.hpp index 1901ea688bd5..1bf6b25be4de 100644 --- a/applications/GeoMechanicsApplication/custom_conditions/U_Pw_force_condition.hpp +++ b/applications/GeoMechanicsApplication/custom_conditions/U_Pw_force_condition.hpp @@ -61,6 +61,8 @@ class KRATOS_API(GEO_MECHANICS_APPLICATION) UPwForceCondition : public UPwCondit NodesArrayType const& ThisNodes, PropertiesType::Pointer pProperties) const override; + std::string Info() const override; + //---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- protected: @@ -90,7 +92,6 @@ class KRATOS_API(GEO_MECHANICS_APPLICATION) UPwForceCondition : public UPwCondit { KRATOS_SERIALIZE_LOAD_BASE_CLASS(rSerializer, Condition) } - }; // class UPwForceCondition. } // namespace Kratos. \ No newline at end of file diff --git a/applications/GeoMechanicsApplication/custom_conditions/U_Pw_normal_face_load_condition.cpp b/applications/GeoMechanicsApplication/custom_conditions/U_Pw_normal_face_load_condition.cpp index 1afbee6400a2..8158026bd029 100644 --- a/applications/GeoMechanicsApplication/custom_conditions/U_Pw_normal_face_load_condition.cpp +++ b/applications/GeoMechanicsApplication/custom_conditions/U_Pw_normal_face_load_condition.cpp @@ -119,6 +119,12 @@ double UPwNormalFaceLoadCondition::CalculateIntegrationCoeffici return IntegrationPoints[PointNumber].Weight(); } +template +std::string UPwNormalFaceLoadCondition::Info() const +{ + return "UPwNormalFaceLoadCondition"; +} + template class UPwNormalFaceLoadCondition<2, 2>; template class UPwNormalFaceLoadCondition<2, 3>; template class UPwNormalFaceLoadCondition<2, 4>; diff --git a/applications/GeoMechanicsApplication/custom_conditions/U_Pw_normal_face_load_condition.hpp b/applications/GeoMechanicsApplication/custom_conditions/U_Pw_normal_face_load_condition.hpp index 44c5b2031ff7..d1b9ea7f86b9 100644 --- a/applications/GeoMechanicsApplication/custom_conditions/U_Pw_normal_face_load_condition.hpp +++ b/applications/GeoMechanicsApplication/custom_conditions/U_Pw_normal_face_load_condition.hpp @@ -62,6 +62,8 @@ class KRATOS_API(GEO_MECHANICS_APPLICATION) UPwNormalFaceLoadCondition : public NodesArrayType const& ThisNodes, PropertiesType::Pointer pProperties) const override; + std::string Info() const override; + //---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- protected: @@ -107,7 +109,6 @@ class KRATOS_API(GEO_MECHANICS_APPLICATION) UPwNormalFaceLoadCondition : public { KRATOS_SERIALIZE_LOAD_BASE_CLASS(rSerializer, Condition) } - }; // class UPwNormalFaceLoadCondition. } // namespace Kratos. \ No newline at end of file diff --git a/applications/GeoMechanicsApplication/custom_conditions/U_Pw_normal_flux_FIC_condition.cpp b/applications/GeoMechanicsApplication/custom_conditions/U_Pw_normal_flux_FIC_condition.cpp index 4e8e56450f07..744617a17c49 100644 --- a/applications/GeoMechanicsApplication/custom_conditions/U_Pw_normal_flux_FIC_condition.cpp +++ b/applications/GeoMechanicsApplication/custom_conditions/U_Pw_normal_flux_FIC_condition.cpp @@ -216,6 +216,12 @@ void UPwNormalFluxFICCondition::CalculateAndAddBoundaryMassFlow GeoElementUtilities::AssemblePBlockVector(rRightHandSideVector, rVariables.PVector); } +template +std::string UPwNormalFluxFICCondition::Info() const +{ + return "UPwNormalFluxFICCondition"; +} + template class UPwNormalFluxFICCondition<2, 2>; template class UPwNormalFluxFICCondition<3, 3>; template class UPwNormalFluxFICCondition<3, 4>; diff --git a/applications/GeoMechanicsApplication/custom_conditions/U_Pw_normal_flux_FIC_condition.hpp b/applications/GeoMechanicsApplication/custom_conditions/U_Pw_normal_flux_FIC_condition.hpp index edfb9b253c5c..8df415c58277 100644 --- a/applications/GeoMechanicsApplication/custom_conditions/U_Pw_normal_flux_FIC_condition.hpp +++ b/applications/GeoMechanicsApplication/custom_conditions/U_Pw_normal_flux_FIC_condition.hpp @@ -61,6 +61,8 @@ class KRATOS_API(GEO_MECHANICS_APPLICATION) UPwNormalFluxFICCondition GeometryData::IntegrationMethod GetIntegrationMethod() const override; + std::string Info() const override; + protected: struct NormalFluxFICVariables { double DtPressureCoefficient; @@ -108,7 +110,6 @@ class KRATOS_API(GEO_MECHANICS_APPLICATION) UPwNormalFluxFICCondition { KRATOS_SERIALIZE_LOAD_BASE_CLASS(rSerializer, Condition) } - }; // class UPwNormalFluxFICCondition. } // namespace Kratos. diff --git a/applications/GeoMechanicsApplication/custom_conditions/U_Pw_normal_flux_condition.cpp b/applications/GeoMechanicsApplication/custom_conditions/U_Pw_normal_flux_condition.cpp index 2c86b2d33e3b..9a7427a40666 100644 --- a/applications/GeoMechanicsApplication/custom_conditions/U_Pw_normal_flux_condition.cpp +++ b/applications/GeoMechanicsApplication/custom_conditions/U_Pw_normal_flux_condition.cpp @@ -86,6 +86,12 @@ void UPwNormalFluxCondition::CalculateAndAddRHS(VectorType& rRi GeoElementUtilities::AssemblePBlockVector(rRightHandSideVector, rVariables.PVector); } +template +std::string UPwNormalFluxCondition::Info() const +{ + return "UPwNormalFluxCondition"; +} + template class UPwNormalFluxCondition<2, 2>; template class UPwNormalFluxCondition<2, 3>; template class UPwNormalFluxCondition<2, 4>; diff --git a/applications/GeoMechanicsApplication/custom_conditions/U_Pw_normal_flux_condition.hpp b/applications/GeoMechanicsApplication/custom_conditions/U_Pw_normal_flux_condition.hpp index 242cfcd32898..9a03086fd40d 100644 --- a/applications/GeoMechanicsApplication/custom_conditions/U_Pw_normal_flux_condition.hpp +++ b/applications/GeoMechanicsApplication/custom_conditions/U_Pw_normal_flux_condition.hpp @@ -65,6 +65,8 @@ class KRATOS_API(GEO_MECHANICS_APPLICATION) UPwNormalFluxCondition NodesArrayType const& ThisNodes, PropertiesType::Pointer pProperties) const override; + std::string Info() const override; + //---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- protected: @@ -103,7 +105,6 @@ class KRATOS_API(GEO_MECHANICS_APPLICATION) UPwNormalFluxCondition { KRATOS_SERIALIZE_LOAD_BASE_CLASS(rSerializer, Condition) } - }; // class UPwNormalFluxCondition. } // namespace Kratos. \ No newline at end of file diff --git a/applications/GeoMechanicsApplication/custom_conditions/U_Pw_normal_flux_interface_condition.cpp b/applications/GeoMechanicsApplication/custom_conditions/U_Pw_normal_flux_interface_condition.cpp index 9315fcf3e981..23da3e6cb2f5 100644 --- a/applications/GeoMechanicsApplication/custom_conditions/U_Pw_normal_flux_interface_condition.cpp +++ b/applications/GeoMechanicsApplication/custom_conditions/U_Pw_normal_flux_interface_condition.cpp @@ -94,6 +94,12 @@ void UPwNormalFluxInterfaceCondition::CalculateRHS(VectorType& } } +template +std::string UPwNormalFluxInterfaceCondition::Info() const +{ + return "UPwNormalFluxInterfaceCondition"; +} + //---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- template class UPwNormalFluxInterfaceCondition<2, 2>; diff --git a/applications/GeoMechanicsApplication/custom_conditions/U_Pw_normal_flux_interface_condition.hpp b/applications/GeoMechanicsApplication/custom_conditions/U_Pw_normal_flux_interface_condition.hpp index 39d959a5c4be..832f29abe164 100644 --- a/applications/GeoMechanicsApplication/custom_conditions/U_Pw_normal_flux_interface_condition.hpp +++ b/applications/GeoMechanicsApplication/custom_conditions/U_Pw_normal_flux_interface_condition.hpp @@ -66,6 +66,8 @@ class KRATOS_API(GEO_MECHANICS_APPLICATION) UPwNormalFluxInterfaceCondition NodesArrayType const& ThisNodes, PropertiesType::Pointer pProperties) const override; + std::string Info() const override; + //---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- protected: @@ -95,7 +97,6 @@ class KRATOS_API(GEO_MECHANICS_APPLICATION) UPwNormalFluxInterfaceCondition { KRATOS_SERIALIZE_LOAD_BASE_CLASS(rSerializer, Condition) } - }; // class UPwNormalFluxInterfaceCondition. } // namespace Kratos. diff --git a/applications/GeoMechanicsApplication/custom_conditions/U_Pw_normal_lysmer_absorbing_condition.cpp b/applications/GeoMechanicsApplication/custom_conditions/U_Pw_normal_lysmer_absorbing_condition.cpp index 5bfb9e967a83..56a64dae6bbf 100644 --- a/applications/GeoMechanicsApplication/custom_conditions/U_Pw_normal_lysmer_absorbing_condition.cpp +++ b/applications/GeoMechanicsApplication/custom_conditions/U_Pw_normal_lysmer_absorbing_condition.cpp @@ -568,7 +568,12 @@ void UPwLysmerAbsorbingCondition<3, 4>::CalculateRotationMatrix(BoundedMatrix +std::string UPwLysmerAbsorbingCondition::Info() const +{ + return "UPwLysmerAbsorbingCondition"; +} //---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- diff --git a/applications/GeoMechanicsApplication/custom_conditions/U_Pw_normal_lysmer_absorbing_condition.hpp b/applications/GeoMechanicsApplication/custom_conditions/U_Pw_normal_lysmer_absorbing_condition.hpp index cdd0d6f1d93a..4550317433dc 100644 --- a/applications/GeoMechanicsApplication/custom_conditions/U_Pw_normal_lysmer_absorbing_condition.hpp +++ b/applications/GeoMechanicsApplication/custom_conditions/U_Pw_normal_lysmer_absorbing_condition.hpp @@ -101,6 +101,8 @@ class KRATOS_API(GEO_MECHANICS_APPLICATION) UPwLysmerAbsorbingCondition VectorType& rRightHandSideVector, const ProcessInfo& rCurrentProcessInfo) override; + std::string Info() const override; + //---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- protected: @@ -222,7 +224,6 @@ class KRATOS_API(GEO_MECHANICS_APPLICATION) UPwLysmerAbsorbingCondition { KRATOS_SERIALIZE_LOAD_BASE_CLASS(rSerializer, Condition) } - }; // class UPwLysmerAbsorbingCondition. } // namespace Kratos. diff --git a/applications/GeoMechanicsApplication/custom_conditions/axisymmetric_U_Pw_normal_face_load_condition.cpp b/applications/GeoMechanicsApplication/custom_conditions/axisymmetric_U_Pw_normal_face_load_condition.cpp index f48b400e6c27..44319a42c6d5 100644 --- a/applications/GeoMechanicsApplication/custom_conditions/axisymmetric_U_Pw_normal_face_load_condition.cpp +++ b/applications/GeoMechanicsApplication/custom_conditions/axisymmetric_U_Pw_normal_face_load_condition.cpp @@ -64,6 +64,12 @@ GeometryData::IntegrationMethod AxisymmetricUPwNormalFaceLoadCondition +std::string AxisymmetricUPwNormalFaceLoadCondition::Info() const +{ + return "AxisymmetricUPwNormalFaceLoadCondition"; +} + //---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- template class AxisymmetricUPwNormalFaceLoadCondition<2, 2>; diff --git a/applications/GeoMechanicsApplication/custom_conditions/axisymmetric_U_Pw_normal_face_load_condition.hpp b/applications/GeoMechanicsApplication/custom_conditions/axisymmetric_U_Pw_normal_face_load_condition.hpp index cf00b374e42c..a1bc8f02a00f 100644 --- a/applications/GeoMechanicsApplication/custom_conditions/axisymmetric_U_Pw_normal_face_load_condition.hpp +++ b/applications/GeoMechanicsApplication/custom_conditions/axisymmetric_U_Pw_normal_face_load_condition.hpp @@ -64,6 +64,8 @@ class KRATOS_API(GEO_MECHANICS_APPLICATION) AxisymmetricUPwNormalFaceLoadConditi GeometryData::IntegrationMethod GetIntegrationMethod() const override; + std::string Info() const override; + //---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- protected: diff --git a/applications/GeoMechanicsApplication/custom_conditions/axisymmetric_line_normal_fluid_flux_2D_diff_order_condition.cpp b/applications/GeoMechanicsApplication/custom_conditions/axisymmetric_line_normal_fluid_flux_2D_diff_order_condition.cpp index 487a1851170a..95c1b9098d0f 100644 --- a/applications/GeoMechanicsApplication/custom_conditions/axisymmetric_line_normal_fluid_flux_2D_diff_order_condition.cpp +++ b/applications/GeoMechanicsApplication/custom_conditions/axisymmetric_line_normal_fluid_flux_2D_diff_order_condition.cpp @@ -72,4 +72,9 @@ double AxisymmetricLineNormalFluidFlux2DDiffOrderCondition::CalculateIntegration KRATOS_CATCH("") } +std::string AxisymmetricLineNormalFluidFlux2DDiffOrderCondition::Info() const +{ + return "AxisymmetricLineNormalFluidFlux2DDiffOrderCondition"; +} + } // Namespace Kratos. diff --git a/applications/GeoMechanicsApplication/custom_conditions/axisymmetric_line_normal_fluid_flux_2D_diff_order_condition.hpp b/applications/GeoMechanicsApplication/custom_conditions/axisymmetric_line_normal_fluid_flux_2D_diff_order_condition.hpp index 6f1ea274f3b1..825e148c99f6 100644 --- a/applications/GeoMechanicsApplication/custom_conditions/axisymmetric_line_normal_fluid_flux_2D_diff_order_condition.hpp +++ b/applications/GeoMechanicsApplication/custom_conditions/axisymmetric_line_normal_fluid_flux_2D_diff_order_condition.hpp @@ -55,6 +55,8 @@ class KRATOS_API(GEO_MECHANICS_APPLICATION) AxisymmetricLineNormalFluidFlux2DDif NodesArrayType const& ThisNodes, PropertiesType::Pointer pProperties) const override; + std::string Info() const override; + //---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- protected: diff --git a/applications/GeoMechanicsApplication/custom_conditions/axisymmetric_line_normal_load_2D_diff_order_condition.cpp b/applications/GeoMechanicsApplication/custom_conditions/axisymmetric_line_normal_load_2D_diff_order_condition.cpp index 0ea43da58c39..359e70b93357 100644 --- a/applications/GeoMechanicsApplication/custom_conditions/axisymmetric_line_normal_load_2D_diff_order_condition.cpp +++ b/applications/GeoMechanicsApplication/custom_conditions/axisymmetric_line_normal_load_2D_diff_order_condition.cpp @@ -68,4 +68,9 @@ double AxisymmetricLineNormalLoad2DDiffOrderCondition::CalculateIntegrationCoeff KRATOS_CATCH("") } +std::string AxisymmetricLineNormalLoad2DDiffOrderCondition::Info() const +{ + return "AxisymmetricLineNormalLoad2DDiffOrderCondition"; +} + } // Namespace Kratos. diff --git a/applications/GeoMechanicsApplication/custom_conditions/axisymmetric_line_normal_load_2D_diff_order_condition.hpp b/applications/GeoMechanicsApplication/custom_conditions/axisymmetric_line_normal_load_2D_diff_order_condition.hpp index 5e8f36e8cbe6..af1217c3ef66 100644 --- a/applications/GeoMechanicsApplication/custom_conditions/axisymmetric_line_normal_load_2D_diff_order_condition.hpp +++ b/applications/GeoMechanicsApplication/custom_conditions/axisymmetric_line_normal_load_2D_diff_order_condition.hpp @@ -54,6 +54,8 @@ class KRATOS_API(GEO_MECHANICS_APPLICATION) AxisymmetricLineNormalLoad2DDiffOrde NodesArrayType const& ThisNodes, PropertiesType::Pointer pProperties) const override; + std::string Info() const override; + //---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- protected: diff --git a/applications/GeoMechanicsApplication/custom_conditions/general_U_Pw_diff_order_condition.cpp b/applications/GeoMechanicsApplication/custom_conditions/general_U_Pw_diff_order_condition.cpp index 618d310f0fe0..a2e67af88103 100644 --- a/applications/GeoMechanicsApplication/custom_conditions/general_U_Pw_diff_order_condition.cpp +++ b/applications/GeoMechanicsApplication/custom_conditions/general_U_Pw_diff_order_condition.cpp @@ -308,4 +308,6 @@ Condition::DofsVectorType GeneralUPwDiffOrderCondition::GetDofs() const return result; } +std::string GeneralUPwDiffOrderCondition::Info() const { return "GeneralUPwDiffOrderCondition"; } + } // Namespace Kratos. diff --git a/applications/GeoMechanicsApplication/custom_conditions/general_U_Pw_diff_order_condition.hpp b/applications/GeoMechanicsApplication/custom_conditions/general_U_Pw_diff_order_condition.hpp index 079cdc468f4e..84406a47cf25 100644 --- a/applications/GeoMechanicsApplication/custom_conditions/general_U_Pw_diff_order_condition.hpp +++ b/applications/GeoMechanicsApplication/custom_conditions/general_U_Pw_diff_order_condition.hpp @@ -78,6 +78,8 @@ class KRATOS_API(GEO_MECHANICS_APPLICATION) GeneralUPwDiffOrderCondition : publi void EquationIdVector(EquationIdVectorType& rResult, const ProcessInfo&) const override; + std::string Info() const override; + //---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- protected: diff --git a/applications/GeoMechanicsApplication/custom_conditions/line_load_2D_diff_order_condition.cpp b/applications/GeoMechanicsApplication/custom_conditions/line_load_2D_diff_order_condition.cpp index 64903a96e5fd..4b56ab2b3ec5 100644 --- a/applications/GeoMechanicsApplication/custom_conditions/line_load_2D_diff_order_condition.cpp +++ b/applications/GeoMechanicsApplication/custom_conditions/line_load_2D_diff_order_condition.cpp @@ -105,4 +105,6 @@ void LineLoad2DDiffOrderCondition::CalculateAndAddConditionForce(VectorType& rRi } } +std::string LineLoad2DDiffOrderCondition::Info() const { return "LineLoad2DDiffOrderCondition"; } + } // Namespace Kratos. diff --git a/applications/GeoMechanicsApplication/custom_conditions/line_load_2D_diff_order_condition.hpp b/applications/GeoMechanicsApplication/custom_conditions/line_load_2D_diff_order_condition.hpp index 524fb4d03cfb..ad35e7c02a7d 100644 --- a/applications/GeoMechanicsApplication/custom_conditions/line_load_2D_diff_order_condition.hpp +++ b/applications/GeoMechanicsApplication/custom_conditions/line_load_2D_diff_order_condition.hpp @@ -53,6 +53,8 @@ class KRATOS_API(GEO_MECHANICS_APPLICATION) LineLoad2DDiffOrderCondition : publi NodesArrayType const& ThisNodes, PropertiesType::Pointer pProperties) const override; + std::string Info() const override; + //---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- protected: diff --git a/applications/GeoMechanicsApplication/custom_conditions/line_normal_fluid_flux_2D_diff_order_condition.cpp b/applications/GeoMechanicsApplication/custom_conditions/line_normal_fluid_flux_2D_diff_order_condition.cpp index 4f62b3ef6542..0602660d0364 100644 --- a/applications/GeoMechanicsApplication/custom_conditions/line_normal_fluid_flux_2D_diff_order_condition.cpp +++ b/applications/GeoMechanicsApplication/custom_conditions/line_normal_fluid_flux_2D_diff_order_condition.cpp @@ -85,4 +85,9 @@ void LineNormalFluidFlux2DDiffOrderCondition::CalculateAndAddConditionForce(Vect } } +std::string LineNormalFluidFlux2DDiffOrderCondition::Info() const +{ + return "LineNormalFluidFlux2DDiffOrderCondition"; +} + } // Namespace Kratos. diff --git a/applications/GeoMechanicsApplication/custom_conditions/line_normal_fluid_flux_2D_diff_order_condition.hpp b/applications/GeoMechanicsApplication/custom_conditions/line_normal_fluid_flux_2D_diff_order_condition.hpp index f8b176785d76..0f5015901be3 100644 --- a/applications/GeoMechanicsApplication/custom_conditions/line_normal_fluid_flux_2D_diff_order_condition.hpp +++ b/applications/GeoMechanicsApplication/custom_conditions/line_normal_fluid_flux_2D_diff_order_condition.hpp @@ -55,6 +55,8 @@ class KRATOS_API(GEO_MECHANICS_APPLICATION) LineNormalFluidFlux2DDiffOrderCondit NodesArrayType const& ThisNodes, PropertiesType::Pointer pProperties) const override; + std::string Info() const override; + //---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- protected: diff --git a/applications/GeoMechanicsApplication/custom_conditions/line_normal_load_2D_diff_order_condition.cpp b/applications/GeoMechanicsApplication/custom_conditions/line_normal_load_2D_diff_order_condition.cpp index b558acd4f7b0..4abda82e9838 100644 --- a/applications/GeoMechanicsApplication/custom_conditions/line_normal_load_2D_diff_order_condition.cpp +++ b/applications/GeoMechanicsApplication/custom_conditions/line_normal_load_2D_diff_order_condition.cpp @@ -109,4 +109,9 @@ void LineNormalLoad2DDiffOrderCondition::CalculateAndAddConditionForce(VectorTyp } } +std::string LineNormalLoad2DDiffOrderCondition::Info() const +{ + return "LineNormalLoad2DDiffOrderCondition"; +} + } // Namespace Kratos. diff --git a/applications/GeoMechanicsApplication/custom_conditions/line_normal_load_2D_diff_order_condition.hpp b/applications/GeoMechanicsApplication/custom_conditions/line_normal_load_2D_diff_order_condition.hpp index b888e7b58902..f812d599710a 100644 --- a/applications/GeoMechanicsApplication/custom_conditions/line_normal_load_2D_diff_order_condition.hpp +++ b/applications/GeoMechanicsApplication/custom_conditions/line_normal_load_2D_diff_order_condition.hpp @@ -53,6 +53,8 @@ class KRATOS_API(GEO_MECHANICS_APPLICATION) LineNormalLoad2DDiffOrderCondition : NodesArrayType const& ThisNodes, PropertiesType::Pointer pProperties) const override; + std::string Info() const override; + //---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- protected: diff --git a/applications/GeoMechanicsApplication/custom_conditions/surface_load_3D_diff_order_condition.cpp b/applications/GeoMechanicsApplication/custom_conditions/surface_load_3D_diff_order_condition.cpp index 50866e599721..b57d7e8f785a 100644 --- a/applications/GeoMechanicsApplication/custom_conditions/surface_load_3D_diff_order_condition.cpp +++ b/applications/GeoMechanicsApplication/custom_conditions/surface_load_3D_diff_order_condition.cpp @@ -122,4 +122,9 @@ void SurfaceLoad3DDiffOrderCondition::CalculateAndAddConditionForce(VectorType& } } +std::string SurfaceLoad3DDiffOrderCondition::Info() const +{ + return "SurfaceLoad3DDiffOrderCondition"; +} + } // Namespace Kratos. diff --git a/applications/GeoMechanicsApplication/custom_conditions/surface_load_3D_diff_order_condition.hpp b/applications/GeoMechanicsApplication/custom_conditions/surface_load_3D_diff_order_condition.hpp index 689150e304f5..338495169001 100644 --- a/applications/GeoMechanicsApplication/custom_conditions/surface_load_3D_diff_order_condition.hpp +++ b/applications/GeoMechanicsApplication/custom_conditions/surface_load_3D_diff_order_condition.hpp @@ -53,6 +53,8 @@ class KRATOS_API(GEO_MECHANICS_APPLICATION) SurfaceLoad3DDiffOrderCondition : pu NodesArrayType const& ThisNodes, PropertiesType::Pointer pProperties) const override; + std::string Info() const override; + //---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- protected: diff --git a/applications/GeoMechanicsApplication/custom_conditions/surface_normal_fluid_flux_3D_diff_order_condition.cpp b/applications/GeoMechanicsApplication/custom_conditions/surface_normal_fluid_flux_3D_diff_order_condition.cpp index 6dd0845c72a4..871eda8b6290 100644 --- a/applications/GeoMechanicsApplication/custom_conditions/surface_normal_fluid_flux_3D_diff_order_condition.cpp +++ b/applications/GeoMechanicsApplication/custom_conditions/surface_normal_fluid_flux_3D_diff_order_condition.cpp @@ -80,4 +80,9 @@ void SurfaceNormalFluidFlux3DDiffOrderCondition::CalculateAndAddConditionForce(V } } +std::string SurfaceNormalFluidFlux3DDiffOrderCondition::Info() const +{ + return "SurfaceNormalFluidFlux3DDiffOrderCondition"; +} + } // Namespace Kratos. diff --git a/applications/GeoMechanicsApplication/custom_conditions/surface_normal_fluid_flux_3D_diff_order_condition.hpp b/applications/GeoMechanicsApplication/custom_conditions/surface_normal_fluid_flux_3D_diff_order_condition.hpp index c0b76da5d914..f6a52072b945 100644 --- a/applications/GeoMechanicsApplication/custom_conditions/surface_normal_fluid_flux_3D_diff_order_condition.hpp +++ b/applications/GeoMechanicsApplication/custom_conditions/surface_normal_fluid_flux_3D_diff_order_condition.hpp @@ -55,6 +55,8 @@ class KRATOS_API(GEO_MECHANICS_APPLICATION) SurfaceNormalFluidFlux3DDiffOrderCon NodesArrayType const& ThisNodes, PropertiesType::Pointer pProperties) const override; + std::string Info() const override; + //---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- protected: diff --git a/applications/GeoMechanicsApplication/custom_conditions/surface_normal_load_3D_diff_order_condition.cpp b/applications/GeoMechanicsApplication/custom_conditions/surface_normal_load_3D_diff_order_condition.cpp index 4f4cd04ce2db..dc927dbe9798 100644 --- a/applications/GeoMechanicsApplication/custom_conditions/surface_normal_load_3D_diff_order_condition.cpp +++ b/applications/GeoMechanicsApplication/custom_conditions/surface_normal_load_3D_diff_order_condition.cpp @@ -109,4 +109,9 @@ void SurfaceNormalLoad3DDiffOrderCondition::CalculateAndAddConditionForce(Vector } } +std::string SurfaceNormalLoad3DDiffOrderCondition::Info() const +{ + return "SurfaceNormalLoad3DDiffOrderCondition"; +} + } // Namespace Kratos. diff --git a/applications/GeoMechanicsApplication/custom_conditions/surface_normal_load_3D_diff_order_condition.hpp b/applications/GeoMechanicsApplication/custom_conditions/surface_normal_load_3D_diff_order_condition.hpp index 9f899d2cac83..2208d9ea8f18 100644 --- a/applications/GeoMechanicsApplication/custom_conditions/surface_normal_load_3D_diff_order_condition.hpp +++ b/applications/GeoMechanicsApplication/custom_conditions/surface_normal_load_3D_diff_order_condition.hpp @@ -47,6 +47,8 @@ class KRATOS_API(GEO_MECHANICS_APPLICATION) SurfaceNormalLoad3DDiffOrderConditio NodesArrayType const& ThisNodes, PropertiesType::Pointer pProperties) const override; + std::string Info() const override; + //---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- protected: diff --git a/applications/GeoMechanicsApplication/custom_conditions/thermal_point_flux_condition.cpp b/applications/GeoMechanicsApplication/custom_conditions/thermal_point_flux_condition.cpp index 82d6836823d6..3d82736d5431 100644 --- a/applications/GeoMechanicsApplication/custom_conditions/thermal_point_flux_condition.cpp +++ b/applications/GeoMechanicsApplication/custom_conditions/thermal_point_flux_condition.cpp @@ -44,6 +44,12 @@ void GeoThermalPointFluxCondition::CalculateRHS(Vector& rRightH rRightHandSideVector[0] = this->GetGeometry()[0].FastGetSolutionStepValue(NORMAL_HEAT_FLUX); } +template +std::string GeoThermalPointFluxCondition::Info() const +{ + return "GeoThermalPointFluxCondition"; +} + template class GeoThermalPointFluxCondition<2, 1>; template class GeoThermalPointFluxCondition<3, 1>; diff --git a/applications/GeoMechanicsApplication/custom_conditions/thermal_point_flux_condition.h b/applications/GeoMechanicsApplication/custom_conditions/thermal_point_flux_condition.h index 10f874982bbc..e3906f1c1813 100644 --- a/applications/GeoMechanicsApplication/custom_conditions/thermal_point_flux_condition.h +++ b/applications/GeoMechanicsApplication/custom_conditions/thermal_point_flux_condition.h @@ -44,6 +44,8 @@ class KRATOS_API(GEO_MECHANICS_APPLICATION) GeoThermalPointFluxCondition NewId, this->GetGeometry().Create(rThisNodes), pProperties); } + std::string Info() const override; + protected: void CalculateRHS(Vector& rRightHandSideVector, const ProcessInfo& CurrentProcessInfo) override; From fa16a4b277f825cb9845bb71d506c70d4861ddc4 Mon Sep 17 00:00:00 2001 From: aronnoordam Date: Tue, 20 Aug 2024 10:45:52 +0200 Subject: [PATCH 61/65] simplified test_helper --- .../tests/test_helper.py | 25 ++++++------------- 1 file changed, 8 insertions(+), 17 deletions(-) diff --git a/applications/GeoMechanicsApplication/tests/test_helper.py b/applications/GeoMechanicsApplication/tests/test_helper.py index d7b4be7feb53..41969cafb5dd 100644 --- a/applications/GeoMechanicsApplication/tests/test_helper.py +++ b/applications/GeoMechanicsApplication/tests/test_helper.py @@ -434,30 +434,18 @@ def are_values_almost_equal(expected: Any, actual: Any, abs_tolerance: float = 1 """ # check if the value is a dictionary and check the dictionary if isinstance(expected, dict): - # check if the value is a dictionary and check the dictionary - if not are_dictionaries_almost_equal(expected, actual): - return False + return are_dictionaries_almost_equal(expected, actual) elif isinstance(expected, str): - # check if the value is a string and compare the strings - if expected != actual: - return False + return expected == actual elif isinstance(expected, (list, tuple, set)): - # check if the value is a list, tuple or set and compare the values - if not are_iterables_almost_equal(expected, actual): - return False + return are_iterables_almost_equal(expected, actual) elif expected is None: - # check if the value is None and compare the values - if actual is not None: - return False + return actual is None elif isinstance(expected, (float, int, complex)): - # The value is a number and compare the values - if not math.isclose(expected, actual, abs_tol=abs_tolerance): - return False + return math.isclose(expected, actual, abs_tol=abs_tolerance) else: raise Exception(f"Unsupported type {type(expected)}") - return True - def are_iterables_almost_equal(expected: (list, tuple, set), actual: (list, tuple, set), abs_tolerance: float = 1e-7) -> bool: @@ -497,6 +485,8 @@ def are_dictionaries_almost_equal(expected: Dict[Any, Any], - True if the dictionaries are equal, False otherwise. """ + if len(expected) != len(actual): + return False for k, v in expected.items(): @@ -511,6 +501,7 @@ def are_dictionaries_almost_equal(expected: Dict[Any, Any], # all checks passed return True + class GiDOutputFileReader: def __init__(self): self._reset_internal_state() From 6d6b5e4064e2c0c3e80d6adf46592da8c7fd9e40 Mon Sep 17 00:00:00 2001 From: Anne van de Graaf Date: Tue, 20 Aug 2024 15:41:04 +0200 Subject: [PATCH 62/65] [GeoMechanicsApplication] Added new geometry for line interfaces (#12635) Co-authored-by: Richard Faasse --- .../line_interface_geometry.h | 137 +++++++ .../test_interface_geometry.cpp | 356 ++++++++++++++++++ 2 files changed, 493 insertions(+) create mode 100644 applications/GeoMechanicsApplication/custom_geometries/line_interface_geometry.h create mode 100644 applications/GeoMechanicsApplication/tests/cpp_tests/custom_geometries/test_interface_geometry.cpp diff --git a/applications/GeoMechanicsApplication/custom_geometries/line_interface_geometry.h b/applications/GeoMechanicsApplication/custom_geometries/line_interface_geometry.h new file mode 100644 index 000000000000..7bf10e3a6dad --- /dev/null +++ b/applications/GeoMechanicsApplication/custom_geometries/line_interface_geometry.h @@ -0,0 +1,137 @@ +// KRATOS___ +// // ) ) +// // ___ ___ +// // ____ //___) ) // ) ) +// // / / // // / / +// ((____/ / ((____ ((___/ / MECHANICS +// +// License: geo_mechanics_application/license.txt +// +// Main authors: Richard Faasse +// Anne van de Graaf +// + +#pragma once + +#include "geometries/geometry.h" +#include "geometries/line_2d_2.h" +#include "geometries/line_2d_3.h" +#include "includes/node.h" + +namespace Kratos +{ + +class LineInterfaceGeometry : public Geometry +{ +public: + KRATOS_CLASS_POINTER_DEFINITION(LineInterfaceGeometry); + + using BaseType = Geometry; + + LineInterfaceGeometry() = default; + + explicit LineInterfaceGeometry(const PointsArrayType& rThisPoints) + : LineInterfaceGeometry(0, rThisPoints) + { + } + + LineInterfaceGeometry(IndexType NewGeometryId, const PointsArrayType& rThisPoints) + : BaseType(NewGeometryId, rThisPoints) + { + KRATOS_ERROR_IF_NOT((rThisPoints.size() == 4) || (rThisPoints.size() == 6)) + << "Number of nodes must be 2+2 or 3+3\n"; + + const auto points_of_mid_line = CreatePointsOfMidLine(); + + if (points_of_mid_line.size() == 2) { + mMidLineGeometry = std::make_unique>(points_of_mid_line); + } else { + mMidLineGeometry = std::make_unique>(points_of_mid_line); + } + } + + [[nodiscard]] BaseType::Pointer Create(const PointsArrayType& rThisPoints) const override + { + constexpr auto id = IndexType{0}; + return Create(id, rThisPoints); + } + + [[nodiscard]] BaseType::Pointer Create(const IndexType NewGeometryId, const PointsArrayType& rThisPoints) const override + { + return std::make_shared(NewGeometryId, rThisPoints); + } + + [[nodiscard]] double ShapeFunctionValue(IndexType ShapeFunctionIndex, + const CoordinatesArrayType& rLocalCoordinate) const override + { + return mMidLineGeometry->ShapeFunctionValue(ShapeFunctionIndex, rLocalCoordinate); + } + + Vector& ShapeFunctionsValues(Vector& rResult, const CoordinatesArrayType& rLocalCoordinate) const override + { + return mMidLineGeometry->ShapeFunctionsValues(rResult, rLocalCoordinate); + } + + Matrix& ShapeFunctionsLocalGradients(Matrix& rResult, const CoordinatesArrayType& rLocalCoordinate) const override + { + return mMidLineGeometry->ShapeFunctionsLocalGradients(rResult, rLocalCoordinate); + } + + Matrix& Jacobian(Matrix& rResult, const CoordinatesArrayType& rLocalCoordinate) const override + { + return mMidLineGeometry->Jacobian(rResult, rLocalCoordinate); + } + + [[nodiscard]] double DeterminantOfJacobian(const CoordinatesArrayType& rLocalCoordinate) const override + { + return mMidLineGeometry->DeterminantOfJacobian(rLocalCoordinate); + } + + Matrix& InverseOfJacobian(Matrix& rResult, const CoordinatesArrayType& rLocalCoordinate) const override + { + KRATOS_ERROR << "Inverse of Jacobian is not implemented for the line interface geometry\n"; + } + + [[nodiscard]] double Length() const override { return mMidLineGeometry->Length(); } + + [[nodiscard]] double DomainSize() const override { return mMidLineGeometry->DomainSize(); } + + [[nodiscard]] std::string Info() const override + { + return "An interface geometry consisting of two sub-geometries with Info: " + + mMidLineGeometry->Info(); + } + + CoordinatesArrayType& PointLocalCoordinates(CoordinatesArrayType& rResult, + const CoordinatesArrayType& rGlobalCoordinate) const override + { + return mMidLineGeometry->PointLocalCoordinates(rResult, rGlobalCoordinate); + } + + Matrix& PointsLocalCoordinates(Matrix& rResult) const override + { + return mMidLineGeometry->PointsLocalCoordinates(rResult); + } + + void PrintInfo(std::ostream& rOStream) const override { rOStream << Info(); } + + void PrintData(std::ostream& rOStream) const override { mMidLineGeometry->PrintData(rOStream); } + +private: + [[nodiscard]] PointerVector CreatePointsOfMidLine() const + { + const auto points = this->Points(); + const auto number_of_midline_nodes = std::size_t{points.size() / 2}; + + auto result = PointerVector{}; + for (std::size_t i = 0; i < number_of_midline_nodes; ++i) { + const auto mid_point = (points[i] + points[i + number_of_midline_nodes]) / 2; + result.push_back(make_intrusive(points[i].Id(), mid_point)); + } + return result; + } + + std::unique_ptr mMidLineGeometry; +}; + +} // namespace Kratos diff --git a/applications/GeoMechanicsApplication/tests/cpp_tests/custom_geometries/test_interface_geometry.cpp b/applications/GeoMechanicsApplication/tests/cpp_tests/custom_geometries/test_interface_geometry.cpp new file mode 100644 index 000000000000..da46c89983fd --- /dev/null +++ b/applications/GeoMechanicsApplication/tests/cpp_tests/custom_geometries/test_interface_geometry.cpp @@ -0,0 +1,356 @@ +// KRATOS___ +// // ) ) +// // ___ ___ +// // ____ //___) ) // ) ) +// // / / // // / / +// ((____/ / ((____ ((___/ / MECHANICS +// +// License: geo_mechanics_application/license.txt +// +// Main authors: Richard Faasse +// Anne van de Graaf +// + +#include "custom_geometries/line_interface_geometry.h" +#include "tests/cpp_tests/geo_mechanics_fast_suite.h" + +#include + +namespace +{ + +using namespace Kratos; + +LineInterfaceGeometry CreateTwoPlusTwoNodedLineInterfaceGeometry() +{ + PointerVector nodes; + nodes.push_back(Kratos::make_intrusive(1, 0.0, 0.0, 0.0)); + nodes.push_back(Kratos::make_intrusive(2, 5.0, 0.0, 0.0)); + nodes.push_back(Kratos::make_intrusive(3, -1.0, 0.2, 0.0)); + nodes.push_back(Kratos::make_intrusive(4, 7.0, 0.2, 0.0)); + return {1, nodes}; +} + +LineInterfaceGeometry CreateThreePlusThreeNodedLineInterfaceGeometry() +{ + PointerVector nodes; + nodes.push_back(Kratos::make_intrusive(1, 0.0, 0.0, 0.0)); + nodes.push_back(Kratos::make_intrusive(2, 5.0, 0.0, 0.0)); + nodes.push_back(Kratos::make_intrusive(3, 2.5, 0.0, 0.0)); + nodes.push_back(Kratos::make_intrusive(4, -1.0, 0.2, 0.0)); + nodes.push_back(Kratos::make_intrusive(5, 7.0, 0.2, 0.0)); + nodes.push_back(Kratos::make_intrusive(6, 3.5, 0.4, 0.0)); + return {1, nodes}; +} + +} // namespace + +using namespace Kratos; + +namespace Kratos::Testing +{ + +KRATOS_TEST_CASE_IN_SUITE(InterfaceGeometryIsAGeometry, KratosGeoMechanicsFastSuiteWithoutKernel) +{ + const auto geometry = LineInterfaceGeometry(); + const auto base_geometry = dynamic_cast*>(&geometry); + + KRATOS_EXPECT_NE(base_geometry, nullptr); +} + +KRATOS_TEST_CASE_IN_SUITE(InterfaceGeometry_Create_CreatesNewInstanceOfCorrectType, KratosGeoMechanicsFastSuiteWithoutKernel) +{ + const auto geometry = LineInterfaceGeometry(); + PointerVector nodes; + nodes.push_back(Kratos::make_intrusive(1, 0.0, 0.0, 0.0)); + nodes.push_back(Kratos::make_intrusive(2, 0.0, 0.0, 0.0)); + nodes.push_back(Kratos::make_intrusive(3, 0.0, 0.0, 0.0)); + nodes.push_back(Kratos::make_intrusive(4, 0.0, 0.0, 0.0)); + + const auto new_geometry = geometry.Create(nodes); + + KRATOS_EXPECT_NE(new_geometry, nullptr); + KRATOS_EXPECT_NE(dynamic_cast(new_geometry.get()), nullptr); + KRATOS_EXPECT_EQ(new_geometry->PointsNumber(), 4); + KRATOS_EXPECT_EQ(new_geometry->Id(), 0); +} + +KRATOS_TEST_CASE_IN_SUITE(InterfaceGeometry_CreateWithId_CreatesNewInstanceOfCorrectTypeAndId, + KratosGeoMechanicsFastSuiteWithoutKernel) +{ + const auto geometry = LineInterfaceGeometry(); + PointerVector nodes; + nodes.push_back(Kratos::make_intrusive(1, 0.0, 0.0, 0.0)); + nodes.push_back(Kratos::make_intrusive(2, 0.0, 0.0, 0.0)); + nodes.push_back(Kratos::make_intrusive(3, 0.0, 0.0, 0.0)); + nodes.push_back(Kratos::make_intrusive(4, 0.0, 0.0, 0.0)); + + constexpr auto new_geometry_id = 1; + const auto new_geometry = geometry.Create(new_geometry_id, nodes); + + KRATOS_EXPECT_NE(new_geometry, nullptr); + KRATOS_EXPECT_NE(dynamic_cast(new_geometry.get()), nullptr); + KRATOS_EXPECT_EQ(new_geometry->PointsNumber(), 4); + KRATOS_EXPECT_EQ(new_geometry->Id(), new_geometry_id); +} + +KRATOS_TEST_CASE_IN_SUITE(CreatingInterfaceWithThreeNodesThrows, KratosGeoMechanicsFastSuiteWithoutKernel) +{ + PointerVector nodes; + nodes.push_back(Kratos::make_intrusive(1, 0.0, 0.0, 0.0)); + nodes.push_back(Kratos::make_intrusive(2, 5.0, 0.0, 0.0)); + nodes.push_back(Kratos::make_intrusive(3, -1.0, 0.0, 0.0)); + + KRATOS_EXPECT_EXCEPTION_IS_THROWN(LineInterfaceGeometry{nodes}, + "Number of nodes must be 2+2 or 3+3") + constexpr auto geometry_id = 1; + KRATOS_EXPECT_EXCEPTION_IS_THROWN((LineInterfaceGeometry{geometry_id, nodes}), + "Number of nodes must be 2+2 or 3+3") +} + +KRATOS_TEST_CASE_IN_SUITE(InterfaceGeometry_ReturnsCorrectShapeFunctionValuesInNodes_ForTwoPlusTwoNodedGeometry, + KratosGeoMechanicsFastSuiteWithoutKernel) +{ + const auto geometry = CreateTwoPlusTwoNodedLineInterfaceGeometry(); + const auto xi_start = array_1d{-1.0, 0.0, 0.0}; + const auto xi_end = array_1d{1.0, 0.0, 0.0}; + + // Values for first shape function + KRATOS_EXPECT_DOUBLE_EQ(geometry.ShapeFunctionValue(0, xi_start), 1.0); + KRATOS_EXPECT_DOUBLE_EQ(geometry.ShapeFunctionValue(0, xi_end), 0.0); + + // Values for second shape function + KRATOS_EXPECT_DOUBLE_EQ(geometry.ShapeFunctionValue(1, xi_start), 0.0); + KRATOS_EXPECT_DOUBLE_EQ(geometry.ShapeFunctionValue(1, xi_end), 1.0); +} + +KRATOS_TEST_CASE_IN_SUITE(InterfaceGeometry_ReturnsCorrectShapeFunctionValuesInNodes_ForThreePlusThreeNodedGeometry, + KratosGeoMechanicsFastSuiteWithoutKernel) +{ + const auto geometry = CreateThreePlusThreeNodedLineInterfaceGeometry(); + const auto xi_start = array_1d{-1.0, 0.0, 0.0}; + const auto xi_end = array_1d{1.0, 0.0, 0.0}; + const auto xi_middle = array_1d{0.0, 0.0, 0.0}; + + // Values for first shape function + KRATOS_EXPECT_DOUBLE_EQ(geometry.ShapeFunctionValue(0, xi_start), 1.0); + KRATOS_EXPECT_DOUBLE_EQ(geometry.ShapeFunctionValue(0, xi_end), 0.0); + KRATOS_EXPECT_DOUBLE_EQ(geometry.ShapeFunctionValue(0, xi_middle), 0.0); + + // Values for second shape function + KRATOS_EXPECT_DOUBLE_EQ(geometry.ShapeFunctionValue(1, xi_start), 0.0); + KRATOS_EXPECT_DOUBLE_EQ(geometry.ShapeFunctionValue(1, xi_end), 1.0); + KRATOS_EXPECT_DOUBLE_EQ(geometry.ShapeFunctionValue(1, xi_middle), 0.0); + + // Values for third shape function + KRATOS_EXPECT_DOUBLE_EQ(geometry.ShapeFunctionValue(2, xi_start), 0.0); + KRATOS_EXPECT_DOUBLE_EQ(geometry.ShapeFunctionValue(2, xi_end), 0.0); + KRATOS_EXPECT_DOUBLE_EQ(geometry.ShapeFunctionValue(2, xi_middle), 1.0); +} + +KRATOS_TEST_CASE_IN_SUITE(InterfaceGeometry_ReturnsCorrectAllShapeFunctionValuesAtPosition_ForTwoPlusTwoNodedGeometry, + KratosGeoMechanicsFastSuiteWithoutKernel) +{ + const auto geometry = CreateTwoPlusTwoNodedLineInterfaceGeometry(); + const auto xi = array_1d{0.5, 0.0, 0.0}; + + Vector result; + geometry.ShapeFunctionsValues(result, xi); + + // Note that the shape function values are evaluated per nodal pair! + Vector expected_result{2}; + expected_result <<= 0.25, 0.75; + KRATOS_EXPECT_VECTOR_NEAR(result, expected_result, 1e-6) +} + +KRATOS_TEST_CASE_IN_SUITE(InterfaceGeometry_ReturnsCorrectAllShapeFunctionValuesAtPosition_ForThreePlusThreeNodedGeometry, + KratosGeoMechanicsFastSuiteWithoutKernel) +{ + const auto geometry = CreateThreePlusThreeNodedLineInterfaceGeometry(); + const auto xi = array_1d{0.5, 0.0, 0.0}; + + Vector result; + geometry.ShapeFunctionsValues(result, xi); + + // Note that the shape function values are evaluated per nodal pair! + Vector expected_result{3}; + expected_result <<= -0.125, 0.375, 0.75; + KRATOS_EXPECT_VECTOR_NEAR(result, expected_result, 1e-6) +} + +KRATOS_TEST_CASE_IN_SUITE(InterfaceGeometry_ReturnsCorrectAllLocalGradientsAtPosition_ForTwoPlusTwoNodedGeometry, + KratosGeoMechanicsFastSuiteWithoutKernel) +{ + const auto geometry = CreateTwoPlusTwoNodedLineInterfaceGeometry(); + const auto xi = array_1d{0.5, 0.0, 0.0}; + + Matrix result; + geometry.ShapeFunctionsLocalGradients(result, xi); + + Matrix expected_result(2, 1); + expected_result <<= -0.5, 0.5; + KRATOS_EXPECT_MATRIX_NEAR(result, expected_result, 1e-6) +} + +KRATOS_TEST_CASE_IN_SUITE(InterfaceGeometry_ReturnsCorrectAllLocalGradientsAtPosition_ForThreePlusThreeNodedGeometry, + KratosGeoMechanicsFastSuiteWithoutKernel) +{ + const auto geometry = CreateThreePlusThreeNodedLineInterfaceGeometry(); + const auto xi = array_1d{0.5, 0.0, 0.0}; + + Matrix result; + geometry.ShapeFunctionsLocalGradients(result, xi); + + Matrix expected_result(3, 1); + expected_result <<= 0.0, 1.0, -1.0; + KRATOS_EXPECT_MATRIX_NEAR(result, expected_result, 1e-6) +} + +KRATOS_TEST_CASE_IN_SUITE(InterfaceGeometry_ReturnsCorrectJacobian_ForTwoPlusTwoNodedGeometry, + KratosGeoMechanicsFastSuiteWithoutKernel) +{ + const auto geometry = CreateTwoPlusTwoNodedLineInterfaceGeometry(); + const auto xi = array_1d{0.5, 0.0, 0.0}; + + Matrix result; + geometry.Jacobian(result, xi); + + Matrix expected_result(2, 1); + expected_result <<= 3.25, 0.0; + KRATOS_EXPECT_MATRIX_RELATIVE_NEAR(result, expected_result, 1e-6) +} + +KRATOS_TEST_CASE_IN_SUITE(InterfaceGeometry_ReturnsCorrectJacobian_ForThreePlusThreeNodedGeometry, + KratosGeoMechanicsFastSuiteWithoutKernel) +{ + const auto geometry = CreateThreePlusThreeNodedLineInterfaceGeometry(); + const auto xi = array_1d{0.5, 0.0, 0.0}; + + Matrix result; + geometry.Jacobian(result, xi); + + Matrix expected_result(2, 1); + expected_result <<= 3.0, -0.1; + KRATOS_EXPECT_MATRIX_RELATIVE_NEAR(result, expected_result, 1e-6) +} + +KRATOS_TEST_CASE_IN_SUITE(InterfaceGeometry_ReturnsCorrectDeterminantOfJacobian_ForTwoPlusTwoNodedGeometry, + KratosGeoMechanicsFastSuiteWithoutKernel) +{ + const auto geometry = CreateTwoPlusTwoNodedLineInterfaceGeometry(); + const auto xi = array_1d{0.5, 0.0, 0.0}; + + KRATOS_EXPECT_RELATIVE_NEAR(geometry.DeterminantOfJacobian(xi), 3.25, 1e-6) +} + +KRATOS_TEST_CASE_IN_SUITE(InterfaceGeometry_ReturnsCorrectDeterminantOfJacobian_ForThreePlusThreeNodedGeometry, + KratosGeoMechanicsFastSuiteWithoutKernel) +{ + const auto geometry = CreateThreePlusThreeNodedLineInterfaceGeometry(); + const auto xi = array_1d{0.5, 0.0, 0.0}; + + KRATOS_EXPECT_RELATIVE_NEAR(geometry.DeterminantOfJacobian(xi), std::sqrt(9.01), 1e-6) +} + +KRATOS_TEST_CASE_IN_SUITE(InterfaceGeometry_Throws_WhenCallingInverseJacobian, KratosGeoMechanicsFastSuiteWithoutKernel) +{ + const auto geometry = CreateTwoPlusTwoNodedLineInterfaceGeometry(); + const auto xi = array_1d{0.5, 0.0, 0.0}; + + Matrix result; + KRATOS_EXPECT_EXCEPTION_IS_THROWN( + geometry.InverseOfJacobian(result, xi), + "Inverse of Jacobian is not implemented for the line interface geometry") +} + +KRATOS_TEST_CASE_IN_SUITE(TwoPlusTwoLineInterfaceGeometry_LengthReturnsTheLengthOfUnderlyingLineGeometry, + KratosGeoMechanicsFastSuiteWithoutKernel) +{ + const auto geometry = CreateTwoPlusTwoNodedLineInterfaceGeometry(); + + constexpr auto expected_length = 6.5; + KRATOS_EXPECT_RELATIVE_NEAR(geometry.Length(), expected_length, 1e-6) +} + +KRATOS_TEST_CASE_IN_SUITE(ThreePlusThreeNodedLineInterfaceGeometry_LengthReturnsTheLengthOfUnderlyingLineGeometry, + KratosGeoMechanicsFastSuiteWithoutKernel) +{ + const auto geometry = CreateThreePlusThreeNodedLineInterfaceGeometry(); + + // This number was not calculated by hand, meaning this unit test is a regression test. + constexpr auto expected_length = 6.504159; + KRATOS_EXPECT_RELATIVE_NEAR(geometry.Length(), expected_length, 1e-6) +} + +KRATOS_TEST_CASE_IN_SUITE(TwoPlusTwoNodedLineInterfaceGeometry_DomainSizeReturnsTheLengthOfUnderlyingLineGeometry, + KratosGeoMechanicsFastSuiteWithoutKernel) +{ + const auto geometry = CreateTwoPlusTwoNodedLineInterfaceGeometry(); + + KRATOS_EXPECT_RELATIVE_NEAR(geometry.DomainSize(), geometry.Length(), 1e-6) +} + +KRATOS_TEST_CASE_IN_SUITE(ThreePlusThreeNodedLineInterfaceGeometry_DomainSizeReturnsTheLengthOfUnderlyingLineGeometry, + KratosGeoMechanicsFastSuiteWithoutKernel) +{ + const auto geometry = CreateThreePlusThreeNodedLineInterfaceGeometry(); + + KRATOS_EXPECT_RELATIVE_NEAR(geometry.DomainSize(), geometry.Length(), 1e-6) +} + +KRATOS_TEST_CASE_IN_SUITE(GlobalCoordinatesAreCorrectlyMappedToLocalCoordinate_ForTwoPlusTwoNodedLineInterfaceGeometry, + KratosGeoMechanicsFastSuiteWithoutKernel) +{ + const auto geometry = CreateTwoPlusTwoNodedLineInterfaceGeometry(); + + const auto global_position = array_1d{4.375, 0.1, 0.0}; + auto result = array_1d{}; + result = geometry.PointLocalCoordinates(result, global_position); + + const auto expected_result = array_1d{0.5, 0.0, 0.0}; + KRATOS_EXPECT_VECTOR_RELATIVE_NEAR(result, expected_result, 1e-6) +} + +KRATOS_TEST_CASE_IN_SUITE(GlobalCoordinatesAreCorrectlyMappedToLocalCoordinate_ForThreePlusThreeNodedLineInterfaceGeometry, + KratosGeoMechanicsFastSuiteWithoutKernel) +{ + const auto geometry = CreateThreePlusThreeNodedLineInterfaceGeometry(); + + const auto global_position = array_1d{4.5625, 0.175, 0.0}; + auto result = array_1d{}; + result = geometry.PointLocalCoordinates(result, global_position); + + const auto expected_result = array_1d{0.5, 0.0, 0.0}; + KRATOS_EXPECT_VECTOR_RELATIVE_NEAR(result, expected_result, 1e-6) +} + +KRATOS_TEST_CASE_IN_SUITE(GetLocalCoordinatesOfAllNodesOfThreePlusThreeNodedLineInterfaceGeometry, + KratosGeoMechanicsFastSuiteWithoutKernel) +{ + const auto geometry = CreateThreePlusThreeNodedLineInterfaceGeometry(); + + Matrix result; + geometry.PointsLocalCoordinates(result); + + Matrix expected_result{3, 1}; + expected_result <<= -1.0, 1.0, 0.0; + KRATOS_EXPECT_MATRIX_NEAR(result, expected_result, 1e-6) +} + +KRATOS_TEST_CASE_IN_SUITE(InterfaceGeometry_Throws_WhenCallingArea, KratosGeoMechanicsFastSuiteWithoutKernel) +{ + const auto geometry = CreateThreePlusThreeNodedLineInterfaceGeometry(); + KRATOS_EXPECT_EXCEPTION_IS_THROWN(geometry.Area(), + "Calling base class 'Area' method instead of derived class " + "one. Please check the definition of derived class. ") +} + +KRATOS_TEST_CASE_IN_SUITE(InterfaceGeometry_Throws_WhenCallingVolume, KratosGeoMechanicsFastSuiteWithoutKernel) +{ + const auto geometry = CreateThreePlusThreeNodedLineInterfaceGeometry(); + KRATOS_EXPECT_EXCEPTION_IS_THROWN(geometry.Volume(), + "Calling base class 'Volume' method instead of derived class " + "one. Please check the definition of derived class. ") +} + +} // namespace Kratos::Testing \ No newline at end of file From 11b7e63b1b074309578c4e314431bd77f9c47627 Mon Sep 17 00:00:00 2001 From: aronnoordam Date: Wed, 21 Aug 2024 09:29:23 +0200 Subject: [PATCH 63/65] base exception to typeerror --- applications/GeoMechanicsApplication/tests/test_helper.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/applications/GeoMechanicsApplication/tests/test_helper.py b/applications/GeoMechanicsApplication/tests/test_helper.py index 41969cafb5dd..4bab3a3cc06d 100644 --- a/applications/GeoMechanicsApplication/tests/test_helper.py +++ b/applications/GeoMechanicsApplication/tests/test_helper.py @@ -444,7 +444,7 @@ def are_values_almost_equal(expected: Any, actual: Any, abs_tolerance: float = 1 elif isinstance(expected, (float, int, complex)): return math.isclose(expected, actual, abs_tol=abs_tolerance) else: - raise Exception(f"Unsupported type {type(expected)}") + raise TypeError(f"Unsupported type {type(expected)}") def are_iterables_almost_equal(expected: (list, tuple, set), actual: (list, tuple, set), From b9c905a9b870a7b9ae37f476609dfe72499f5d50 Mon Sep 17 00:00:00 2001 From: markelov208 <146726001+markelov208@users.noreply.github.com> Date: Wed, 21 Aug 2024 11:33:32 +0200 Subject: [PATCH 64/65] [GeoMechanicsApplication] Shorter domain of the phreatic line causes a crash (#12634) * fixed return index * added unit test comparing to computed values. Co-authored-by: gennady.markelov --- ...t_phreatic_multi_line_pressure_process.cpp | 2 +- ...t_phreatic_multi_line_pressure_process.cpp | 46 +++++++++++++++++++ 2 files changed, 47 insertions(+), 1 deletion(-) diff --git a/applications/GeoMechanicsApplication/custom_processes/apply_constant_phreatic_multi_line_pressure_process.cpp b/applications/GeoMechanicsApplication/custom_processes/apply_constant_phreatic_multi_line_pressure_process.cpp index f113e2b554f8..bf2efbae28b6 100644 --- a/applications/GeoMechanicsApplication/custom_processes/apply_constant_phreatic_multi_line_pressure_process.cpp +++ b/applications/GeoMechanicsApplication/custom_processes/apply_constant_phreatic_multi_line_pressure_process.cpp @@ -249,7 +249,7 @@ int ApplyConstantPhreaticMultiLinePressureProcess::findIndex(const Node& rNode) } } - return number_of_coordinates - 1; + return number_of_coordinates - 2; } double ApplyConstantPhreaticMultiLinePressureProcess::CalculatePressure(const Node& rNode, diff --git a/applications/GeoMechanicsApplication/tests/cpp_tests/test_apply_constant_phreatic_multi_line_pressure_process.cpp b/applications/GeoMechanicsApplication/tests/cpp_tests/test_apply_constant_phreatic_multi_line_pressure_process.cpp index 53f2bcd1045e..24b1c04205a6 100644 --- a/applications/GeoMechanicsApplication/tests/cpp_tests/test_apply_constant_phreatic_multi_line_pressure_process.cpp +++ b/applications/GeoMechanicsApplication/tests/cpp_tests/test_apply_constant_phreatic_multi_line_pressure_process.cpp @@ -13,6 +13,8 @@ #include "custom_processes/apply_constant_phreatic_multi_line_pressure_process.h" #include "geo_mechanics_fast_suite.h" #include "includes/checks.h" +#include "geometries/quadrilateral_2d_4.h" +#include "processes/structured_mesh_generator_process.h" using namespace Kratos; @@ -140,4 +142,48 @@ KRATOS_TEST_CASE_IN_SUITE(ApplyConstantPhreaticMultiLinePressureProcessDoesNotTh r_model_part, test_parameters)) } +KRATOS_TEST_CASE_IN_SUITE(ApplyConstantPhreaticMultilinePressureProcess_AppliesCorrectPressure_WhenPhreaticLineDoesNotSpanEntireDomain, + KratosGeoMechanicsFastSuite) +{ + auto model = Model{}; + auto& r_model_part = model.CreateModelPart("foo"); + r_model_part.AddNodalSolutionStepVariable(WATER_PRESSURE); + + // Set up the test model part mesh + auto p_point_1 = Kratos::make_intrusive(1, 0.0, 0.0, 0.0); + auto p_point_2 = Kratos::make_intrusive(2, 0.0, 1.0, 0.0); + auto p_point_3 = Kratos::make_intrusive(3, 5.0, 1.0, 0.0); + auto p_point_4 = Kratos::make_intrusive(4, 5.0, 0.0, 0.0); + Quadrilateral2D4 domain_geometry(p_point_1, p_point_2, p_point_3, p_point_4); + Parameters mesher_parameters(R"({ + "number_of_divisions": 2, + "element_name": "Element2D3N", + "condition_name": "LineCondition", + "create_skin_sub_model_part": true + })"); + StructuredMeshGeneratorProcess(domain_geometry, r_model_part, mesher_parameters).Execute(); + + auto test_parameters = Parameters{R"( + { + "model_part_name": "foo", + "variable_name": "WATER_PRESSURE", + "specific_weight": 10000.0, + "x_coordinates": [0.0, 1.0, 2.0], + "y_coordinates": [1.0, 1.0, 1.0], + "z_coordinates": [0.0, 0.0, 0.0], + "gravity_direction": 1 + } )"}; + + ApplyConstantPhreaticMultiLinePressureProcess process{r_model_part, test_parameters}; + process.ExecuteInitialize(); + + const auto phreatic_line_position = 1.0; + const auto specific_weight = 10000.0; + block_for_each(r_model_part.Nodes(), + [&phreatic_line_position, &specific_weight](auto& node) { + const auto water_pressure = (node.Y() - phreatic_line_position) * specific_weight; + KRATOS_EXPECT_DOUBLE_EQ(node.FastGetSolutionStepValue(WATER_PRESSURE, 0), water_pressure); + }); +} + } // namespace Kratos::Testing \ No newline at end of file From 246ca6b4a32bef6313dd6ba88956406c704151ce Mon Sep 17 00:00:00 2001 From: WPK4FEM <129858139+WPK4FEM@users.noreply.github.com> Date: Thu, 22 Aug 2024 18:20:28 +0200 Subject: [PATCH 65/65] [GeoMechanicsApplication] Zero mass for geo interface (#12640) * Return zero mass matrix for UPwSmallStrainInterface. * Removed obsolete AssembleDensityMatrix. --- .../U_Pw_small_strain_interface_element.cpp | 65 +------------------ .../custom_utilities/README.md | 4 +- .../custom_utilities/element_utilities.hpp | 10 --- 3 files changed, 4 insertions(+), 75 deletions(-) diff --git a/applications/GeoMechanicsApplication/custom_elements/U_Pw_small_strain_interface_element.cpp b/applications/GeoMechanicsApplication/custom_elements/U_Pw_small_strain_interface_element.cpp index 959c7d56d694..c72b8bf7ec6b 100644 --- a/applications/GeoMechanicsApplication/custom_elements/U_Pw_small_strain_interface_element.cpp +++ b/applications/GeoMechanicsApplication/custom_elements/U_Pw_small_strain_interface_element.cpp @@ -151,69 +151,8 @@ template void UPwSmallStrainInterfaceElement::CalculateMassMatrix(MatrixType& rMassMatrix, const ProcessInfo& rCurrentProcessInfo) { - KRATOS_TRY - - const unsigned int N_DOF = this->GetNumberOfDOF(); - - // Resizing mass matrix - if (rMassMatrix.size1() != N_DOF) rMassMatrix.resize(N_DOF, N_DOF, false); - noalias(rMassMatrix) = ZeroMatrix(N_DOF, N_DOF); - - const PropertiesType& r_prop = this->GetProperties(); - const GeometryType& r_geom = this->GetGeometry(); - const GeometryType::IntegrationPointsArrayType& IntegrationPoints = - r_geom.IntegrationPoints(mThisIntegrationMethod); - const unsigned int NumGPoints = IntegrationPoints.size(); - - // Defining shape functions and the determinant of the jacobian at all integration points - const Matrix& NContainer = r_geom.ShapeFunctionsValues(mThisIntegrationMethod); - Vector detJContainer(NumGPoints); - r_geom.DeterminantOfJacobian(detJContainer, mThisIntegrationMethod); - const auto integration_coefficients = - this->CalculateIntegrationCoefficients(IntegrationPoints, detJContainer); - - // Element variables - InterfaceElementVariables Variables; - this->InitializeElementVariables(Variables, r_geom, r_prop, rCurrentProcessInfo); - - RetentionLaw::Parameters RetentionParameters(r_prop); - - // Defining necessary variables - BoundedMatrix aux_density_matrix = ZeroMatrix(TDim, TNumNodes * TDim); - BoundedMatrix density_matrix = ZeroMatrix(TDim, TDim); - - array_1d LocalRelDispVector; - array_1d RelDispVector; - const double& MinimumJointWidth = r_prop[MINIMUM_JOINT_WIDTH]; - - // Loop over integration points - for (unsigned int GPoint = 0; GPoint < NumGPoints; ++GPoint) { - InterfaceElementUtilities::CalculateNuMatrix(Variables.Nu, NContainer, GPoint); - - noalias(RelDispVector) = prod(Variables.Nu, Variables.DisplacementVector); - - noalias(LocalRelDispVector) = prod(Variables.RotationMatrix, RelDispVector); - - this->CalculateJointWidth(Variables.JointWidth, LocalRelDispVector[TDim - 1], MinimumJointWidth, GPoint); - - Variables.IntegrationCoefficient = integration_coefficients[GPoint]; - - CalculateRetentionResponse(Variables, RetentionParameters, GPoint); - - const auto density = - GeoTransportEquationUtilities::CalculateSoilDensity(Variables.DegreeOfSaturation, r_prop); - - GeoElementUtilities::AssembleDensityMatrix(density_matrix, density); - - noalias(aux_density_matrix) = prod(density_matrix, Variables.Nu); - - // Adding contribution to Mass matrix - GeoElementUtilities::AssembleUUBlockMatrix( - rMassMatrix, prod(trans(Variables.Nu), aux_density_matrix) * Variables.JointWidth * - Variables.IntegrationCoefficient); - } - - KRATOS_CATCH("") + // Resizing mass matrix, no mass in these interface elements. + rMassMatrix = ZeroMatrix(this->GetNumberOfDOF(), this->GetNumberOfDOF()); } template diff --git a/applications/GeoMechanicsApplication/custom_utilities/README.md b/applications/GeoMechanicsApplication/custom_utilities/README.md index f74b962e8e03..57dfa5d127dc 100644 --- a/applications/GeoMechanicsApplication/custom_utilities/README.md +++ b/applications/GeoMechanicsApplication/custom_utilities/README.md @@ -54,9 +54,9 @@ File transport_equation_utilities.hpp includes ### Mass Matrix (M) The mathematical definition is: -$$M = \int_\Omega N_{u}^T \rho N_u d\Omega$$ +$$M = \int_\Omega \rho N_{u}^T N_u d\Omega$$ -Where $\Omega$ is the domain, $N_u$ is the displacement shape function and $\rho$ is the density matrix that holds density for all directions. +Where $\Omega$ is the domain, $N_u$ is the displacement shape function and $\rho$ is the density. ### Stiffness Matrix (K) diff --git a/applications/GeoMechanicsApplication/custom_utilities/element_utilities.hpp b/applications/GeoMechanicsApplication/custom_utilities/element_utilities.hpp index d31e6081c5cb..db6423ff39e1 100644 --- a/applications/GeoMechanicsApplication/custom_utilities/element_utilities.hpp +++ b/applications/GeoMechanicsApplication/custom_utilities/element_utilities.hpp @@ -191,16 +191,6 @@ class GeoElementUtilities KRATOS_CATCH("") } - template - static inline void AssembleDensityMatrix(MatrixType& DensityMatrix, double Density) - { - for (unsigned int idim = 0; idim < DensityMatrix.size1(); ++idim) { - for (unsigned int jdim = 0; jdim < DensityMatrix.size2(); ++jdim) { - DensityMatrix(idim, jdim) = Density; - } - } - } - template static inline void AssembleUUBlockMatrix(MatrixType1& rLeftHandSideMatrix, const MatrixType2& rUUBlockMatrix) {