diff --git a/_config.yml b/_config.yml new file mode 100644 index 000000000000..18854876c67f --- /dev/null +++ b/_config.yml @@ -0,0 +1 @@ +theme: jekyll-theme-midnight \ No newline at end of file diff --git a/cmake/ctest/drivers/atdm/ats1/drivers/Trilinos-atdm-ats1-hsw_intel-18.0.5_mpich-7.7.6_openmp_static_dbg.sh b/cmake/ctest/drivers/atdm/ats1/drivers/Trilinos-atdm-ats1-hsw_intel-18.0.5_mpich-7.7.6_openmp_static_dbg.sh index b5c605730b17..11988eb87b20 100755 --- a/cmake/ctest/drivers/atdm/ats1/drivers/Trilinos-atdm-ats1-hsw_intel-18.0.5_mpich-7.7.6_openmp_static_dbg.sh +++ b/cmake/ctest/drivers/atdm/ats1/drivers/Trilinos-atdm-ats1-hsw_intel-18.0.5_mpich-7.7.6_openmp_static_dbg.sh @@ -1,5 +1,5 @@ #!/bin/bash if [ "${Trilinos_TRACK}" == "" ] ; then - export Trilinos_TRACK=Experimental + export Trilinos_TRACK=Specialized fi $WORKSPACE/Trilinos/cmake/ctest/drivers/atdm/ats1/local-driver.sh diff --git a/cmake/ctest/drivers/atdm/ats1/drivers/Trilinos-atdm-ats1-hsw_intel-18.0.5_mpich-7.7.6_openmp_static_opt.sh b/cmake/ctest/drivers/atdm/ats1/drivers/Trilinos-atdm-ats1-hsw_intel-18.0.5_mpich-7.7.6_openmp_static_opt.sh index e740190df8f1..1128151c2bfb 100755 --- a/cmake/ctest/drivers/atdm/ats1/drivers/Trilinos-atdm-ats1-hsw_intel-18.0.5_mpich-7.7.6_openmp_static_opt.sh +++ b/cmake/ctest/drivers/atdm/ats1/drivers/Trilinos-atdm-ats1-hsw_intel-18.0.5_mpich-7.7.6_openmp_static_opt.sh @@ -1,6 +1,6 @@ #!/bin/bash if [ "${Trilinos_TRACK}" == "" ] ; then - export Trilinos_TRACK=Experimental + export Trilinos_TRACK=Specialized fi export Trilinos_SKIP_CTEST_ADD_TEST=FALSE $WORKSPACE/Trilinos/cmake/ctest/drivers/atdm/ats1/local-driver.sh diff --git a/cmake/ctest/drivers/atdm/ats1/drivers/Trilinos-atdm-ats1-hsw_intel-19.0.4_mpich-7.7.6_openmp_static_dbg.sh b/cmake/ctest/drivers/atdm/ats1/drivers/Trilinos-atdm-ats1-hsw_intel-19.0.4_mpich-7.7.6_openmp_static_dbg.sh index b5c605730b17..11988eb87b20 100755 --- a/cmake/ctest/drivers/atdm/ats1/drivers/Trilinos-atdm-ats1-hsw_intel-19.0.4_mpich-7.7.6_openmp_static_dbg.sh +++ b/cmake/ctest/drivers/atdm/ats1/drivers/Trilinos-atdm-ats1-hsw_intel-19.0.4_mpich-7.7.6_openmp_static_dbg.sh @@ -1,5 +1,5 @@ #!/bin/bash if [ "${Trilinos_TRACK}" == "" ] ; then - export Trilinos_TRACK=Experimental + export Trilinos_TRACK=Specialized fi $WORKSPACE/Trilinos/cmake/ctest/drivers/atdm/ats1/local-driver.sh diff --git a/cmake/ctest/drivers/atdm/ats1/drivers/Trilinos-atdm-ats1-hsw_intel-19.0.4_mpich-7.7.6_openmp_static_opt.sh b/cmake/ctest/drivers/atdm/ats1/drivers/Trilinos-atdm-ats1-hsw_intel-19.0.4_mpich-7.7.6_openmp_static_opt.sh index e740190df8f1..1128151c2bfb 100755 --- a/cmake/ctest/drivers/atdm/ats1/drivers/Trilinos-atdm-ats1-hsw_intel-19.0.4_mpich-7.7.6_openmp_static_opt.sh +++ b/cmake/ctest/drivers/atdm/ats1/drivers/Trilinos-atdm-ats1-hsw_intel-19.0.4_mpich-7.7.6_openmp_static_opt.sh @@ -1,6 +1,6 @@ #!/bin/bash if [ "${Trilinos_TRACK}" == "" ] ; then - export Trilinos_TRACK=Experimental + export Trilinos_TRACK=Specialized fi export Trilinos_SKIP_CTEST_ADD_TEST=FALSE $WORKSPACE/Trilinos/cmake/ctest/drivers/atdm/ats1/local-driver.sh diff --git a/cmake/ctest/drivers/atdm/ats1/drivers/Trilinos-atdm-ats1-knl_intel-18.0.5_mpich-7.7.6_openmp_static_dbg.sh b/cmake/ctest/drivers/atdm/ats1/drivers/Trilinos-atdm-ats1-knl_intel-18.0.5_mpich-7.7.6_openmp_static_dbg.sh index b5c605730b17..11988eb87b20 100755 --- a/cmake/ctest/drivers/atdm/ats1/drivers/Trilinos-atdm-ats1-knl_intel-18.0.5_mpich-7.7.6_openmp_static_dbg.sh +++ b/cmake/ctest/drivers/atdm/ats1/drivers/Trilinos-atdm-ats1-knl_intel-18.0.5_mpich-7.7.6_openmp_static_dbg.sh @@ -1,5 +1,5 @@ #!/bin/bash if [ "${Trilinos_TRACK}" == "" ] ; then - export Trilinos_TRACK=Experimental + export Trilinos_TRACK=Specialized fi $WORKSPACE/Trilinos/cmake/ctest/drivers/atdm/ats1/local-driver.sh diff --git a/cmake/ctest/drivers/atdm/ats1/drivers/Trilinos-atdm-ats1-knl_intel-18.0.5_mpich-7.7.6_openmp_static_opt.sh b/cmake/ctest/drivers/atdm/ats1/drivers/Trilinos-atdm-ats1-knl_intel-18.0.5_mpich-7.7.6_openmp_static_opt.sh index e740190df8f1..1128151c2bfb 100755 --- a/cmake/ctest/drivers/atdm/ats1/drivers/Trilinos-atdm-ats1-knl_intel-18.0.5_mpich-7.7.6_openmp_static_opt.sh +++ b/cmake/ctest/drivers/atdm/ats1/drivers/Trilinos-atdm-ats1-knl_intel-18.0.5_mpich-7.7.6_openmp_static_opt.sh @@ -1,6 +1,6 @@ #!/bin/bash if [ "${Trilinos_TRACK}" == "" ] ; then - export Trilinos_TRACK=Experimental + export Trilinos_TRACK=Specialized fi export Trilinos_SKIP_CTEST_ADD_TEST=FALSE $WORKSPACE/Trilinos/cmake/ctest/drivers/atdm/ats1/local-driver.sh diff --git a/cmake/ctest/drivers/atdm/ats1/drivers/Trilinos-atdm-ats1-knl_intel-19.0.4_mpich-7.7.6_openmp_static_dbg.sh b/cmake/ctest/drivers/atdm/ats1/drivers/Trilinos-atdm-ats1-knl_intel-19.0.4_mpich-7.7.6_openmp_static_dbg.sh index b5c605730b17..11988eb87b20 100755 --- a/cmake/ctest/drivers/atdm/ats1/drivers/Trilinos-atdm-ats1-knl_intel-19.0.4_mpich-7.7.6_openmp_static_dbg.sh +++ b/cmake/ctest/drivers/atdm/ats1/drivers/Trilinos-atdm-ats1-knl_intel-19.0.4_mpich-7.7.6_openmp_static_dbg.sh @@ -1,5 +1,5 @@ #!/bin/bash if [ "${Trilinos_TRACK}" == "" ] ; then - export Trilinos_TRACK=Experimental + export Trilinos_TRACK=Specialized fi $WORKSPACE/Trilinos/cmake/ctest/drivers/atdm/ats1/local-driver.sh diff --git a/cmake/ctest/drivers/atdm/ats1/drivers/Trilinos-atdm-ats1-knl_intel-19.0.4_mpich-7.7.6_openmp_static_opt.sh b/cmake/ctest/drivers/atdm/ats1/drivers/Trilinos-atdm-ats1-knl_intel-19.0.4_mpich-7.7.6_openmp_static_opt.sh index e740190df8f1..1128151c2bfb 100755 --- a/cmake/ctest/drivers/atdm/ats1/drivers/Trilinos-atdm-ats1-knl_intel-19.0.4_mpich-7.7.6_openmp_static_opt.sh +++ b/cmake/ctest/drivers/atdm/ats1/drivers/Trilinos-atdm-ats1-knl_intel-19.0.4_mpich-7.7.6_openmp_static_opt.sh @@ -1,6 +1,6 @@ #!/bin/bash if [ "${Trilinos_TRACK}" == "" ] ; then - export Trilinos_TRACK=Experimental + export Trilinos_TRACK=Specialized fi export Trilinos_SKIP_CTEST_ADD_TEST=FALSE $WORKSPACE/Trilinos/cmake/ctest/drivers/atdm/ats1/local-driver.sh diff --git a/cmake/ctest/drivers/atdm/ats2/drivers/Trilinos-atdm-ats2-cuda-10.1.243-gnu-7.3.1-spmpi-rolling_complex_static_opt.sh b/cmake/ctest/drivers/atdm/ats2/drivers/Trilinos-atdm-ats2-cuda-10.1.243-gnu-7.3.1-spmpi-rolling_complex_static_opt.sh new file mode 100755 index 000000000000..3688aaa6f28e --- /dev/null +++ b/cmake/ctest/drivers/atdm/ats2/drivers/Trilinos-atdm-ats2-cuda-10.1.243-gnu-7.3.1-spmpi-rolling_complex_static_opt.sh @@ -0,0 +1,5 @@ +#!/bin/bash +if [ "${Trilinos_TRACK}" == "" ] ; then + export Trilinos_TRACK=Specialized +fi +$WORKSPACE/Trilinos/cmake/ctest/drivers/atdm/ats2/local-driver.sh diff --git a/cmake/ctest/drivers/atdm/ats2/drivers/Trilinos-atdm-ats2-cuda-10.1.243-gnu-7.3.1-spmpi-2019.06.24_static_dbg.sh b/cmake/ctest/drivers/atdm/ats2/drivers/Trilinos-atdm-ats2-cuda-10.1.243-gnu-7.3.1-spmpi-rolling_static_dbg.sh similarity index 100% rename from cmake/ctest/drivers/atdm/ats2/drivers/Trilinos-atdm-ats2-cuda-10.1.243-gnu-7.3.1-spmpi-2019.06.24_static_dbg.sh rename to cmake/ctest/drivers/atdm/ats2/drivers/Trilinos-atdm-ats2-cuda-10.1.243-gnu-7.3.1-spmpi-rolling_static_dbg.sh diff --git a/cmake/ctest/drivers/atdm/ats2/drivers/Trilinos-atdm-ats2-cuda-10.1.243-gnu-7.3.1-spmpi-2019.06.24_static_opt.sh b/cmake/ctest/drivers/atdm/ats2/drivers/Trilinos-atdm-ats2-cuda-10.1.243-gnu-7.3.1-spmpi-rolling_static_opt.sh similarity index 100% rename from cmake/ctest/drivers/atdm/ats2/drivers/Trilinos-atdm-ats2-cuda-10.1.243-gnu-7.3.1-spmpi-2019.06.24_static_opt.sh rename to cmake/ctest/drivers/atdm/ats2/drivers/Trilinos-atdm-ats2-cuda-10.1.243-gnu-7.3.1-spmpi-rolling_static_opt.sh diff --git a/cmake/ctest/drivers/atdm/ats2/drivers/Trilinos-atdm-ats2-gnu-7.3.1-spmpi-2019.06.24_serial_static_dbg.sh b/cmake/ctest/drivers/atdm/ats2/drivers/Trilinos-atdm-ats2-gnu-7.3.1-spmpi-rolling_serial_static_dbg.sh similarity index 100% rename from cmake/ctest/drivers/atdm/ats2/drivers/Trilinos-atdm-ats2-gnu-7.3.1-spmpi-2019.06.24_serial_static_dbg.sh rename to cmake/ctest/drivers/atdm/ats2/drivers/Trilinos-atdm-ats2-gnu-7.3.1-spmpi-rolling_serial_static_dbg.sh diff --git a/cmake/ctest/drivers/atdm/ats2/drivers/Trilinos-atdm-ats2-gnu-7.3.1-spmpi-2019.06.24_serial_static_opt.sh b/cmake/ctest/drivers/atdm/ats2/drivers/Trilinos-atdm-ats2-gnu-7.3.1-spmpi-rolling_serial_static_opt.sh similarity index 100% rename from cmake/ctest/drivers/atdm/ats2/drivers/Trilinos-atdm-ats2-gnu-7.3.1-spmpi-2019.06.24_serial_static_opt.sh rename to cmake/ctest/drivers/atdm/ats2/drivers/Trilinos-atdm-ats2-gnu-7.3.1-spmpi-rolling_serial_static_opt.sh diff --git a/cmake/std/PullRequestLinuxDriverTest.py b/cmake/std/PullRequestLinuxDriverTest.py index 97a13b451dfc..5daae006f411 100755 --- a/cmake/std/PullRequestLinuxDriverTest.py +++ b/cmake/std/PullRequestLinuxDriverTest.py @@ -548,7 +548,8 @@ def createPackageEnables(arguments): 'get-changed-trilinos-packages.sh'), os.path.join('origin', arguments.targetBranch), 'HEAD', - 'packageEnables.cmake']) + 'packageEnables.cmake', + 'package_subproject_list.cmake']) else: with open('packageEnables.cmake', 'w') as f_out: f_out.write(dedent('''\ @@ -559,6 +560,10 @@ def createPackageEnables(arguments): PR_ENABLE_BOOL(Trilinos_ENABLE_''' + enable_map[arguments.job_base_name] + ''' ON) ''')) + with open ('package_subproject_list.cmake', 'w') as f_out: + f_out.write(dedent('''\ + set(CTEST_LABELS_FOR_SUBPROJECTS ''' + enable_map[arguments.job_base_name] + ''') + ''')) print('Enabled packages:') cmake_rstring = subprocess.check_output(['cmake', '-P', @@ -686,8 +691,7 @@ def run(): 'std', config_script), '-Dpackage_enables=../packageEnables.cmake', - '-Dsubprojects_file=../TFW_single_configure_support_scripts/'+ - 'package_subproject_list.cmake']) + '-Dsubprojects_file=../package_subproject_list.cmake']) return return_value diff --git a/cmake/std/atdm/ATDMDevEnvSettings.cmake b/cmake/std/atdm/ATDMDevEnvSettings.cmake index 241f4c38de1d..1b10ead8712b 100644 --- a/cmake/std/atdm/ATDMDevEnvSettings.cmake +++ b/cmake/std/atdm/ATDMDevEnvSettings.cmake @@ -293,7 +293,18 @@ ATDM_SET_CACHE(Kokkos_ENABLE_CXX11_DISPATCH_LAMBDA ON CACHE BOOL) ATDM_SET_CACHE(Kokkos_ENABLE_CUDA_LAMBDA "${ATDM_USE_CUDA}" CACHE BOOL) ATDM_SET_CACHE(Kokkos_ENABLE_DEBUG_BOUNDS_CHECK "${Trilinos_ENABLE_DEBUG}" CACHE BOOL) ATDM_SET_CACHE(Kokkos_ENABLE_DEBUG "${Trilinos_ENABLE_DEBUG}" CACHE BOOL) -ATDM_SET_CACHE(KOKKOS_ARCH "$ENV{ATDM_CONFIG_KOKKOS_ARCH}" CACHE STRING) + +# Update Kokkos arch, expected ATDM_CONFIG_KOKKOS_ARCH=arch1,arch2,arch3. Set +# the modern Kokkos arch, e.g., KOKKOS_ARCH=arch1 => Kokkos_ARCH_arch1=ON +set(kokkos_arch_list "$ENV{ATDM_CONFIG_KOKKOS_ARCH}") +string(REPLACE "," ";" kokkos_arch_list "$ENV{ATDM_CONFIG_KOKKOS_ARCH}") +foreach(kokkos_arch_loop_var ${kokkos_arch_list} ) + string(TOUPPER "${kokkos_arch_loop_var}" kokkos_arch_loop_var) + ATDM_SET_ENABLE(Kokkos_ARCH_${kokkos_arch_loop_var} ON) +endforeach(kokkos_arch_loop_var) +unset(kokkos_arch_list) +unset(kokkos_arch_loop_var) + ATDM_SET_CACHE(EpetraExt_ENABLE_HDF5 OFF CACHE BOOL) ATDM_SET_CACHE(Panzer_FADTYPE "Sacado::Fad::DFad" CACHE STRING) ATDM_SET_CACHE(Phalanx_KOKKOS_DEVICE_TYPE "${ATDM_NODE_TYPE}" CACHE STRING) diff --git a/cmake/std/atdm/CMakeLists.txt b/cmake/std/atdm/CMakeLists.txt index db8076023754..15143fcbd940 100644 --- a/cmake/std/atdm/CMakeLists.txt +++ b/cmake/std/atdm/CMakeLists.txt @@ -3,4 +3,5 @@ TRIBITS_ADD_TEST_DIRECTORIES(test) TRIBITS_ADD_TEST_DIRECTORIES(cee-rhel6) TRIBITS_ADD_TEST_DIRECTORIES(van1-tx2) TRIBITS_ADD_TEST_DIRECTORIES(ats1) +TRIBITS_ADD_TEST_DIRECTORIES(ats2) TRIBITS_PACKAGE_POSTPROCESS() diff --git a/cmake/std/atdm/README.md b/cmake/std/atdm/README.md index 6d4064d74f66..d2671ff7aa8c 100644 --- a/cmake/std/atdm/README.md +++ b/cmake/std/atdm/README.md @@ -1075,11 +1075,11 @@ $ bsub -x -Is -n 20 \ ### ATS-2 -Once logged on a supported ATS-2 system like 'vortex' (SRN), one can either -build and configure on a login node or a compute node. But one must always -run the tests from the launch node (allocated using 'bsub'). Make sure to -setup SSH keys as described in `/opt/VORTEX_INTRO` before trying to do -anything. +Once logged on a supported ATS-2 system (called system 'ats2') like 'vortex' +(SRN), one can either build and configure on a login node or a compute node. +But one must always run the tests from the launch node (allocated using +'bsub'). Make sure to setup SSH keys as described in `/opt/VORTEX_INTRO` +before trying to do anything. For example, to configure, build and run the tests for the default `cuda-debug` build for `Tpetra` (after cloning Trilinos on the 'develop' diff --git a/cmake/std/atdm/ats1/custom_builds_unit_tests.sh b/cmake/std/atdm/ats1/custom_builds_unit_tests.sh index ba0394775339..54e69f419aba 100755 --- a/cmake/std/atdm/ats1/custom_builds_unit_tests.sh +++ b/cmake/std/atdm/ats1/custom_builds_unit_tests.sh @@ -67,4 +67,5 @@ testAll() { # Run the unit tests # -. ${ATDM_CONFIG_SCRIPT_DIR}/test/shunit2/shunit2 +SHUNIT2_DIR=`readlink -f ${ATDM_CONFIG_SCRIPT_DIR}/../../../commonTools/test/shunit2` +. ${SHUNIT2_DIR}/shunit2 diff --git a/cmake/std/atdm/ats1/environment.sh b/cmake/std/atdm/ats1/environment.sh index 2ba1126ceda1..af9e32769c4d 100755 --- a/cmake/std/atdm/ats1/environment.sh +++ b/cmake/std/atdm/ats1/environment.sh @@ -145,10 +145,6 @@ export F90=${MPIF90} # Anasazi settings export ATDM_CONFIG_Anasazi_ENABLE_RBGen=OFF -# Kokkos settings -# ENABLE_SERIAL used by ATDMDevEnvSettings -export ATDM_CONFIG_Kokkos_ENABLE_SERIAL=OFF - # Lapack (intel) settings export ATDM_CONFIG_LAPACK_LIBS="-L${CBLAS_ROOT}/mkl/lib/intel64;-L${CBLAS_ROOT}/compiler/lib/intel64;-mkl;-lmkl_intel_lp64;-lmkl_intel_thread;-lmkl_core;-liomp5" diff --git a/cmake/std/atdm/ats2/CMakeLists.txt b/cmake/std/atdm/ats2/CMakeLists.txt new file mode 100644 index 000000000000..720e0d588a60 --- /dev/null +++ b/cmake/std/atdm/ats2/CMakeLists.txt @@ -0,0 +1,11 @@ +TRIBITS_ADD_ADVANCED_TEST( ats2_custom_builds_unit_tests + OVERALL_WORKING_DIRECTORY TEST_NAME + OVERALL_NUM_MPI_PROCS 1 + TEST_0 CMND env + ARGS SHUNIT_COLOR=none ${CMAKE_CURRENT_SOURCE_DIR}/custom_builds_unit_tests.sh + PASS_REGULAR_EXPRESSION_ALL + "ERROR: A supported compiler was not selected for 'ats2' env - anything-cudas-after" + "Ran 1 test" + "[^]OK[$]" + ALWAYS_FAIL_ON_NONZERO_RETURN + ) diff --git a/cmake/std/atdm/ats2/all_supported_builds.sh b/cmake/std/atdm/ats2/all_supported_builds.sh index 2b6a9e39e9a5..03cb5311db2e 100644 --- a/cmake/std/atdm/ats2/all_supported_builds.sh +++ b/cmake/std/atdm/ats2/all_supported_builds.sh @@ -1,11 +1,12 @@ export ATDM_CONFIG_CTEST_S_BUILD_NAME_PREFIX=Trilinos-atdm- -# ats2-xl-2019.08.20-spmpi-2019.06.24_openmp_static_opt -# ats2-xl-2019.08.20-spmpi-2019.06.24_openmp_static_dbg +# ats2-xl-2019.08.20-spmpi-rolling_openmp_static_opt +# ats2-xl-2019.08.20-spmpi-rolling_openmp_static_dbg export ATDM_CONFIG_ALL_SUPPORTED_BUILDS=( - ats2-gnu-7.3.1-spmpi-2019.06.24_serial_static_opt - ats2-gnu-7.3.1-spmpi-2019.06.24_serial_static_dbg - ats2-cuda-10.1.243-gnu-7.3.1-spmpi-2019.06.24_static_opt - ats2-cuda-10.1.243-gnu-7.3.1-spmpi-2019.06.24_static_dbg + ats2-gnu-7.3.1-spmpi-rolling_serial_static_opt + ats2-gnu-7.3.1-spmpi-rolling_serial_static_dbg + ats2-cuda-10.1.243-gnu-7.3.1-spmpi-rolling_static_opt + ats2-cuda-10.1.243-gnu-7.3.1-spmpi-rolling_static_dbg + ats2-cuda-10.1.243-gnu-7.3.1-spmpi-rolling_complex_static_opt ) diff --git a/cmake/std/atdm/ats2/custom_builds.sh b/cmake/std/atdm/ats2/custom_builds.sh index 9d1d132dbc78..7c4154f045ce 100644 --- a/cmake/std/atdm/ats2/custom_builds.sh +++ b/cmake/std/atdm/ats2/custom_builds.sh @@ -7,46 +7,58 @@ # Custom compiler selection logic -if [[ $ATDM_CONFIG_BUILD_NAME == *"cuda-10.1.243-xl-2019.08.20-spmpi-2019.06.24"* ]] \ - || [[ $ATDM_CONFIG_BUILD_NAME == *"cuda-10.1.243_xl-2019.08.20_spmpi-2019.06.24"* ]] \ - || [[ $ATDM_CONFIG_BUILD_NAME == *"cuda-10.1.243-xl-2019.08.20"* ]] \ - || [[ $ATDM_CONFIG_BUILD_NAME == *"cuda-10.1.243_xl-2019.08.20"* ]] \ - || [[ $ATDM_CONFIG_BUILD_NAME == *"cuda-10.1.243-xl-2019"* ]] \ - || [[ $ATDM_CONFIG_BUILD_NAME == *"cuda-10.1.243_xl-2019"* ]] \ - || [[ $ATDM_CONFIG_BUILD_NAME == *"cuda-xl"* ]] \ +if atdm_match_any_buildname_keyword \ + cuda-10.1.243-xl-2019.08.20-spmpi-rolling \ + cuda-10.1.243_xl-2019.08.20_spmpi-rolling \ + cuda-10.1.243-xl-2019.08.20 \ + cuda-10.1.243_xl-2019.08.20 \ + cuda-10.1.243-xl-2019 \ + cuda-10.1.243_xl-2019 \ + cuda-xl\ ; then - export ATDM_CONFIG_COMPILER=CUDA-10.1.243_XL-2019.08.20_SPMPI-2019.06.24 + echo + echo "ERROR: Currently not supporting cuda-10.1.243-xl-2019.08.20-spmpi-rolling" + echo + return + #export ATDM_CONFIG_COMPILER=CUDA-10.1.243_XL-2019.08.20_SPMPI-ROLLING -elif [[ $ATDM_CONFIG_BUILD_NAME == *"xl-2019.08.20-spmpi-2019.06.24"* ]] \ - || [[ $ATDM_CONFIG_BUILD_NAME == *"xl-2019.08.20_spmpi-2019.06.24"* ]] \ - || [[ $ATDM_CONFIG_BUILD_NAME == *"xl-2019.08.20"* ]] \ - || [[ $ATDM_CONFIG_BUILD_NAME == *"xl-2019"* ]] \ - || [[ $ATDM_CONFIG_BUILD_NAME == *"xl"* ]] \ +elif atdm_match_any_buildname_keyword \ + xl-2019.08.20-spmpi-rolling \ + xl-2019.08.20_spmpi-rolling \ + xl-2019.08.20 \ + xl-2019 \ + xl \ ; then - export ATDM_CONFIG_COMPILER=XL-2019.08.20_SPMPI-2019.06.24 + echo + echo "ERROR: Currently not supporting xl-2019.08.20-spmpi-rolling" + echo + return + #export ATDM_CONFIG_COMPILER=XL-2019.08.20_SPMPI-ROLLING -elif [[ $ATDM_CONFIG_BUILD_NAME == *"cuda-10.1.243-gnu-7.3.1-spmpi-2019.06.24"* ]] \ - || [[ $ATDM_CONFIG_BUILD_NAME == *"cuda-10.1.243_gnu-7.3.1_spmpi-2019.06.24"* ]] \ - || [[ $ATDM_CONFIG_BUILD_NAME == *"cuda-10.1.243-gnu-7.3.1"* ]] \ - || [[ $ATDM_CONFIG_BUILD_NAME == *"cuda-10.1.243_gnu-7.3.1"* ]] \ - || [[ $ATDM_CONFIG_BUILD_NAME == *"cuda-10.1.243-gnu-7"* ]] \ - || [[ $ATDM_CONFIG_BUILD_NAME == *"cuda-10.1.243_gnu-7"* ]] \ - || [[ $ATDM_CONFIG_BUILD_NAME == *"cuda-10.1.243"* ]] \ - || [[ $ATDM_CONFIG_BUILD_NAME == *"cuda-10"* ]] \ - || [[ $ATDM_CONFIG_BUILD_NAME == *"cuda-gnu"* ]] \ - || [[ $ATDM_CONFIG_BUILD_NAME == *"cuda"* ]] \ +elif atdm_match_any_buildname_keyword \ + cuda-10.1.243-gnu-7.3.1-spmpi-rolling \ + cuda-10.1.243_gnu-7.3.1_spmpi-rolling \ + cuda-10.1.243-gnu-7.3.1 \ + cuda-10.1.243_gnu-7.3.1 \ + cuda-10.1.243-gnu-7 \ + cuda-10.1.243_gnu-7 \ + cuda-10.1.243 \ + cuda-10 \ + cuda-gnu \ + cuda \ ; then - export ATDM_CONFIG_COMPILER=CUDA-10.1.243_GNU-7.3.1_SPMPI-2019.06.24 + export ATDM_CONFIG_COMPILER=CUDA-10.1.243_GNU-7.3.1_SPMPI-ROLLING # NOTE: Default 'cuda' must be last cuda listed! -elif [[ $ATDM_CONFIG_BUILD_NAME == *"gnu-7.3.1-spmpi-2019.06.24"* ]] \ - || [[ $ATDM_CONFIG_BUILD_NAME == *"gnu-7.3.1_spmpi-2019.06.24"* ]] \ - || [[ $ATDM_CONFIG_BUILD_NAME == *"gnu-7.3.1"* ]] \ - || [[ $ATDM_CONFIG_BUILD_NAME == *"gnu-7"* ]] \ - || [[ $ATDM_CONFIG_BUILD_NAME == *"gnu"* ]] \ - || [[ $ATDM_CONFIG_BUILD_NAME == *"default" ]] \ +elif atdm_match_any_buildname_keyword \ + gnu-7.3.1-spmpi-rolling \ + gnu-7.3.1_spmpi-rolling \ + gnu-7.3.1 \ + gnu-7 \ + gnu \ + default \ ; then - export ATDM_CONFIG_COMPILER=GNU-7.3.1_SPMPI-2019.06.24 + export ATDM_CONFIG_COMPILER=GNU-7.3.1_SPMPI-ROLLING # NOTE: Defaut 'gnu' must be last 'gnu' listed! else @@ -56,10 +68,10 @@ else echo "***" echo "*** Supported compilers include:" echo "***" - echo "**** gnu-7.3.1_spmpi-2019.06.24 (default, default gnu)" - echo "**** cuda-10.1.243_gnu-7.3.1_spmpi-2019.06.24 (default cuda)" - echo "**** xl-2019.08.20_spmpi-2019.06.24 (disabled)" - echo "**** cuda-10.1.243-gnu-7.3.1-spmpi-2019.06.24 (disabled)" + echo "**** gnu-7.3.1_spmpi-rolling (default, default gnu)" + echo "**** cuda-10.1.243_gnu-7.3.1_spmpi-rolling (default cuda)" + echo "**** xl-2019.08.20_spmpi-rolling (disabled)" + echo "**** cuda-10.1.243-gnu-7.3.1-spmpi-rolling (disabled)" echo "***" return diff --git a/cmake/std/atdm/ats2/custom_builds_unit_tests.sh b/cmake/std/atdm/ats2/custom_builds_unit_tests.sh new file mode 100755 index 000000000000..c7a9ab7516a1 --- /dev/null +++ b/cmake/std/atdm/ats2/custom_builds_unit_tests.sh @@ -0,0 +1,86 @@ +#!/bin/bash + +CURRENT_SCRIPTS_DIR=`echo $BASH_SOURCE | sed "s/\(.*\)\/.*\.sh/\1/g"` +ATDM_CONFIG_SCRIPT_DIR=`readlink -f ${CURRENT_SCRIPTS_DIR}/..` +ATDM_CONFIG_SYSTEM_DIR=${ATDM_CONFIG_SCRIPT_DIR}/ats2 + +# +# Test compiler parsing +# + +testAll() { + + ATDM_CONFIG_BUILD_NAME=default + . ${ATDM_CONFIG_SCRIPT_DIR}/utils/set_build_options.sh + ${_ASSERT_EQUALS_} GNU-7.3.1_SPMPI-ROLLING ${ATDM_CONFIG_COMPILER} + + ATDM_CONFIG_BUILD_NAME=before_cuda-10.1.243-gnu-7.3.1-spmpi-rolling_after + . ${ATDM_CONFIG_SCRIPT_DIR}/utils/set_build_options.sh + ${_ASSERT_EQUALS_} CUDA-10.1.243_GNU-7.3.1_SPMPI-ROLLING ${ATDM_CONFIG_COMPILER} + + ATDM_CONFIG_BUILD_NAME=before_cuda-10.1.243_gnu-7.3.1_spmpi-rolling_after + . ${ATDM_CONFIG_SCRIPT_DIR}/utils/set_build_options.sh + ${_ASSERT_EQUALS_} CUDA-10.1.243_GNU-7.3.1_SPMPI-ROLLING ${ATDM_CONFIG_COMPILER} + + ATDM_CONFIG_BUILD_NAME=before_cuda-10.1.243-gnu-7.3.1_after + . ${ATDM_CONFIG_SCRIPT_DIR}/utils/set_build_options.sh + ${_ASSERT_EQUALS_} CUDA-10.1.243_GNU-7.3.1_SPMPI-ROLLING ${ATDM_CONFIG_COMPILER} + + ATDM_CONFIG_BUILD_NAME=before_cuda-10.1.243_gnu-7.3.1_after + . ${ATDM_CONFIG_SCRIPT_DIR}/utils/set_build_options.sh + ${_ASSERT_EQUALS_} CUDA-10.1.243_GNU-7.3.1_SPMPI-ROLLING ${ATDM_CONFIG_COMPILER} + + ATDM_CONFIG_BUILD_NAME=before_cuda-10.1.243-gnu-7_after + . ${ATDM_CONFIG_SCRIPT_DIR}/utils/set_build_options.sh + ${_ASSERT_EQUALS_} CUDA-10.1.243_GNU-7.3.1_SPMPI-ROLLING ${ATDM_CONFIG_COMPILER} + + ATDM_CONFIG_BUILD_NAME=before_cuda-10.1.243_gnu-7_after + . ${ATDM_CONFIG_SCRIPT_DIR}/utils/set_build_options.sh + ${_ASSERT_EQUALS_} CUDA-10.1.243_GNU-7.3.1_SPMPI-ROLLING ${ATDM_CONFIG_COMPILER} + + ATDM_CONFIG_BUILD_NAME=before_cuda-10.1.243_after + . ${ATDM_CONFIG_SCRIPT_DIR}/utils/set_build_options.sh + ${_ASSERT_EQUALS_} CUDA-10.1.243_GNU-7.3.1_SPMPI-ROLLING ${ATDM_CONFIG_COMPILER} + + ATDM_CONFIG_BUILD_NAME=before_cuda-10_after + . ${ATDM_CONFIG_SCRIPT_DIR}/utils/set_build_options.sh + ${_ASSERT_EQUALS_} CUDA-10.1.243_GNU-7.3.1_SPMPI-ROLLING ${ATDM_CONFIG_COMPILER} + + ATDM_CONFIG_BUILD_NAME=before_cuda_after + . ${ATDM_CONFIG_SCRIPT_DIR}/utils/set_build_options.sh + ${_ASSERT_EQUALS_} CUDA-10.1.243_GNU-7.3.1_SPMPI-ROLLING ${ATDM_CONFIG_COMPILER} + + ATDM_CONFIG_BUILD_NAME=before_gnu-7.3.1-spmpi-rolling_after + . ${ATDM_CONFIG_SCRIPT_DIR}/utils/set_build_options.sh + ${_ASSERT_EQUALS_} GNU-7.3.1_SPMPI-ROLLING ${ATDM_CONFIG_COMPILER} + + ATDM_CONFIG_BUILD_NAME=before_gnu-7.3.1_spmpi-rolling_after + . ${ATDM_CONFIG_SCRIPT_DIR}/utils/set_build_options.sh + ${_ASSERT_EQUALS_} GNU-7.3.1_SPMPI-ROLLING ${ATDM_CONFIG_COMPILER} + + ATDM_CONFIG_BUILD_NAME=before_gnu-7.3.1_after + . ${ATDM_CONFIG_SCRIPT_DIR}/utils/set_build_options.sh + ${_ASSERT_EQUALS_} GNU-7.3.1_SPMPI-ROLLING ${ATDM_CONFIG_COMPILER} + + ATDM_CONFIG_BUILD_NAME=before_gnu-7_after + . ${ATDM_CONFIG_SCRIPT_DIR}/utils/set_build_options.sh + ${_ASSERT_EQUALS_} GNU-7.3.1_SPMPI-ROLLING ${ATDM_CONFIG_COMPILER} + + ATDM_CONFIG_BUILD_NAME=before_gnu_after + . ${ATDM_CONFIG_SCRIPT_DIR}/utils/set_build_options.sh + ${_ASSERT_EQUALS_} GNU-7.3.1_SPMPI-ROLLING ${ATDM_CONFIG_COMPILER} + + # This should not match anything and should be an error! + ATDM_CONFIG_BUILD_NAME=anything-cudas-after + . ${ATDM_CONFIG_SCRIPT_DIR}/utils/set_build_options.sh + ${_ASSERT_EQUALS_} DEFAULT ${ATDM_CONFIG_COMPILER} + +} + + +# +# Run the unit tests +# + +SHUNIT2_DIR=`readlink -f ${ATDM_CONFIG_SCRIPT_DIR}/../../../commonTools/test/shunit2` +. ${SHUNIT2_DIR}/shunit2 diff --git a/cmake/std/atdm/ats2/environment.sh b/cmake/std/atdm/ats2/environment.sh index dc0cbad72013..68842fcc0c9f 100644 --- a/cmake/std/atdm/ats2/environment.sh +++ b/cmake/std/atdm/ats2/environment.sh @@ -19,7 +19,6 @@ if [[ "$ATDM_CONFIG_COMPILER" == "GNU"* || \ if [[ "$ATDM_CONFIG_KOKKOS_ARCH" == "DEFAULT" || \ "$ATDM_CONFIG_KOKKOS_ARCH" == "Power9" ]] ; then export ATDM_CONFIG_KOKKOS_ARCH=Power9 - sparc_tpl_arch=pwr9 else echo echo "***" @@ -34,7 +33,6 @@ elif [[ "$ATDM_CONFIG_COMPILER" == "CUDA"* ]] ; then "$ATDM_CONFIG_KOKKOS_ARCH" == "Power9" || \ "$ATDM_CONFIG_KOKKOS_ARCH" == "Volta70" ]] ; then export ATDM_CONFIG_KOKKOS_ARCH=Power9,Volta70 - sparc_tpl_arch=v100 else echo echo "***" @@ -69,29 +67,20 @@ else export ATDM_CONFIG_CTEST_PARALLEL_LEVEL=16 fi -# NOTE: We do *NOT* purge the modules first like on other systems because that -# messes up the ATS-2 env. Therefore, it is recommended that the user load a -# new shell and then load one of these envs. +# Purge then load StdEnv to get back to a fresh env in case previous other +# modules were loaded. +module purge --silent +module load StdEnv -# Load common modules for all builds -module load git/2.20.0 -module load cmake/3.14.5 +# Load the sparc-dev/xxx module +sparc_module_name=$(get_sparc_dev_module_name "$ATDM_CONFIG_COMPILER") +module load ${sparc_module_name} -# -# Load compiler modules, TPL modules, and point to SPARC TPL install base dirs -# +# Set up stuff related the the host compiler -if [[ "$ATDM_CONFIG_COMPILER" == *"GNU-7.3.1_SPMPI-2019.06.24" ]]; then - module load gcc/7.3.1 - module load lapack/3.8.0-gcc-4.9.3 +if [[ "$ATDM_CONFIG_COMPILER" == *"GNU"* ]]; then - export CBLAS_ROOT=/usr/tcetmp/packages/lapack/lapack-3.8.0-gcc-4.9.3 - export LAPACK_ROOT=/usr/tcetmp/packages/lapack/lapack-3.8.0-gcc-4.9.3 export COMPILER_ROOT=/usr/tce/packages/gcc/gcc-7.3.1 - export SPARC_HDF5=hdf5-1.10.5 - - # eharvey: TODO: remove COMPILER_ROOT and other unused exports below. - export PATH=${COMPILER_ROOT}/bin:${PATH} export LD_LIBRARY_PATH=${COMPILER_ROOT}/lib:${LD_LIBRARY_PATH} export BINUTILS_ROOT=${COMPILER_ROOT} export LIBRARY_PATH=${BINUTILS_ROOT}/lib @@ -99,61 +88,15 @@ if [[ "$ATDM_CONFIG_COMPILER" == *"GNU-7.3.1_SPMPI-2019.06.24" ]]; then export INCLUDE=${BINUTILS_ROOT}/include:${INCLUDE} export CPATH=${BINUTILS_ROOT}/include:${CPATH} - if [[ "$ATDM_CONFIG_COMPILER" == "CUDA-10.1.243_"* ]]; then - sparc_tpl_ext=ats2-${sparc_tpl_arch}_cuda-10.1.243_gcc-7.3.1 - sparc_tpl_mpi_ext=ats2-${sparc_tpl_arch}_cuda-10.1.243_gcc-7.3.1_spmpi-2019.06.24 - else - sparc_tpl_ext=ats2-${sparc_tpl_arch}_gcc-7.3.1 - sparc_tpl_mpi_ext=ats2-${sparc_tpl_arch}_gcc-7.3.1_spmpi-2019.06.24 - fi - -elif [[ "$ATDM_CONFIG_COMPILER" == *"XL-2019.08.20_SPMPI-2019.06.24_DISABLED" ]]; then - module load xl/2019.08.20 - module load lapack/3.8.0-xl-2019.08.20 - module load gmake/4.2.1 - - # Ninja not available for XL until cmake 3.17.0 - export ATDM_CONFIG_USE_NINJA=OFF - - export CBLAS_ROOT=/usr/tcetmp/packages/lapack/lapack-3.8.0-P9-xl-2019.08.20 - export LAPACK_ROOT=/usr/tcetmp/packages/lapack/lapack-3.8.0-P9-xl-2019.08.20 - export COMPILER_ROOT=/usr/tce/packages/xl/xl-2019.08.20 - export SPARC_HDF5=hdf5-1.8.20 - - # eharvey: TODO: remove COMPILER_ROOT and other exports below. - export PATH=${COMPILER_ROOT}/bin:${PATH} - export LD_LIBRARY_PATH=${COMPILER_ROOT}/lib:${LD_LIBRARY_PATH} - export BINUTILS_ROOT=/usr/tce/packages/gcc/gcc-7.3.1 - export LIBRARY_PATH=${BINUTILS_ROOT}/lib - export LIBRARY_PATH=${CBLAS_ROOT}/lib:${LIBRARY_PATH} - export INCLUDE=${BINUTILS_ROOT}/include:${INCLUDE} - export CPATH=${BINUTILS_ROOT}/include:${CPATH} - - if [[ "$ATDM_CONFIG_COMPILER" == "CUDA-10.1.243_"* ]]; then - export LD_LIBRARY_PATH=${BINUTILS_ROOT}/rh/lib/gcc/ppc64le-redhat-linux/7:${LD_LIBRARY_PATH} - sparc_tpl_ext=ats2-${sparc_tpl_arch}_cuda-10.1.243_xl-2019.08.20 - sparc_tpl_mpi_ext=ats2-${sparc_tpl_arch}_cuda-10.1.243_xl-2019.08.20_spmpi-2019.06.24 - else - sparc_tpl_ext=ats2-${sparc_tpl_arch}_xl-2019.08.20 - sparc_tpl_mpi_ext=ats2-${sparc_tpl_arch}_xl-2019.08.20_spmpi-2019.06.24 - fi - -else - echo - echo "***" - echo "*** ERROR: COMPILER=$ATDM_CONFIG_COMPILER is not supported on this system!" - echo "***" - return +# ToDo: Add support for xl when needed fi -# -# Load module and do other setup for CUDA bulids -# +# Set up stuff related to CUDA -if [[ "$ATDM_CONFIG_COMPILER" == "CUDA-10.1.243_"* ]]; then +if [[ "$ATDM_CONFIG_COMPILER" == "CUDA"* ]]; then - module load cuda/10.1.243 + export CUDA_BIN_PATH=$CUDA_HOME # OpenMPI Settings export OMPI_CXX=${ATDM_CONFIG_NVCC_WRAPPER} @@ -161,13 +104,9 @@ if [[ "$ATDM_CONFIG_COMPILER" == "CUDA-10.1.243_"* ]]; then echo "No nvcc_wrapper found" return fi - export OMPI_CC=`which gcc` - export OMPI_FC=`which gfortran` - export LLNL_USE_OMPI_VARS="y" + # NOTE: The above export overrides the value set by the module load above # CUDA Settings - export CUDA_LAUNCH_BLOCKING=1 - export CUDA_MANAGED_FORCE_DEVICE_ALLOC=1 if [[ ! -d /tmp/${USER} ]] ; then echo "Creating /tmp/${USER} for nvcc wrapper!" mkdir /tmp/${USER} @@ -183,34 +122,24 @@ if [[ "$ATDM_CONFIG_COMPILER" == "CUDA-10.1.243_"* ]]; then export KOKKOS_NUM_DEVICES=4 # CTEST Settings - # Trilinos_CTEST_RUN_CUDA_AWARE_MPI is used by cmake/ctest/driver/atdm/ats2/local-driver.sh + # Trilinos_CTEST_RUN_CUDA_AWARE_MPI is used by ats2/local-driver.sh export Trilinos_CTEST_RUN_CUDA_AWARE_MPI=1 -elif [[ "$ATDM_CONFIG_COMPILER" == "CUDA"* ]]; then - - echo - echo "***" - echo "*** ERROR: CUDA version in COMPILER=$ATDM_CONFIG_COMPILER" - echo "*** is not supported on this system! Only CUDA-10.1.243" - echo "*** is currently supported!" - echo "***" - return - fi # # Final setup for all build configurations # -# Common module - requires compiler to be loaded first -module load spectrum-mpi/2019.06.24 - # Prepend path to ninja after all of the modules are loaded export PATH=/projects/atdm_devops/vortex/ninja-fortran-1.8.2:$PATH -# Prepend path to updated CMake 3.16.5 -module unload cmake/3.14.5 -export PATH=/projects/atdm_devops/vortex/cmake-3.16.5/bin:$PATH +# Prepend path to updated and patched CMake 3.17.2 +module unload cmake +export PATH=/projects/atdm_devops/vortex/cmake-3.17.2/bin:$PATH + +# Set a standard git so everyone has the same git +module load git/2.20.0 # ATDM specific config variables export ATDM_CONFIG_LAPACK_LIBS="-L${LAPACK_ROOT}/lib;-llapack;-lgfortran;-lgomp" @@ -219,28 +148,12 @@ export ATDM_CONFIG_BLAS_LIBS="-L${BLAS_ROOT}/lib;-lblas;-lgfortran;-lgomp;-lm" # NOTE: Invalid libbfd.so requires below for Trilinos to compile export ATDM_CONFIG_BINUTILS_LIBS="${BINUTILS_ROOT}/lib/libbfd.a;-lz;${BINUTILS_ROOT}/lib/libiberty.a" -export ATDM_CONFIG_SPARC_TPL_BASE=/projects/sparc/tpls/ats2-${sparc_tpl_arch} - -sparc_tpl_base=${ATDM_CONFIG_SPARC_TPL_BASE} - -# Commont ROOT config variables -export BOOST_ROOT=${sparc_tpl_base}/boost-1.65.1/00000000/${sparc_tpl_ext} -export HDF5_ROOT=${sparc_tpl_base}/hdf5-1.10.5/00000000/${sparc_tpl_mpi_ext} -export CGNS_ROOT=${sparc_tpl_base}/cgns-c09a5cd/27e5681f1b74c679b5dcb337ac71036d16c47977/${sparc_tpl_mpi_ext} -export PNETCDF_ROOT=${sparc_tpl_base}/pnetcdf-1.10.0/6144dc67b2041e4093063a04e89fc1e33398bd09/${sparc_tpl_mpi_ext} -export NETCDF_ROOT=${sparc_tpl_base}/netcdf-4.7.0/58bc48d95be2cc9272a18488fea52e1be1f0b42a/${sparc_tpl_mpi_ext} -export PARMETIS_ROOT=${sparc_tpl_base}/parmetis-4.0.3/00000000/${sparc_tpl_mpi_ext} -export METIS_ROOT=${sparc_tpl_base}/parmetis-4.0.3/00000000/${sparc_tpl_mpi_ext} -export SUPERLUDIST_ROOT=${sparc_tpl_base}/superlu_dist-5.4.0/a3121eaff44f7bf7d44e625c3b3d2a9911e58876/${sparc_tpl_mpi_ext} - export ATDM_CONFIG_USE_HWLOC=OFF export ATDM_CONFIG_HDF5_LIBS="-L${HDF5_ROOT}/lib;${HDF5_ROOT}/lib/libhdf5_hl.a;${HDF5_ROOT}/lib/libhdf5.a;-lz;-ldl" export ATDM_CONFIG_NETCDF_LIBS="-L${NETCDF_ROOT}/lib;${NETCDF_ROOT}/lib/libnetcdf.a;${PNETCDF_ROOT}/lib/libpnetcdf.a;${ATDM_CONFIG_HDF5_LIBS};-lcurl" -if [[ "${ATDM_CONFIG_SUPERLUDIST_INCLUDE_DIRS}" == "" ]] ; then - export ATDM_CONFIG_SUPERLUDIST_INCLUDE_DIRS=${SUPERLUDIST_ROOT}/include - export ATDM_CONFIG_SUPERLUDIST_LIBS="${SUPERLUDIST_ROOT}/lib64/libsuperlu_dist.a" -fi +export ATDM_CONFIG_SUPERLUDIST_INCLUDE_DIRS=${SUPERLUDIST_ROOT}/include +export ATDM_CONFIG_SUPERLUDIST_LIBS="${SUPERLUDIST_ROOT}/lib64/libsuperlu_dist.a" # Set common MPI wrappers export MPICC=`which mpicc` @@ -252,13 +165,6 @@ export ATDM_CONFIG_MPI_EXEC=${ATDM_SCRIPT_DIR}/ats2/trilinos_jsrun export ATDM_CONFIG_MPI_POST_FLAGS="--rs_per_socket;4" export ATDM_CONFIG_MPI_EXEC_NUMPROCS_FLAG="-p" -# Set common default compilers -export CC=mpicc -export CXX=mpicxx -export F77=mpifort -export FC=mpifort -export F90=mpifort - # System-info for what ATS-2 system we are using if [[ "${ATDM_CONFIG_KNOWN_HOSTNAME}" == "vortex" ]] ; then export ATDM_CONFIG_ATS2_LOGIN_NODE=vortex60 diff --git a/cmake/std/atdm/ats2/trilinos_jsrun b/cmake/std/atdm/ats2/trilinos_jsrun index 454e9f6855a7..fbc79e2d134a 100755 --- a/cmake/std/atdm/ats2/trilinos_jsrun +++ b/cmake/std/atdm/ats2/trilinos_jsrun @@ -40,62 +40,69 @@ function debug_print { } ################################################################################ -# @brief: Hack around JSM server error "Error: Remote JSM server is not -# responding" +# @brief: Evaluate the jsrun command and return the jsrun return value. # This function assumes that "args" has been initialized -# @return void +# @return the jsrun return value ################################################################################ function evaluate_jsrun_command { local jsrun_ret - local out_file - local retry - local grep_status + #local out_file + #local retry + #local grep_status - # Create process ID specific output file - # Instead of attempting to find the test name in $@, let's use - # the hash of the test command to avoid race conditions. - out_file=$(printf "'%s' " "${args[@]}" | md5sum | awk '{print $1".out"}') + # Use the hash of the test name and arguments as the output file. This still + # causes race conditions among tests as some tests run the same exe with the + # same arguments but post to a different ctest test names. We need the ctest + # test name in the environment. + #out_file=$(printf "'%s' " "${args[@]}" | md5sum | awk '{print $1".out"}') + #out_file="$CTEST_TEST_NAME"."$out_file" if [ "$ECHO_CMD" == "1" ]; then echo "BEFORE: jsrun " $(printf "'%s' " "${orig_args[@]}") - echo "AFTER: export TPETRA_ASSUME_CUDA_AWARE_MPI=${TPETRA_ASSUME_CUDA_AWARE_MPI}; jsrun " $(printf "'%s' " "${args[@]}") + echo "AFTER: export TPETRA_ASSUME_CUDA_AWARE_MPI=${TPETRA_ASSUME_CUDA_AWARE_MPI}; jsrun " \ + $(printf "'%s' " "${args[@]}") fi # Set retry, assume JSRUN_WRAPPER_NUM_RETRIES is valid if set - if [[ ! "$JSRUN_WRAPPER_NUM_RETRIES" == "" ]]; then - retry=${JSRUN_WRAPPER_NUM_RETRIES} - else - retry=3 - fi - grep_status=0 + #if [[ ! "$JSRUN_WRAPPER_NUM_RETRIES" == "" ]]; then + # retry=${JSRUN_WRAPPER_NUM_RETRIES} + #else + # retry=3 + #fi + #grep_status=0 # Retry jsrun command until retry is exhausted or JSM server error is not found - while [[ $grep_status -eq 0 && $retry -ne 0 ]]; do + #while [[ $grep_status -eq 0 && $retry -ne 0 ]]; do # Evaluate the command passed in and redirect all output - eval jsrun $(printf "'%s' " "${args[@]}") &> $out_file - jsrun_ret=$? + #eval jsrun $(printf "'%s' " "${args[@]}") &> $out_file + #jsrun_ret=$? - grep 'Error: Remote JSM server is not responding' $out_file &> /dev/null - grep_status=$? + #grep 'Error: Remote JSM server is not responding' $out_file &> /dev/null + #grep_status=$? # Sleep for a few seconds before retrying the test. - if [[ $grep_status -eq 0 && $retry -ne 1 ]]; then - sleep 3 - fi - - retry=$((retry-1)) - done - - if [ "$ECHO_CMD" == "1" ]; then - echo "out_file=$out_file" - fi - cat $out_file - rm $out_file + #if [[ $grep_status -eq 0 && $retry -ne 1 ]]; then + # sleep 3 + #fi + + #retry=$((retry-1)) + #done + + #if [ "$ECHO_CMD" == "1" ]; then + # echo "out_file=$out_file" + #fi + #cat $out_file + #rm $out_file + eval jsrun $(printf "'%s' " "${args[@]}") + jsrun_ret=$? + echo "jsrun return value: ${jsrun_ret}" return $jsrun_ret } # Check if TPETRA_ASSUME_CUDA_AWARE_MPI is set and default to 0 if unset. -if [[ "$TPETRA_ASSUME_CUDA_AWARE_MPI" != "0" ]] && [[ "$TPETRA_ASSUME_CUDA_AWARE_MPI" != "1" ]]; then +if [[ "$TPETRA_ASSUME_CUDA_AWARE_MPI" != "0" ]] && \ + [[ "$TPETRA_ASSUME_CUDA_AWARE_MPI" != "1" ]] \ + ; then echo "WARNING, you have not set TPETRA_ASSUME_CUDA_AWARE_MPI=0 or 1, defaulting to TPETRA_ASSUME_CUDA_AWARE_MPI=0" export TPETRA_ASSUME_CUDA_AWARE_MPI=0 fi @@ -155,7 +162,8 @@ if [ "$np_is_one" == "true" ]; then if [ "$arg" == "-M" ]; then debug_print "arg=$arg, found -M, prepending -disable_gpu_hooks" ip1=$(($i+1)); - # single quotes matter, as the argument to -M needs to be all args originally quoted to it + # single quotes matter, as the argument to -M needs to be all args + # originally quoted to it args[${ip1}]="-disable_gpu_hooks ${args[${ip1}]}" debug_print "updated arg = ${args[${ip1}]}" added_disable="true" @@ -184,7 +192,8 @@ if [[ "$TPETRA_ASSUME_CUDA_AWARE_MPI" == "1" ]] && [[ "$np_is_one" == "false" ]] if [ "$arg" == "-M" ]; then debug_print "arg=$arg, found -M, prepending -gpu" ip1=$(($i+1)); - # single quotes matter, as the argument to -M needs to be all args originally quoted to it + # single quotes matter, as the argument to -M needs to be all args + # originally quoted to it args[${ip1}]="-gpu ${args[${ip1}]}" added_arg="true" break diff --git a/cmake/std/atdm/ats2/tweaks/Tweaks.cmake b/cmake/std/atdm/ats2/tweaks/Tweaks.cmake index ebc8f6e42061..f707b9fd1dbe 100644 --- a/cmake/std/atdm/ats2/tweaks/Tweaks.cmake +++ b/cmake/std/atdm/ats2/tweaks/Tweaks.cmake @@ -1,3 +1,11 @@ +# +# Set up to limit running on GPUs +# + +ATDM_SET_CACHE(Trilinos_AUTOGENERATE_TEST_RESOURCE_FILE ON CACHE BOOL) +ATDM_SET_CACHE(Trilinos_CUDA_NUM_GPUS 4 CACHE STRING) +ATDM_SET_CACHE(Trilinos_CUDA_SLOTS_PER_GPU 2 CACHE STRING) + # # Disables across multiple builds on 'ats2' # diff --git a/cmake/std/atdm/cee-rhel6/custom_builds_unit_tests.sh b/cmake/std/atdm/cee-rhel6/custom_builds_unit_tests.sh index 4d2625229255..e012085aa1cc 100755 --- a/cmake/std/atdm/cee-rhel6/custom_builds_unit_tests.sh +++ b/cmake/std/atdm/cee-rhel6/custom_builds_unit_tests.sh @@ -132,4 +132,5 @@ testAll() { # Run the unit tests # -. ${ATDM_CONFIG_SCRIPT_DIR}/test/shunit2/shunit2 +SHUNIT2_DIR=`readlink -f ${ATDM_CONFIG_SCRIPT_DIR}/../../../commonTools/test/shunit2` +. ${SHUNIT2_DIR}/shunit2 diff --git a/cmake/std/atdm/test/unit_tests/atdm_match_any_keyword_unit_tests.sh b/cmake/std/atdm/test/unit_tests/atdm_match_any_keyword_unit_tests.sh index d0d60754980c..fd2a394c58cb 100755 --- a/cmake/std/atdm/test/unit_tests/atdm_match_any_keyword_unit_tests.sh +++ b/cmake/std/atdm/test/unit_tests/atdm_match_any_keyword_unit_tests.sh @@ -38,4 +38,5 @@ testMatch_1() { # Run the unit tests # -. ${ATDM_CONFIG_SCRIPT_DIR}/test/shunit2/shunit2 +SHUNIT2_DIR=`readlink -f ${ATDM_CONFIG_SCRIPT_DIR}/../../../commonTools/test/shunit2` +. ${SHUNIT2_DIR}/shunit2 diff --git a/cmake/std/atdm/test/unit_tests/atdm_match_keyword_unit_tests.sh b/cmake/std/atdm/test/unit_tests/atdm_match_keyword_unit_tests.sh index 53c15fe7472f..be87afe19432 100755 --- a/cmake/std/atdm/test/unit_tests/atdm_match_keyword_unit_tests.sh +++ b/cmake/std/atdm/test/unit_tests/atdm_match_keyword_unit_tests.sh @@ -65,4 +65,5 @@ testBasicMatches() { # Run the unit tests # -. ${ATDM_CONFIG_SCRIPT_DIR}/test/shunit2/shunit2 +SHUNIT2_DIR=`readlink -f ${ATDM_CONFIG_SCRIPT_DIR}/../../../commonTools/test/shunit2` +. ${SHUNIT2_DIR}/shunit2 diff --git a/cmake/std/atdm/test/unit_tests/set_build_options_unit_tests.sh b/cmake/std/atdm/test/unit_tests/set_build_options_unit_tests.sh index 2384a6bcee22..e377c48fea2b 100755 --- a/cmake/std/atdm/test/unit_tests/set_build_options_unit_tests.sh +++ b/cmake/std/atdm/test/unit_tests/set_build_options_unit_tests.sh @@ -477,4 +477,5 @@ testPrimaryTested() { # Run the unit tests # -. ${ATDM_CONFIG_SCRIPT_DIR}/test/shunit2/shunit2 +SHUNIT2_DIR=`readlink -f ${ATDM_CONFIG_SCRIPT_DIR}/../../../commonTools/test/shunit2` +. ${SHUNIT2_DIR}/shunit2 diff --git a/cmake/std/atdm/utils/ATDMDevEnvUtils.cmake b/cmake/std/atdm/utils/ATDMDevEnvUtils.cmake index a996548b4371..8c233957e3c9 100644 --- a/cmake/std/atdm/utils/ATDMDevEnvUtils.cmake +++ b/cmake/std/atdm/utils/ATDMDevEnvUtils.cmake @@ -1,5 +1,10 @@ # # ATDM_SET_CACHE( CACHE ) +# +# This silently sets a cache var (but will be verbose if +# ATDM_CONFIG_VERBOSE_DEBUG=ON). However, this set statement will only change +# anything if the cache var is not already set. + # MACRO(ATDM_SET_CACHE VAR_NAME DEFAULT_VAL CACHE_STR DATA_TYPE) IF (ATDM_CONFIG_VERBOSE_DEBUG) @@ -12,6 +17,10 @@ ENDMACRO() # # ATDM_SET_CACHE_FORCE( CACHE ) # +# This silently force sets a cache var (but will be verbose if +# ATDM_CONFIG_VERBOSE_DEBUG=ON. This will override any existing value that is +# currently set in the cache. +# MACRO(ATDM_SET_CACHE_FORCE VAR_NAME DEFAULT_VAL CACHE_STR DATA_TYPE) IF (ATDM_CONFIG_VERBOSE_DEBUG) MESSAGE("-- SET(${VAR_NAME} \"${DEFAULT_VAL}\" ${CACHE_STR} ${DATA_TYPE} FORCE)") @@ -20,6 +29,15 @@ MACRO(ATDM_SET_CACHE_FORCE VAR_NAME DEFAULT_VAL CACHE_STR DATA_TYPE) "Set in ${CMAKE_CURRENT_LIST_FILE}" FORCE) ENDMACRO() +# +# ATDM_SET_ENABLE( ) +# +# This is most appropriate for enable vars that can have an unspecified empty +# state "" and we only wnat to set this default if has an empty state. +# +# This also prints a message about the default value being set but will always +# print the final value if `ATDM_CONFIG_VERBOSE_DEBUG` is set to `TRUE`. +# MACRO(ATDM_SET_ENABLE VAR_NAME VAR_DEFAULT) IF ("${${VAR_NAME}}" STREQUAL "") MESSAGE("-- " "Setting default ${VAR_NAME}=${VAR_DEFAULT}") @@ -31,8 +49,15 @@ MACRO(ATDM_SET_ENABLE VAR_NAME VAR_DEFAULT) ENDIF() ENDMACRO() +# +# ATDM_SET_ATDM_VAR_FROM_ENV_AND_DEFAULT( ) +# # Sets the var 'ATDM_${VAR_BASE_NAME}' from # '$ENV{ATDM_CONFIG_${VAR_BASE_NAME}}' or if not set gives a default. +# +# This does **Not** set a cache var. It only sets a local var with a devalue +# value that can be overrridden as an env var. +# MACRO(ATDM_SET_ATDM_VAR_FROM_ENV_AND_DEFAULT VAR_BASE_NAME VAR_DEFAULT_VAL) SET(ATDM_${VAR_BASE_NAME} "$ENV{ATDM_CONFIG_${VAR_BASE_NAME}}") IF ("${ATDM_${VAR_BASE_NAME}}" STREQUAL "") @@ -43,3 +68,5 @@ MACRO(ATDM_SET_ATDM_VAR_FROM_ENV_AND_DEFAULT VAR_BASE_NAME VAR_DEFAULT_VAL) ENDIF() ENDMACRO() + + diff --git a/cmake/std/atdm/utils/atdm_config_helper_funcs.sh b/cmake/std/atdm/utils/atdm_config_helper_funcs.sh index b4aecdc5ba81..bd01e9575060 100644 --- a/cmake/std/atdm/utils/atdm_config_helper_funcs.sh +++ b/cmake/std/atdm/utils/atdm_config_helper_funcs.sh @@ -51,3 +51,17 @@ function atdm_config_add_libs_to_var { unset export_env_var_name } + + +# +# Get the standard name of the sparc-dev module for a standard-named +# ATDM_CONFIG_COMPILER var. +# +function get_sparc_dev_module_name() { + atdm_config_compiler=$1 + sparc_module_name=sparc-dev/$(echo "$ATDM_CONFIG_COMPILER" | tr '[:upper:]' '[:lower:]' | sed 's|/gnu-|/gcc-|g') + #echo "sparc_module_name = '${sparc_module_name}'" + sparc_module_name=$(echo "$sparc_module_name" | sed 's|gnu-|gcc-|g') + #echo "sparc_module_name = '${sparc_module_name}'" + echo "${sparc_module_name}" +} diff --git a/cmake/std/atdm/utils/define_sparc_dev_module_name.sh b/cmake/std/atdm/utils/define_sparc_dev_module_name.sh new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/cmake/std/atdm/utils/unset_atdm_config_vars_environment.sh b/cmake/std/atdm/utils/unset_atdm_config_vars_environment.sh index 551b8ccae4c7..5fcc525495ff 100644 --- a/cmake/std/atdm/utils/unset_atdm_config_vars_environment.sh +++ b/cmake/std/atdm/utils/unset_atdm_config_vars_environment.sh @@ -54,9 +54,7 @@ unset ATDM_CONFIG_SBATCH_DEFAULT_TIMEOUT unset ATDM_CONFIG_SBATCH_DEFAULT_ACCOUNT unset atdm_run_script_on_compute_node unset ATDM_CONFIG_COMPLETED_ENV_SETUP -unset ATDM_CONFIG_Kokkos_ENABLE_Serial -unset ATDM_CONFIG_Kokkos_ENABLE_Cuda -unset ATDM_CONFIG_Kokkos_ENABLE_Deprecated_Code +unset ATDM_CONFIG_Kokkos_ENABLE_SERIAL unset ATDM_CONFIG_MPI_EXEC_NUMPROCS_FLAG unset atdm_run_script_on_compute_node unset ATDM_CONFIG_Trilinos_LINK_SEARCH_START_STATIC diff --git a/cmake/std/atdm/van1-tx2/custom_builds_unit_tests.sh b/cmake/std/atdm/van1-tx2/custom_builds_unit_tests.sh index 35b562c2c7fe..78fb6def891b 100755 --- a/cmake/std/atdm/van1-tx2/custom_builds_unit_tests.sh +++ b/cmake/std/atdm/van1-tx2/custom_builds_unit_tests.sh @@ -52,4 +52,5 @@ testAll() { # Run the unit tests # -. ${ATDM_CONFIG_SCRIPT_DIR}/test/shunit2/shunit2 +SHUNIT2_DIR=`readlink -f ${ATDM_CONFIG_SCRIPT_DIR}/../../../commonTools/test/shunit2` +. ${SHUNIT2_DIR}/shunit2 diff --git a/cmake/std/unittests/TestPullRequestLinuxDriverTest.py b/cmake/std/unittests/TestPullRequestLinuxDriverTest.py index 6c032110c769..c0320458cbb0 100755 --- a/cmake/std/unittests/TestPullRequestLinuxDriverTest.py +++ b/cmake/std/unittests/TestPullRequestLinuxDriverTest.py @@ -207,6 +207,7 @@ def test_verifyTargetBranch_passes_with_master_target_mm_source(self): l_environ, \ mock.patch('PullRequestLinuxDriverTest.createPackageEnables'), \ mock.patch('PullRequestLinuxDriverTest.setBuildEnviron'), \ + mock.patch('PullRequestLinuxDriverTest.compute_n', return_value=20), \ mock.patch('PullRequestLinuxDriverTest.getCDashTrack') as m_cdtr: PullRequestLinuxDriverTest.run() @@ -222,7 +223,7 @@ def test_verifyTargetBranch_passes_with_master_target_mm_source(self): '-Dbuild_dir=/dev/null/workspace/pull_request_test', '-Dconfigure_script=/dev/null/workspace/Trilinos/cmake/std/dummyConfig.cmake', '-Dpackage_enables=../packageEnables.cmake', - '-Dsubprojects_file=../TFW_single_configure_support_scripts/package_subproject_list.cmake']) + '-Dsubprojects_file=../package_subproject_list.cmake']) def test_verifyTargetBranch_passes_with_develop_target(self): @@ -291,7 +292,7 @@ def test_verifyTargetBranch_passes_with_develop_target(self): '-Dbuild_dir=/dev/null/workspace/pull_request_test', '-Dconfigure_script=/dev/null/workspace/Trilinos/cmake/std/dummyConfig.cmake', '-Dpackage_enables=../packageEnables.cmake', - '-Dsubprojects_file=../TFW_single_configure_support_scripts/package_subproject_list.cmake']) + '-Dsubprojects_file=../package_subproject_list.cmake']) @@ -319,14 +320,16 @@ def setUp(self): def success_side_effect(self): with open('packageEnables.cmake', 'w') as f_out: - f_out.write(''' -MACRO(PR_ENABLE_BOOL VAR_NAME VAR_VAL) - MESSAGE("-- Setting ${VAR_NAME} = ${VAR_VAL}") - SET(${VAR_NAME} ${VAR_VAL} CACHE BOOL "Set in $CMAKE_PACKAGE_ENABLES_OUT") -ENDMACRO() -''') + f_out.write(dedent('''\ + MACRO(PR_ENABLE_BOOL VAR_NAME VAR_VAL) + MESSAGE("-- Setting ${VAR_NAME} = ${VAR_VAL}") + SET(${VAR_NAME} ${VAR_VAL} CACHE BOOL "Set in $CMAKE_PACKAGE_ENABLES_OUT") + ENDMACRO() + ''')) f_out.write("PR_ENABLE_BOOL(Trilinos_ENABLE_FooPackageBar ON)") - + with open ('package_subproject_list.cmake', 'w') as f_out: + f_out.write(dedent('''\ + set(CTEST_LABELS_FOR_SUBPROJECTS TrilinosFrameworkTests ''')) def test_call_success(self): expected_output = '''Enabled packages: @@ -345,9 +348,11 @@ def test_call_success(self): 'get-changed-trilinos-packages.sh'), os.path.join('origin', self.target_branch), - 'HEAD', 'packageEnables.cmake']) + 'HEAD', 'packageEnables.cmake', + 'package_subproject_list.cmake']) self.assertEqual(expected_output, m_stdout.getvalue()) os.unlink('packageEnables.cmake') + os.unlink('package_subproject_list.cmake') def test_call_python2(self): @@ -365,6 +370,7 @@ def test_call_python2(self): m_out.assert_not_called() self.assertEqual(expected_output, m_stdout.getvalue()) os.unlink('packageEnables.cmake') + os.unlink('package_subproject_list.cmake') def test_call_failure(self): @@ -383,7 +389,8 @@ def test_call_failure(self): 'get-changed-trilinos-packages.sh'), os.path.join('origin', self.target_branch), - 'HEAD', 'packageEnables.cmake']) + 'HEAD', 'packageEnables.cmake', + 'package_subproject_list.cmake']) self.assertEqual(expected_output, m_stdout.getvalue()) diff --git a/cmake/tribits/ci_support/TribitsDependencies.py b/cmake/tribits/ci_support/TribitsDependencies.py index 964fd24642ca..f6ff47b6c6b0 100644 --- a/cmake/tribits/ci_support/TribitsDependencies.py +++ b/cmake/tribits/ci_support/TribitsDependencies.py @@ -47,7 +47,6 @@ from FindGeneralScriptSupport import * from GeneralScriptSupport import * - # # Default file locations # @@ -242,6 +241,22 @@ def numPackages(self): return len(self.__packagesList) + def getPackagesNamesList(self, onlyTopLevelPackages=True): + packagesNamesList = [] + for packageDep in self.__packagesList: + #print ("packageDep.packageName = "+packageDep.packageName) + #print ("packageDep.parentPackage = "+packageDep.parentPackage) + if packageDep.parentPackage == "": + addPackage = True + elif not onlyTopLevelPackages: + addPackage = True + else: + addPackage = False + if addPackage: + packagesNamesList.append(packageDep.packageName) + return packagesNamesList + + def packageNameToID(self, packageName): return self.__packagesNameToID.get(packageName, -1) @@ -262,6 +277,7 @@ def getPackageByDir(self, packageDir): return None + # Note: Path must contain ending "/" def getPackageNameFromPath(self, fullPath): for packageDep in self.__packagesList: regexFilePath = packageDep.packageDir+"/" @@ -275,6 +291,7 @@ def getPackageNameFromPath(self, fullPath): # packages because subpackages are listed before packages! + # Returns the paraent package name given a test name def getPackageNameFromTestName(self, testName): for packageDep in self.__packagesList: startTestName = packageDep.packageName+"_" diff --git a/cmake/tribits/ci_support/get-tribits-packages.py b/cmake/tribits/ci_support/get-tribits-packages.py new file mode 100755 index 000000000000..0c3c77fd57aa --- /dev/null +++ b/cmake/tribits/ci_support/get-tribits-packages.py @@ -0,0 +1,86 @@ +#!/usr/bin/env python + +# @HEADER +# ************************************************************************ +# +# TriBITS: Tribal Build, Integrate, and Test System +# Copyright 2013 Sandia Corporation +# +# Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation, +# the U.S. Government retains certain rights in this software. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are +# met: +# +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the Corporation nor the names of the +# contributors may be used to endorse or promote products derived from +# this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY SANDIA CORPORATION "AS IS" AND ANY +# EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL SANDIA CORPORATION OR THE +# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +# EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +# PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +# LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +# NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +# ************************************************************************ +# @HEADER + +from FindGeneralScriptSupport import * +from TribitsPackageFilePathUtils import * +from gitdist import addOptionParserChoiceOption + + +# +# Read in the commandline arguments +# + +usageHelp = \ +r"""get-tribits-packages.py --deps-xml-file= \ + --only-top-level-packages=[on|off] + +This script returns a comma-separated list of all of the project's top-level +or packages or the full set of SE packages (i.e. parent and subpackages). +""" + +from optparse import OptionParser + +clp = OptionParser(usage=usageHelp) + +clp.add_option( + "--deps-xml-file", dest="depsXmlFile", type="string", + help="File containing TriBITS-generated XML data-structure the listing"+\ + " of packages, dir names, dependencies, etc.") + +addOptionParserChoiceOption( + "--only-top-level-packages", "onlyTopLevelPackagesStr", + ("on", "off"), 0, + "If 'on', then only top-level packages will be included. If 'off', then"+\ + " top-level and subpackages will be included in the list (in order).", + clp ) + +(options, args) = clp.parse_args() + +if options.onlyTopLevelPackagesStr == "on": + onlyTopLevelPackages = True +else: + onlyTopLevelPackages = False + +trilinosDependencies = getProjectDependenciesFromXmlFile(options.depsXmlFile) + +packagesNamesList = trilinosDependencies.getPackagesNamesList(onlyTopLevelPackages) + +print(','.join(packagesNamesList)) diff --git a/commonTools/framework/CMakeLists.txt b/commonTools/framework/CMakeLists.txt index ea75d1609f2f..620c9135828f 100644 --- a/commonTools/framework/CMakeLists.txt +++ b/commonTools/framework/CMakeLists.txt @@ -7,6 +7,17 @@ TRIBITS_ADD_ADVANCED_TEST( ProjectCiFileChangeLogic_UnitTests TEST_0 CMND ${PYTHON_EXECUTABLE} ARGS ${CMAKE_CURRENT_SOURCE_DIR}/ProjectCiFileChangeLogic_UnitTests.py -v PASS_REGULAR_EXPRESSION "OK" + ALWAYS_FAIL_ON_NONZERO_RETURN + ) + + +TRIBITS_ADD_ADVANCED_TEST( get-changed-trilinos-packages-helpers-unit-tests + OVERALL_WORKING_DIRECTORY TEST_NAME + OVERALL_NUM_MPI_PROCS 1 + TEST_0 CMND + "${CMAKE_CURRENT_SOURCE_DIR}/get-changed-trilinos-packages-helpers-unit-tests.sh" + PASS_REGULAR_EXPRESSION "OK" + ALWAYS_FAIL_ON_NONZERO_RETURN ) @@ -63,8 +74,9 @@ TRIBITS_ADD_ADVANCED_TEST( PullRequestLinuxDriverTest_UnitTests FUNCTION(create_get_changed_trilinos_packages_test TEST_POSTFIX FILES_CHANGED CHANGED_PACKAGES_FULL_LIST - CHANGED_PACKAGES_PT_LIST + CHANGED_PACKAGES_ST_LIST EXPECTED_ENABLES_REGEX + EXPECTED_CTEST_LABELS_FOR_SUBPROJECTS_REGEX ) SET(TEST_NAME "get_changed_trilinos_packages_test_${TEST_POSTFIX}") @@ -99,38 +111,68 @@ MOCK_PROGRAM_OUTPUT: ${FILES_CHANGED} TEST_1 MESSAGE "Run get-changed-trilinos-packages.sh with mock git" CMND "${CMAKE_CURRENT_SOURCE_DIR}/get-changed-trilinos-packages.sh" - ARGS sha1-from sha1-to packagesToEnable.cmake + ARGS sha1-from sha1-to packagesToEnable.cmake package_subproject_list.cmake PASS_REGULAR_EXPRESSION_ALL "CHANGED_PACKAGES_FULL_LIST='${CHANGED_PACKAGES_FULL_LIST}'" - "CHANGED_PACKAGES_PT_LIST='${CHANGED_PACKAGES_PT_LIST}'" + "CHANGED_PACKAGES_ST_LIST='${CHANGED_PACKAGES_ST_LIST}'" TEST_2 CMND ${CMAKE_COMMAND} ARGS -P packagesToEnable.cmake PASS_REGULAR_EXPRESSION_ALL "${EXPECTED_ENABLES_REGEX}" + TEST_3 CMND cat + ARGS package_subproject_list.cmake + PASS_REGULAR_EXPRESSION_ALL + "set[(]CTEST_LABELS_FOR_SUBPROJECTS ${EXPECTED_CTEST_LABELS_FOR_SUBPROJECTS_REGEX}[)]" + ) ENDFUNCTION() +set(ALL_TOPLEVEL_PACKAGES_REGEX + "TrilinosFrameworkTests TrilinosATDMConfigTests .*Kokkos Teuchos KokkosKernels .*EpetraExt Tpetra .*Domi Thyra .*SEACAS .*Teko Intrepid .*MueLu .*ShyLU_DD ShyLU .*Tempus Stokhos ROL Piro Panzer Adelus TrilinosCouplings Pike") + + create_get_changed_trilinos_packages_test(ProjectsList_TeuchosCore "ProjectsList.cmake\npackages/teuchos/core/CMakeLists.txt" "ALL_PACKAGES,TeuchosCore" "ALL_PACKAGES,TeuchosCore" "Setting Trilinos_ENABLE_ALL_PACKAGES = ON;Setting Trilinos_ENABLE_TeuchosCore = ON" + "${ALL_TOPLEVEL_PACKAGES_REGEX}" ) # The above test ensures that it can detect global build files as well as - # package files. + # package files. Above, we check several of the parent packages in Trilinos + # and we want to ensure that no subpackages are listed in the array + # CTEST_LABELS_FOR_SUBPROJECTS. We also check to confirm that excluded + # packages TriKota and PyTrilinos are excluded. To do that, we list non EX + # packages before and after them as they currently appear in the + # Trilinos/PackagesList.cmake file. If the PackagesList.cmake file changes, + # then this test may have to change to accomidate that. Therefore, we don't + # want to list too many packages above in the regex. + + +create_get_changed_trilinos_packages_test(cmake_std_atdm_TeuchosCore_PyTrilinos_Pliris + "cmake/std/atdm/anything\npackages/teuchos/core/CMakeLists.txt\npackages/PyTrilinos/anything\npackages/pliris/CMakeLists.txt" + "TrilinosATDMConfigTests,TeuchosCore,PyTrilinos,Pliris" + "TrilinosATDMConfigTests,TeuchosCore,Pliris" + "Setting Trilinos_ENABLE_TrilinosATDMConfigTests = ON;Setting Trilinos_ENABLE_TeuchosCore = ON;Setting Trilinos_ENABLE_Pliris = ON" + "${ALL_TOPLEVEL_PACKAGES_REGEX}" + ) + # The above test ensures that cmake/std/atdm/ changes don't trigger global + # builds and it makes sure that PT (TeuchosCore) and ST packages (Pliris) do + # get enabled (but excluded ST package PyTrilinos does not get included). -create_get_changed_trilinos_packages_test(cmake_std_atdm_TeuchosCore_PyTrilinos - "cmake/std/atdm/anything\npackages/teuchos/core/CMakeLists.txt\npackages/PyTrilinos/anything" - "TrilinosATDMConfigTests,TeuchosCore,PyTrilinos" - "TrilinosATDMConfigTests,TeuchosCore" - "Setting Trilinos_ENABLE_TeuchosCore = ON" +create_get_changed_trilinos_packages_test(TeuchosCore_TriKota_NewPackage_Pliris + "packages/teuchos/core/CMakeLists.txt\npackages/TriKota/anything\npackages/new_package/anything\npackages/pliris/a.txt" + "TeuchosCore,TriKota,NewPackage,Pliris" + "TeuchosCore,Pliris" + "Setting Trilinos_ENABLE_TeuchosCore = ON;Setting Trilinos_ENABLE_Pliris = ON" + "${ALL_TOPLEVEL_PACKAGES_REGEX}" ) - # The above test ensures that cmake/std/atdm/ changes don't trigger global - # builds and it makes sure that ST packages (PyTrilinos) don't get enabled. + # The above test ensures PT (TeuchosCore) and ST packages (Piro) do get + # enabled but EX packages (NewPackage) don't. create_get_changed_trilinos_packages_test(cmake_std_atdm @@ -138,10 +180,29 @@ create_get_changed_trilinos_packages_test(cmake_std_atdm "TrilinosATDMConfigTests" "TrilinosATDMConfigTests" "Setting Trilinos_ENABLE_TrilinosATDMConfigTests = ON" + "${ALL_TOPLEVEL_PACKAGES_REGEX}" ) # The above test ensures changes to just cmake/std/atdm/ triggers the enable # of only the TrilinosATDMConfigTests package and does not trigger the # enable of every package. +create_get_changed_trilinos_packages_test(ShyLU_NodeHTS + "packages/shylu/shylu_node/hts/test/CMakeLists.txt" + "ShyLU_NodeHTS" + "ShyLU_NodeHTS" + "Setting Trilinos_ENABLE_ShyLU_NodeHTS = ON" + "${ALL_TOPLEVEL_PACKAGES_REGEX}" + ) + # The above test ensures changes to packages/shylu/shylu_node/hts/ trigger + # testing of the ST ShyLU_NodeST subpackage. (This will cause PRs like + # #7229 to actually test code.) + + +# NOTE: Above, currently every top-level package is listed as a CDash +# subproject. Once we can implement TriBITS forward-package logic, then the +# above tests will be checking a subset of packages. + + + TRIBITS_PACKAGE_POSTPROCESS() diff --git a/commonTools/framework/get-changed-trilinos-packages-helpers-unit-tests.sh b/commonTools/framework/get-changed-trilinos-packages-helpers-unit-tests.sh new file mode 100755 index 000000000000..c3548fed4425 --- /dev/null +++ b/commonTools/framework/get-changed-trilinos-packages-helpers-unit-tests.sh @@ -0,0 +1,155 @@ +#!/bin/bash + +CURRENT_SCRIPTS_DIR=`echo $BASH_SOURCE | sed "s/\(.*\)\/.*\.sh/\1/g"` + +source ${CURRENT_SCRIPTS_DIR}/get-changed-trilinos-packages-helpers.sh + +# +# Unit tests +# + +test_comma_list_to_list() { + + list=$(comma_list_to_list "a") + assertEquals "${list}" "a" + + list=$(comma_list_to_list "aaa,bbb,ccc") + assertEquals "${list}" "aaa bbb ccc" + +} + + +test_list_to_comma_list() { + + comma_list=$(list_to_comma_list "a") + assertEquals "${comma_list}" "a" + + comma_list=$(list_to_comma_list "aaa bbb ccc") + assertEquals "${comma_list}" "aaa,bbb,ccc" + +} + + +test_list_contains_ele() { + + list_contains_ele "aaa" "aaa bbb ccc" + ${_ASSERT_EQUALS_} $? 0 + + list_contains_ele "aa" "aaa bbb ccc" + ${_ASSERT_EQUALS_} $? 1 + + list_contains_ele "bbb" "aaa bbb ccc" + ${_ASSERT_EQUALS_} $? 0 + + list_contains_ele "ccc" "aaa bbb ccc" + ${_ASSERT_EQUALS_} $? 0 + + list_contains_ele "aa" "" + ${_ASSERT_EQUALS_} $? 1 + + list_contains_ele "aa" "" + ${_ASSERT_EQUALS_} $? 1 + + list_contains_ele "" "" + ${_ASSERT_EQUALS_} $? 1 + + list_contains_ele "aaa" "bbb" + ${_ASSERT_EQUALS_} $? 1 + + list_contains_ele "bbb" "aa" + ${_ASSERT_EQUALS_} $? 1 + +} + + +test_comma_list_contains_ele() { + + comma_list_contains_ele "aaa" "aaa,bbb,ccc" + ${_ASSERT_EQUALS_} $? 0 + + comma_list_contains_ele "aa" "aaa,bbb,ccc" + ${_ASSERT_EQUALS_} $? 1 + + comma_list_contains_ele "bbb" "aaa,bbb,ccc" + ${_ASSERT_EQUALS_} $? 0 + + comma_list_contains_ele "ccc" "aaa,bbb,ccc" + ${_ASSERT_EQUALS_} $? 0 + + comma_list_contains_ele "aa" "" + ${_ASSERT_EQUALS_} $? 1 + + comma_list_contains_ele "aa" "" + ${_ASSERT_EQUALS_} $? 1 + + comma_list_contains_ele "" "" + ${_ASSERT_EQUALS_} $? 1 + + comma_list_contains_ele "aaa" "bbb" + ${_ASSERT_EQUALS_} $? 1 + + comma_list_contains_ele "aa" "bbb" + ${_ASSERT_EQUALS_} $? 1 + +} + + +test_trilinos_filter_packages_to_test() { + + generate_trilinos_package_dependencies_xml_file + + TRILINOS_EXCLUDE_PACKAGES_FROM_PR_TESTING= + + filtered_packages=$(trilinos_filter_packages_to_test "") + assertEquals "${filtered_packages}" "" + + filtered_packages=$(trilinos_filter_packages_to_test "Teuchos,Tpetra") + ${_ASSERT_EQUALS_} "${filtered_packages}" "Teuchos,Tpetra" + + filtered_packages=$(trilinos_filter_packages_to_test "Teuchos,Tpetra,PyTrilinos,Panzer") + ${_ASSERT_EQUALS_} "${filtered_packages}" "Teuchos,Tpetra,PyTrilinos,Panzer" + + filtered_packages=$(trilinos_filter_packages_to_test "TriKota,Teuchos,Tpetra,PyTrilinos,Panzer") + ${_ASSERT_EQUALS_} "${filtered_packages}" "TriKota,Teuchos,Tpetra,PyTrilinos,Panzer" + + TRILINOS_EXCLUDE_PACKAGES_FROM_PR_TESTING=(TriKota PyTrilinos) + + filtered_packages=$(trilinos_filter_packages_to_test "") + assertEquals "${filtered_packages}" "" + + filtered_packages=$(trilinos_filter_packages_to_test "Teuchos,Tpetra") + ${_ASSERT_EQUALS_} "${filtered_packages}" "Teuchos,Tpetra" + + filtered_packages=$(trilinos_filter_packages_to_test "Teuchos,Tpetra,PyTrilinos,Panzer") + ${_ASSERT_EQUALS_} "${filtered_packages}" "Teuchos,Tpetra,Panzer" + + filtered_packages=$(trilinos_filter_packages_to_test "TriKota,Teuchos,Tpetra,PyTrilinos,Panzer") + ${_ASSERT_EQUALS_} "${filtered_packages}" "Teuchos,Tpetra,Panzer" + +} + + +test_trilinos_filter_packages_to_test() { + + generate_trilinos_package_dependencies_xml_file + + all_toplevel_packages=$(trilinos_get_all_toplevel_packages) + #echo "all_toplevel_packages='${all_toplevel_packages}'" + assertContains "${all_toplevel_packages}" "TrilinosFrameworkTests," + assertContains "${all_toplevel_packages}" ",TrilinosATDMConfigTests," + assertContains "${all_toplevel_packages}" ",Teuchos," + assertContains "${all_toplevel_packages}" ",Tpetra," + assertContains "${all_toplevel_packages}" ",TriKota," + assertContains "${all_toplevel_packages}" ",PyTrilinos," + assertContains "${all_toplevel_packages}" ",NewPackage," + assertContains "${all_toplevel_packages}" ",Panzer," + +} + + +# +# Run the unit tests +# + +SHUNIT2_DIR=`readlink -f ${CURRENT_SCRIPTS_DIR}/../test/shunit2` +. ${SHUNIT2_DIR}/shunit2 diff --git a/commonTools/framework/get-changed-trilinos-packages-helpers.sh b/commonTools/framework/get-changed-trilinos-packages-helpers.sh new file mode 100644 index 000000000000..fb8664af7a27 --- /dev/null +++ b/commonTools/framework/get-changed-trilinos-packages-helpers.sh @@ -0,0 +1,123 @@ +# +# Determine paths +# + +if [ "$TRILINOS_DIR" == "" ] ; then + # Grab from the symlink (only works on Linux) + _ABS_FILE_PATH=`readlink -f $0` || \ + echo "Could not follow symlink to set TRILINOS_DIR!" + if [ "$_ABS_FILE_PATH" != "" ] ; then + _SCRIPT_DIR=`dirname $_ABS_FILE_PATH` + TRILINOS_DIR=$_SCRIPT_DIR/../.. + fi +fi + +if [ "$TRILINOS_DIR" == "" ] ; then + echo "ERROR: Cannot determine TRILINOS_DIR! Please set env var TRILINOS_DIR!" + exit 4 +fi + +echo "TRILINOS_DIR=$TRILINOS_DIR" + +# Allow a different source tree for the Trilinos scripts +if [ "$TRILINOS_SCRIPTS_DIR" == "" ] ; then + TRILINOS_SCRIPTS_DIR=${TRILINOS_DIR} +fi + +echo "TRILINOS_SCRIPTS_DIR=$TRILINOS_SCRIPTS_DIR" + +ORIG_CWD=$PWD + +# Allow override of TriBITS for testing purposes +if [ "${GCTP_TRIBITS_DIR_OVERRIDE}" != "" ] ; then + TRIBITS_DIR=$GCTP_TRIBITS_DIR_OVERRIDE +else + TRIBITS_DIR=$TRILINOS_SCRIPTS_DIR/cmake/tribits +fi +echo "TRIBITS_DIR=$TRIBITS_DIR" + + +# +# Functions +# + + +function comma_list_to_list() { + echo "$1" | sed "s|,| |g" +} + + +function list_to_comma_list() { + echo "$@" | sed "s| |,|g" +} + + +# list_contains_ele ... +# +# Returns if is contained in list (0 is success) +function list_contains_ele() { + ele_to_find="$1" ; shift + list="$@" + #echo "ele_to_find='${ele_to_find}'" + for ELE in ${list} ; do + #echo "ELE='${ELE}'" + if [[ "${ELE}" == "${ele_to_find}" ]] ; then + #echo "Contains ${ele_to_find}!" + return 0 + fi + done + return 1 +} + + +# comma_list_contains_ele ,,... +# +# Returns if is contained in list (0 is success) +function comma_list_contains_ele() { + ele="$1" + comma_list="$2" + list=$(comma_list_to_list "${comma_list}") + if list_contains_ele "${ele}" "${list}"; then + return 0 + else + return 1 + fi +} + + +# Generates TrilinosPackageDependencies.xml +function generate_trilinos_package_dependencies_xml_file() { + cmake \ + -D Trilinos_DEPS_XML_OUTPUT_FILE=TrilinosPackageDependencies.xml \ + -P $TRIBITS_DIR/ci_support/TribitsDumpDepsXmlScript.cmake \ + &> TribitsDumpDepsXmlScript.log + echo "Wrote the file 'TrilinosPackageDependencies.xml'" +} + + +# Take in and return a filtered comma-seprated list of packages +# +# Non PT and ST packages as well as packages listed in +# TRILINOS_EXCLUDE_PACKAGES_FROM_PR_TESTING are filtered out. +function trilinos_filter_packages_to_test() { + input_packages_comma_list="$1" + fullFilteredPackagesCommaList=$( + ${TRIBITS_DIR}/ci_support/filter-packages-list.py \ + --deps-xml-file=TrilinosPackageDependencies.xml \ + --input-packages-list="${input_packages_comma_list}" \ + --keep-test-test-categories=PT,ST) + fullFilteredPackagesList=$(comma_list_to_list "$fullFilteredPackagesCommaList") + filteredPackagesList=() + for pkg in ${fullFilteredPackagesList} ; do + if ! list_contains_ele "${pkg}" "${TRILINOS_EXCLUDE_PACKAGES_FROM_PR_TESTING[@]}";then + filteredPackagesList+=($pkg) + fi + done + list_to_comma_list "${filteredPackagesList[@]}" +} + + +function trilinos_get_all_toplevel_packages() { + $TRIBITS_DIR/ci_support/get-tribits-packages.py \ + --deps-xml-file=TrilinosPackageDependencies.xml +} diff --git a/commonTools/framework/get-changed-trilinos-packages.sh b/commonTools/framework/get-changed-trilinos-packages.sh index 86b870e116c7..2b5bcd52c3f8 100755 --- a/commonTools/framework/get-changed-trilinos-packages.sh +++ b/commonTools/framework/get-changed-trilinos-packages.sh @@ -3,12 +3,14 @@ # Usage: # # get-changed-trilinos-packages.sh \ -# +# [] # # This script takes a range of git commits .. # and then generates a CMake fragment file which # provides the set of enables of Trilinos packages needed to test the changed -# files. +# files and optionally also a CMake fragment +# file provides a 'set(CTEST_LABELS_FOR_SUBPROJECTS ...)' statment which +# provides the list of subprojects (TriBITS packages) to display on CDash. # # For example, to generate a file for the set of enables to test changes in # the current version of Trilinos w.r.t. to develop branch, one would do: @@ -36,12 +38,23 @@ # giving the relative or absolute path. # -# Get command-line arguments +# A) Data that may change +# + +TRILINOS_EXCLUDE_PACKAGES_FROM_PR_TESTING=( + TriKota + PyTrilinos + ) + + +# +# B) Get command-line arguments # GIT_COMMIT_FROM=$1 GIT_COMMIT_TO=$2 CMAKE_PACKAGE_ENABLES_OUT=$3 +CTEST_LABELS_FOR_SUBPROJETS_OUT=$4 if [ "$GIT_COMMIT_FROM" == "" ] ; then echo "ERROR: Must specify first argument !" @@ -58,15 +71,9 @@ if [ "$CMAKE_PACKAGE_ENABLES_OUT" == "" ] ; then exit 1 fi -echo -echo "***" -echo "*** Generating set of Trilinos enables given modified packages from" -echo "*** git commit ${GIT_COMMIT_FROM} to ${GIT_COMMIT_TO}" -echo "***" -echo # -# Determine TRILINOS_DIR +# C) Determine paths # if [ "$TRILINOS_DIR" == "" ] ; then @@ -103,16 +110,38 @@ else fi echo "TRIBITS_DIR=$TRIBITS_DIR" + +# +# D) Import functions and vars +# + +ABS_FILE_PATH=`readlink -f $0` || \ + echo "Could not follow symlink to set TRILINOS_DIR!" +if [ "$_ABS_FILE_PATH" != "" ] ; then + SCRIPT_DIR=`dirname $_ABS_FILE_PATH` +fi + +source "${TRILINOS_DIR}/commonTools/framework/get-changed-trilinos-packages-helpers.sh" + + +############################################ +# +# Executable script +# +############################################ + echo -echo "A) Generate the Trilinos Packages definition and depencencies XML file" +echo "***" +echo "*** Generating set of Trilinos enables given modified packages from" +echo "*** git commit ${GIT_COMMIT_FROM} to ${GIT_COMMIT_TO}" +echo "***" echo -cmake \ - -D Trilinos_DEPS_XML_OUTPUT_FILE=TrilinosPackageDependencies.xml \ - -P $TRIBITS_DIR/ci_support/TribitsDumpDepsXmlScript.cmake \ - &> TribitsDumpDepsXmlScript.log +echo +echo "A) Generate the Trilinos Packages definition and depencencies XML file" +echo -echo "Wrote the file 'TrilinosPackageDependencies.xml'" +generate_trilinos_package_dependencies_xml_file echo echo "B) Get the set of changed files" @@ -149,14 +178,11 @@ echo "CHANGED_PACKAGES_FULL_LIST='$CHANGED_PACKAGES_FULL_LIST'" echo echo "D) Filter list of changed packages to get only the PT packages" echo -CHANGED_PACKAGES_PT_LIST=`$TRIBITS_DIR/ci_support/filter-packages-list.py \ - --deps-xml-file=TrilinosPackageDependencies.xml \ - --input-packages-list=$CHANGED_PACKAGES_FULL_LIST \ - --keep-test-test-categories=PT` -echo "CHANGED_PACKAGES_PT_LIST='$CHANGED_PACKAGES_PT_LIST'" +CHANGED_PACKAGES_ST_LIST=$(trilinos_filter_packages_to_test "${CHANGED_PACKAGES_FULL_LIST}") +echo "CHANGED_PACKAGES_ST_LIST='${CHANGED_PACKAGES_ST_LIST}'" echo -echo "E) Generate the *.cmake enables file" +echo "E) Generate the ${CMAKE_PACKAGE_ENABLES_OUT} enables file" echo echo " @@ -166,8 +192,8 @@ MACRO(PR_ENABLE_BOOL VAR_NAME VAR_VAL) ENDMACRO() " > $CMAKE_PACKAGE_ENABLES_OUT -if [ "$CHANGED_PACKAGES_PT_LIST" != "" ] ; then - echo "$CHANGED_PACKAGES_PT_LIST" | sed -n 1'p' | tr ',' '\n' | while read PKG_NAME ; do +if [ "$CHANGED_PACKAGES_ST_LIST" != "" ] ; then + echo "$CHANGED_PACKAGES_ST_LIST" | sed -n 1'p' | tr ',' '\n' | while read PKG_NAME ; do #echo $PKG_NAME echo "PR_ENABLE_BOOL(Trilinos_ENABLE_${PKG_NAME} ON)" >> $CMAKE_PACKAGE_ENABLES_OUT done @@ -176,3 +202,25 @@ else fi echo "Wrote file '$CMAKE_PACKAGE_ENABLES_OUT'" + +echo +echo "F) Generate the ${CTEST_LABELS_FOR_SUBPROJETS_OUT} file" +echo + +printf "set(CTEST_LABELS_FOR_SUBPROJECTS" > $CTEST_LABELS_FOR_SUBPROJETS_OUT + +if [[ "$CHANGED_PACKAGES_ST_LIST" != "" ]] ; then + + ALL_PACKAGES=$(trilinos_get_all_toplevel_packages) + PR_PACKAGES=$(trilinos_filter_packages_to_test "${ALL_PACKAGES}") + + echo "$PR_PACKAGES" | sed -n 1'p' | tr ',' '\n' | while read PKG_NAME ; do + #echo $PKG_NAME + printf " ${PKG_NAME}" >> $CTEST_LABELS_FOR_SUBPROJETS_OUT + done + +fi + +echo ")" >> $CTEST_LABELS_FOR_SUBPROJETS_OUT + +echo "Wrote file '$CTEST_LABELS_FOR_SUBPROJETS_OUT'" diff --git a/cmake/std/atdm/test/shunit2/.githooks/generic b/commonTools/test/shunit2/.githooks/generic similarity index 100% rename from cmake/std/atdm/test/shunit2/.githooks/generic rename to commonTools/test/shunit2/.githooks/generic diff --git a/cmake/std/atdm/test/shunit2/.githooks/pre-commit.shellcheck b/commonTools/test/shunit2/.githooks/pre-commit.shellcheck similarity index 100% rename from cmake/std/atdm/test/shunit2/.githooks/pre-commit.shellcheck rename to commonTools/test/shunit2/.githooks/pre-commit.shellcheck diff --git a/cmake/std/atdm/test/shunit2/.gitignore b/commonTools/test/shunit2/.gitignore similarity index 100% rename from cmake/std/atdm/test/shunit2/.gitignore rename to commonTools/test/shunit2/.gitignore diff --git a/cmake/std/atdm/test/shunit2/.travis.yml b/commonTools/test/shunit2/.travis.yml similarity index 100% rename from cmake/std/atdm/test/shunit2/.travis.yml rename to commonTools/test/shunit2/.travis.yml diff --git a/cmake/std/atdm/test/shunit2/CODE_OF_CONDUCT.md b/commonTools/test/shunit2/CODE_OF_CONDUCT.md similarity index 100% rename from cmake/std/atdm/test/shunit2/CODE_OF_CONDUCT.md rename to commonTools/test/shunit2/CODE_OF_CONDUCT.md diff --git a/cmake/std/atdm/test/shunit2/LICENSE b/commonTools/test/shunit2/LICENSE similarity index 100% rename from cmake/std/atdm/test/shunit2/LICENSE rename to commonTools/test/shunit2/LICENSE diff --git a/cmake/std/atdm/test/shunit2/README.md b/commonTools/test/shunit2/README.md similarity index 100% rename from cmake/std/atdm/test/shunit2/README.md rename to commonTools/test/shunit2/README.md diff --git a/cmake/std/atdm/test/shunit2/doc/CHANGES-2.1.md b/commonTools/test/shunit2/doc/CHANGES-2.1.md similarity index 100% rename from cmake/std/atdm/test/shunit2/doc/CHANGES-2.1.md rename to commonTools/test/shunit2/doc/CHANGES-2.1.md diff --git a/cmake/std/atdm/test/shunit2/doc/RELEASE_NOTES-2.1.0.txt b/commonTools/test/shunit2/doc/RELEASE_NOTES-2.1.0.txt similarity index 100% rename from cmake/std/atdm/test/shunit2/doc/RELEASE_NOTES-2.1.0.txt rename to commonTools/test/shunit2/doc/RELEASE_NOTES-2.1.0.txt diff --git a/cmake/std/atdm/test/shunit2/doc/RELEASE_NOTES-2.1.1.txt b/commonTools/test/shunit2/doc/RELEASE_NOTES-2.1.1.txt similarity index 100% rename from cmake/std/atdm/test/shunit2/doc/RELEASE_NOTES-2.1.1.txt rename to commonTools/test/shunit2/doc/RELEASE_NOTES-2.1.1.txt diff --git a/cmake/std/atdm/test/shunit2/doc/RELEASE_NOTES-2.1.2.txt b/commonTools/test/shunit2/doc/RELEASE_NOTES-2.1.2.txt similarity index 100% rename from cmake/std/atdm/test/shunit2/doc/RELEASE_NOTES-2.1.2.txt rename to commonTools/test/shunit2/doc/RELEASE_NOTES-2.1.2.txt diff --git a/cmake/std/atdm/test/shunit2/doc/RELEASE_NOTES-2.1.3.txt b/commonTools/test/shunit2/doc/RELEASE_NOTES-2.1.3.txt similarity index 100% rename from cmake/std/atdm/test/shunit2/doc/RELEASE_NOTES-2.1.3.txt rename to commonTools/test/shunit2/doc/RELEASE_NOTES-2.1.3.txt diff --git a/cmake/std/atdm/test/shunit2/doc/RELEASE_NOTES-2.1.4.txt b/commonTools/test/shunit2/doc/RELEASE_NOTES-2.1.4.txt similarity index 100% rename from cmake/std/atdm/test/shunit2/doc/RELEASE_NOTES-2.1.4.txt rename to commonTools/test/shunit2/doc/RELEASE_NOTES-2.1.4.txt diff --git a/cmake/std/atdm/test/shunit2/doc/RELEASE_NOTES-2.1.5.txt b/commonTools/test/shunit2/doc/RELEASE_NOTES-2.1.5.txt similarity index 100% rename from cmake/std/atdm/test/shunit2/doc/RELEASE_NOTES-2.1.5.txt rename to commonTools/test/shunit2/doc/RELEASE_NOTES-2.1.5.txt diff --git a/cmake/std/atdm/test/shunit2/doc/RELEASE_NOTES-2.1.6.txt b/commonTools/test/shunit2/doc/RELEASE_NOTES-2.1.6.txt similarity index 100% rename from cmake/std/atdm/test/shunit2/doc/RELEASE_NOTES-2.1.6.txt rename to commonTools/test/shunit2/doc/RELEASE_NOTES-2.1.6.txt diff --git a/cmake/std/atdm/test/shunit2/doc/RELEASE_NOTES-2.1.7.md b/commonTools/test/shunit2/doc/RELEASE_NOTES-2.1.7.md similarity index 100% rename from cmake/std/atdm/test/shunit2/doc/RELEASE_NOTES-2.1.7.md rename to commonTools/test/shunit2/doc/RELEASE_NOTES-2.1.7.md diff --git a/cmake/std/atdm/test/shunit2/doc/RELEASE_NOTES-2.1.8.md b/commonTools/test/shunit2/doc/RELEASE_NOTES-2.1.8.md similarity index 100% rename from cmake/std/atdm/test/shunit2/doc/RELEASE_NOTES-2.1.8.md rename to commonTools/test/shunit2/doc/RELEASE_NOTES-2.1.8.md diff --git a/cmake/std/atdm/test/shunit2/doc/TODO.txt b/commonTools/test/shunit2/doc/TODO.txt similarity index 100% rename from cmake/std/atdm/test/shunit2/doc/TODO.txt rename to commonTools/test/shunit2/doc/TODO.txt diff --git a/cmake/std/atdm/test/shunit2/doc/contributors.md b/commonTools/test/shunit2/doc/contributors.md similarity index 100% rename from cmake/std/atdm/test/shunit2/doc/contributors.md rename to commonTools/test/shunit2/doc/contributors.md diff --git a/cmake/std/atdm/test/shunit2/doc/design_doc.txt b/commonTools/test/shunit2/doc/design_doc.txt similarity index 100% rename from cmake/std/atdm/test/shunit2/doc/design_doc.txt rename to commonTools/test/shunit2/doc/design_doc.txt diff --git a/cmake/std/atdm/test/shunit2/examples/equality_test.sh b/commonTools/test/shunit2/examples/equality_test.sh similarity index 100% rename from cmake/std/atdm/test/shunit2/examples/equality_test.sh rename to commonTools/test/shunit2/examples/equality_test.sh diff --git a/cmake/std/atdm/test/shunit2/examples/lineno_test.sh b/commonTools/test/shunit2/examples/lineno_test.sh similarity index 100% rename from cmake/std/atdm/test/shunit2/examples/lineno_test.sh rename to commonTools/test/shunit2/examples/lineno_test.sh diff --git a/cmake/std/atdm/test/shunit2/examples/math.inc b/commonTools/test/shunit2/examples/math.inc similarity index 100% rename from cmake/std/atdm/test/shunit2/examples/math.inc rename to commonTools/test/shunit2/examples/math.inc diff --git a/cmake/std/atdm/test/shunit2/examples/math_test.sh b/commonTools/test/shunit2/examples/math_test.sh similarity index 100% rename from cmake/std/atdm/test/shunit2/examples/math_test.sh rename to commonTools/test/shunit2/examples/math_test.sh diff --git a/cmake/std/atdm/test/shunit2/examples/mkdir_test.sh b/commonTools/test/shunit2/examples/mkdir_test.sh similarity index 100% rename from cmake/std/atdm/test/shunit2/examples/mkdir_test.sh rename to commonTools/test/shunit2/examples/mkdir_test.sh diff --git a/cmake/std/atdm/test/shunit2/examples/mock_file.sh b/commonTools/test/shunit2/examples/mock_file.sh similarity index 100% rename from cmake/std/atdm/test/shunit2/examples/mock_file.sh rename to commonTools/test/shunit2/examples/mock_file.sh diff --git a/cmake/std/atdm/test/shunit2/examples/mock_file_test.sh b/commonTools/test/shunit2/examples/mock_file_test.sh similarity index 100% rename from cmake/std/atdm/test/shunit2/examples/mock_file_test.sh rename to commonTools/test/shunit2/examples/mock_file_test.sh diff --git a/cmake/std/atdm/test/shunit2/examples/party_test.sh b/commonTools/test/shunit2/examples/party_test.sh similarity index 100% rename from cmake/std/atdm/test/shunit2/examples/party_test.sh rename to commonTools/test/shunit2/examples/party_test.sh diff --git a/cmake/std/atdm/test/shunit2/examples/suite_test.sh b/commonTools/test/shunit2/examples/suite_test.sh similarity index 100% rename from cmake/std/atdm/test/shunit2/examples/suite_test.sh rename to commonTools/test/shunit2/examples/suite_test.sh diff --git a/cmake/std/atdm/test/shunit2/init_githooks.sh b/commonTools/test/shunit2/init_githooks.sh similarity index 100% rename from cmake/std/atdm/test/shunit2/init_githooks.sh rename to commonTools/test/shunit2/init_githooks.sh diff --git a/cmake/std/atdm/test/shunit2/lib/shflags b/commonTools/test/shunit2/lib/shflags similarity index 100% rename from cmake/std/atdm/test/shunit2/lib/shflags rename to commonTools/test/shunit2/lib/shflags diff --git a/cmake/std/atdm/test/shunit2/lib/versions b/commonTools/test/shunit2/lib/versions similarity index 100% rename from cmake/std/atdm/test/shunit2/lib/versions rename to commonTools/test/shunit2/lib/versions diff --git a/cmake/std/atdm/test/shunit2/shunit2 b/commonTools/test/shunit2/shunit2 similarity index 100% rename from cmake/std/atdm/test/shunit2/shunit2 rename to commonTools/test/shunit2/shunit2 diff --git a/cmake/std/atdm/test/shunit2/shunit2_args_test.sh b/commonTools/test/shunit2/shunit2_args_test.sh similarity index 100% rename from cmake/std/atdm/test/shunit2/shunit2_args_test.sh rename to commonTools/test/shunit2/shunit2_args_test.sh diff --git a/cmake/std/atdm/test/shunit2/shunit2_asserts_test.sh b/commonTools/test/shunit2/shunit2_asserts_test.sh similarity index 100% rename from cmake/std/atdm/test/shunit2/shunit2_asserts_test.sh rename to commonTools/test/shunit2/shunit2_asserts_test.sh diff --git a/cmake/std/atdm/test/shunit2/shunit2_failures_test.sh b/commonTools/test/shunit2/shunit2_failures_test.sh similarity index 100% rename from cmake/std/atdm/test/shunit2/shunit2_failures_test.sh rename to commonTools/test/shunit2/shunit2_failures_test.sh diff --git a/cmake/std/atdm/test/shunit2/shunit2_macros_test.sh b/commonTools/test/shunit2/shunit2_macros_test.sh similarity index 100% rename from cmake/std/atdm/test/shunit2/shunit2_macros_test.sh rename to commonTools/test/shunit2/shunit2_macros_test.sh diff --git a/cmake/std/atdm/test/shunit2/shunit2_misc_test.sh b/commonTools/test/shunit2/shunit2_misc_test.sh similarity index 100% rename from cmake/std/atdm/test/shunit2/shunit2_misc_test.sh rename to commonTools/test/shunit2/shunit2_misc_test.sh diff --git a/cmake/std/atdm/test/shunit2/shunit2_standalone_test.sh b/commonTools/test/shunit2/shunit2_standalone_test.sh similarity index 100% rename from cmake/std/atdm/test/shunit2/shunit2_standalone_test.sh rename to commonTools/test/shunit2/shunit2_standalone_test.sh diff --git a/cmake/std/atdm/test/shunit2/shunit2_test_helpers b/commonTools/test/shunit2/shunit2_test_helpers similarity index 100% rename from cmake/std/atdm/test/shunit2/shunit2_test_helpers rename to commonTools/test/shunit2/shunit2_test_helpers diff --git a/cmake/std/atdm/test/shunit2/test_runner b/commonTools/test/shunit2/test_runner similarity index 100% rename from cmake/std/atdm/test/shunit2/test_runner rename to commonTools/test/shunit2/test_runner diff --git a/packages/amesos2/CMakeLists.txt b/packages/amesos2/CMakeLists.txt index 97a335f74608..2f4acdc7d469 100644 --- a/packages/amesos2/CMakeLists.txt +++ b/packages/amesos2/CMakeLists.txt @@ -113,26 +113,6 @@ TRIBITS_ADD_OPTION_AND_DEFINE(${PACKAGE_NAME}_ENABLE_MUMPS OFF ) -TRIBITS_ADD_OPTION_AND_DEFINE(${PACKAGE_NAME}_ENABLE_TRIANGULAR_SOLVES - HAVE_AMESOS2_TRIANGULAR_SOLVES - "Enable Triangular Solves in Amesos2" - OFF -) - -# If Triangular Solves is on then we must have proper settings for KokkosKernels -ASSERT_DEFINED(${PACKAGE_NAME}_ENABLE_TRIANGULAR_SOLVES) -IF(${PACKAGE_NAME}_ENABLE_TRIANGULAR_SOLVES) - ASSERT_DEFINED(TPL_ENABLE_Cholmod) - ASSERT_DEFINED(${PACKAGE_NAME}_ENABLE_Cholmod) - IF(TPL_ENABLE_Cholmod AND ${PACKAGE_NAME}_ENABLE_Cholmod) - ASSERT_DEFINED(KokkosKernels_ENABLE_SUPERNODAL_SPTRSV) - ASSERT_DEFINED(KokkosKernels_ENABLE_TPL_CHOLMOD) - IF(NOT KokkosKernels_ENABLE_SUPERNODAL_SPTRSV OR NOT KokkosKernels_ENABLE_TPL_CHOLMOD) - MESSAGE(FATAL_ERROR "You must enable -DKokkosKernels_ENABLE_SUPERNODAL_SPTRSV=ON and -DKokkosKernels_ENABLE_TPL_CHOLMOD=ON for Triangular Solves with Cholmod") - ENDIF() - ENDIF() -ENDIF() - ASSERT_DEFINED(TPL_ENABLE_METIS) TRIBITS_ADD_OPTION_AND_DEFINE(${PACKAGE_NAME}_ENABLE_METIS HAVE_AMESOS2_METIS diff --git a/packages/amesos2/src/Amesos2_Cholmod_decl.hpp b/packages/amesos2/src/Amesos2_Cholmod_decl.hpp index b175d326a7a0..3f9793486b2e 100644 --- a/packages/amesos2/src/Amesos2_Cholmod_decl.hpp +++ b/packages/amesos2/src/Amesos2_Cholmod_decl.hpp @@ -57,7 +57,7 @@ #include "Amesos2_SolverCore.hpp" #include "Amesos2_Cholmod_FunctionMap.hpp" -#ifdef HAVE_AMESOS2_TRIANGULAR_SOLVES +#if defined(KOKKOSKERNELS_ENABLE_SUPERNODAL_SPTRSV) && defined(KOKKOSKERNELS_ENABLE_TPL_CHOLMOD) #include "KokkosKernels_Handle.hpp" #endif @@ -260,7 +260,7 @@ class Cholmod : public SolverCore mutable host_solve_array_t host_bValues_; int ldb_; -#ifdef HAVE_AMESOS2_TRIANGULAR_SOLVES +#if defined(KOKKOSKERNELS_ENABLE_SUPERNODAL_SPTRSV) && defined(KOKKOSKERNELS_ENABLE_TPL_CHOLMOD) typedef Kokkos::DefaultExecutionSpace DeviceExecSpaceType; diff --git a/packages/amesos2/src/Amesos2_Cholmod_def.hpp b/packages/amesos2/src/Amesos2_Cholmod_def.hpp index 6d1276172482..f400660f0311 100644 --- a/packages/amesos2/src/Amesos2_Cholmod_def.hpp +++ b/packages/amesos2/src/Amesos2_Cholmod_def.hpp @@ -60,9 +60,9 @@ #include "Amesos2_SolverCore_def.hpp" #include "Amesos2_Cholmod_decl.hpp" -#ifdef HAVE_AMESOS2_TRIANGULAR_SOLVES +#if defined(KOKKOSKERNELS_ENABLE_SUPERNODAL_SPTRSV) && defined(KOKKOSKERNELS_ENABLE_TPL_CHOLMOD) #include "KokkosSparse_sptrsv_cholmod.hpp" -#endif // HAVE_AMESOS2_TRIANGULAR_SOLVES +#endif namespace Amesos2 { @@ -236,7 +236,7 @@ Cholmod::solve_impl(const Teuchos::Ptr > // In general we may want to write directly to the x space without a copy. // So we 'get' x which may be a direct view assignment to the MV. if(use_triangular_solves_) { // to device -#ifdef HAVE_AMESOS2_TRIANGULAR_SOLVES +#if defined(KOKKOSKERNELS_ENABLE_SUPERNODAL_SPTRSV) && defined(KOKKOSKERNELS_ENABLE_TPL_CHOLMOD) Util::get_1d_copy_helper_kokkos_view, device_solve_array_t>::do_get(B, device_bValues_, Teuchos::as(ld_rhs), @@ -298,7 +298,7 @@ Cholmod::solve_impl(const Teuchos::Ptr > #endif if(use_triangular_solves_) { // to device -#ifdef HAVE_AMESOS2_TRIANGULAR_SOLVES +#if defined(KOKKOSKERNELS_ENABLE_SUPERNODAL_SPTRSV) && defined(KOKKOSKERNELS_ENABLE_TPL_CHOLMOD) Util::put_1d_data_helper_kokkos_view< MultiVecAdapter,device_solve_array_t>::do_put(X, device_xValues_, Teuchos::as(ld_rhs), @@ -338,12 +338,12 @@ Cholmod::setParameters_impl(const Teuchos::RCP valid_params = getValidParameters_impl(); is_contiguous_ = parameterList->get("IsContiguous", true); - use_triangular_solves_ = parameterList->get("TriangularSolves", false); + use_triangular_solves_ = parameterList->get("Enable_KokkosKernels_TriangularSolves", false); if(use_triangular_solves_) { -#ifndef HAVE_AMESOS2_TRIANGULAR_SOLVES +#if not defined(KOKKOSKERNELS_ENABLE_SUPERNODAL_SPTRSV) || not defined(KOKKOSKERNELS_ENABLE_TPL_CHOLMOD) TEUCHOS_TEST_FOR_EXCEPTION(true, std::runtime_error, - "Calling for triangular solves but Amesos2_ENABLE_TRIANGULAR_SOLVES was not configured." ); + "Calling for triangular solves but KokkosKernels_ENABLE_SUPERNODAL_SPTRSV and KokkosKernels_ENABLE_TPL_CHOLMOD not configured." ); #endif } @@ -409,7 +409,7 @@ Cholmod::getValidParameters_impl() const pl->set("useGPU", -1, "1: Use GPU is 1, 0: Do not use GPU, -1: ENV CHOLMOD_USE_GPU set GPU usage."); - pl->set("TriangularSolves", false, "Whether to use triangular solves."); + pl->set("Enable_KokkosKernels_TriangularSolves", false, "Whether to use triangular solves."); pl->set("IsContiguous", true, "Whether GIDs contiguous"); @@ -489,7 +489,7 @@ template void Cholmod::triangular_solve_symbolic() { -#ifdef HAVE_AMESOS2_TRIANGULAR_SOLVES +#if defined(KOKKOSKERNELS_ENABLE_SUPERNODAL_SPTRSV) && defined(KOKKOSKERNELS_ENABLE_TPL_CHOLMOD) // Create handles for U and U^T solves device_khL_.create_sptrsv_handle( KokkosSparse::Experimental::SPTRSVAlgorithm::SUPERNODAL_ETREE, data_.L->n, true); @@ -529,7 +529,7 @@ template void Cholmod::triangular_solve_numeric() { -#ifdef HAVE_AMESOS2_TRIANGULAR_SOLVES +#if defined(KOKKOSKERNELS_ENABLE_SUPERNODAL_SPTRSV) && defined(KOKKOSKERNELS_ENABLE_TPL_CHOLMOD) // Do numerical compute KokkosSparse::Experimental::sptrsv_compute (&device_khL_, &device_khU_, data_.L, &data_.c); @@ -540,7 +540,7 @@ template void Cholmod::triangular_solve() const { -#ifdef HAVE_AMESOS2_TRIANGULAR_SOLVES +#if defined(KOKKOSKERNELS_ENABLE_SUPERNODAL_SPTRSV) && defined(KOKKOSKERNELS_ENABLE_TPL_CHOLMOD) size_t ld_rhs = device_xValues_.extent(0); size_t nrhs = device_xValues_.extent(1); @@ -577,7 +577,7 @@ Cholmod::triangular_solve() const local_device_xValues(j,k) = local_device_trsv_rhs(local_device_trsv_perm(j),k); } }); -#endif // HAVE_AMESOS2_TRIANGULAR_SOLVE +#endif } template diff --git a/packages/amesos2/src/Amesos2_EpetraMultiVecAdapter_def.hpp b/packages/amesos2/src/Amesos2_EpetraMultiVecAdapter_def.hpp index 717597da609a..302577b35f97 100644 --- a/packages/amesos2/src/Amesos2_EpetraMultiVecAdapter_def.hpp +++ b/packages/amesos2/src/Amesos2_EpetraMultiVecAdapter_def.hpp @@ -267,7 +267,6 @@ void MultiVecAdapter::get1dCopy_kokkos_view_host( using Teuchos::rcpFromPtr; using Teuchos::as; - const size_t local_length = getLocalLength(); const size_t num_vecs = getGlobalNumVectors(); #ifdef HAVE_AMESOS2_DEBUG @@ -280,7 +279,7 @@ void MultiVecAdapter::get1dCopy_kokkos_view_host( // First make a host view host_view = Kokkos::View( Kokkos::ViewAllocateWithoutInitializing("get1dCopy_kokkos_view"), - local_length, num_vecs); + distribution_map->getNodeNumElements(), num_vecs); // Optimization for ROOTED and single MPI process if ( num_vecs == 1 && this->mv_->Comm().MyPID() == 0 && this->mv_->Comm().NumProc() == 1 ) { diff --git a/packages/amesos2/src/Amesos2_Superlu.cpp b/packages/amesos2/src/Amesos2_Superlu.cpp index 2145ba8752d2..4f9964e7dffb 100644 --- a/packages/amesos2/src/Amesos2_Superlu.cpp +++ b/packages/amesos2/src/Amesos2_Superlu.cpp @@ -65,4 +65,7 @@ TPETRA_ETI_MANGLING_TYPEDEFS() TPETRA_INSTANTIATE_SLGN_NO_ORDINAL_SCALAR(AMESOS2_SUPERLU_LOCAL_INSTANT) +#define AMESOS2_KOKKOS_IMPL_SOLVER_NAME Superlu +#include "Amesos2_Kokkos_Impl.hpp" + #endif // HAVE_AMESOS2_EXPLICIT_INSTANTIATION diff --git a/packages/amesos2/src/Amesos2_Superlu_FunctionMap.hpp b/packages/amesos2/src/Amesos2_Superlu_FunctionMap.hpp index 835532b05567..1c44f54e44a6 100644 --- a/packages/amesos2/src/Amesos2_Superlu_FunctionMap.hpp +++ b/packages/amesos2/src/Amesos2_Superlu_FunctionMap.hpp @@ -79,7 +79,6 @@ namespace SLU { #include "slu_util.h" #include "superlu_enum_consts.h" - namespace S { // single-precision real definitions #ifdef HAVE_AMESOS2_SUPERLU5_API @@ -105,6 +104,9 @@ namespace SLU { #endif extern void + sCompRow_to_CompCol(int, int, int, float*, int*, int*, + float **, int **, int **); + extern void sgssvx(SLU::superlu_options_t *, SLU::SuperMatrix *, int *, int *, int *, char *, float *, float *, SLU::SuperMatrix *, SLU::SuperMatrix *, void *, int, SLU::SuperMatrix *, SLU::SuperMatrix *, @@ -184,6 +186,9 @@ namespace SLU { #endif extern void + dCompRow_to_CompCol(int, int, int, double*, int*, int*, + double **, int **, int **); + extern void dgssvx(SLU::superlu_options_t *, SLU::SuperMatrix *, int *, int *, int *, char *, double *, double *, SLU::SuperMatrix *, SLU::SuperMatrix *, void *, int, SLU::SuperMatrix *, SLU::SuperMatrix *, @@ -264,6 +269,9 @@ namespace SLU { #endif extern void + cCompRow_to_CompCol(int, int, int, complex*, int*, int*, + complex **, int **, int **); + extern void cgssvx(SLU::superlu_options_t *, SLU::SuperMatrix *, int *, int *, int *, char *, float *, float *, SLU::SuperMatrix *, SLU::SuperMatrix *, void *, int, SLU::SuperMatrix *, SLU::SuperMatrix *, @@ -343,6 +351,9 @@ namespace SLU { #endif extern void + zCompRow_to_CompCol(int, int, int, doublecomplex*, int*, int*, + doublecomplex **, int **, int **); + extern void zgssvx(SLU::superlu_options_t *, SLU::SuperMatrix *, int *, int *, int *, char *, double *, double *, SLU::SuperMatrix *, SLU::SuperMatrix *, void *, int, SLU::SuperMatrix *, SLU::SuperMatrix *, @@ -539,11 +550,14 @@ namespace Amesos2 { /** * \brief Creates a Superlu CCS matrix using the appropriate function */ - static void create_CompCol_Matrix(SLU::SuperMatrix* A, int m, int n, - int nnz, type_map::type* nzval, int* rowind, int* colptr, - SLU::Stype_t stype, SLU::Dtype_t dtype, SLU::Mtype_t mtype) + template + static void create_CompCol_Matrix(SLU::SuperMatrix* A, int m, int n, int nnz, + Teuchos::Array & convert_nzval, view_t & nzval, + int* rowind, int* colptr, + SLU::Stype_t stype, SLU::Dtype_t dtype, SLU::Mtype_t mtype) { - SLU::S::sCreate_CompCol_Matrix(A, m, n, nnz, nzval, rowind, colptr, + // conversion not necessay - pass view data directly + SLU::S::sCreate_CompCol_Matrix(A, m, n, nnz, nzval.data(), rowind, colptr, stype, dtype, mtype); } @@ -551,8 +565,8 @@ namespace Amesos2 { * \brief Creates a Superlu CRS matrix using the appropriate function */ static void create_CompRow_Matrix(SLU::SuperMatrix* A, int m, int n, - int nnz, type_map::type* nzval, int* rowind, int* colptr, - SLU::Stype_t stype, SLU::Dtype_t dtype, SLU::Mtype_t mtype) + int nnz, float* nzval, int* rowind, int* colptr, + SLU::Stype_t stype, SLU::Dtype_t dtype, SLU::Mtype_t mtype) { SLU::S::sCreate_CompRow_Matrix(A, m, n, nnz, nzval, rowind, colptr, stype, dtype, mtype); @@ -567,11 +581,21 @@ namespace Amesos2 { * \param x vals in column major order * \param ldx leading dimension of x */ + template static void create_Dense_Matrix(SLU::SuperMatrix* X, int m, int n, - type_map::type* x, int ldx, SLU::Stype_t stype, - SLU::Dtype_t dtype, SLU::Mtype_t mtype) + Teuchos::Array & convert_x, view_t & x, + int ldx, SLU::Stype_t stype, + SLU::Dtype_t dtype, SLU::Mtype_t mtype) { - SLU::S::sCreate_Dense_Matrix(X, m, n, x, ldx, stype, dtype, mtype); + // conversion not necessay - pass view data directly + SLU::S::sCreate_Dense_Matrix(X, m, n, x.data(), ldx, stype, dtype, mtype); + } + + template + static void convert_back_Dense_Matrix( + Teuchos::Array & convert_x, view_t & x) + { + // conversion not necessay - pass view data directly } /** @@ -684,27 +708,40 @@ namespace Amesos2 { stat, info); } - static void create_CompCol_Matrix(SLU::SuperMatrix* A, int m, int n, - int nnz, type_map::type* nzval, int* rowind, int* colptr, - SLU::Stype_t stype, SLU::Dtype_t dtype, SLU::Mtype_t mtype) + template + static void create_CompCol_Matrix(SLU::SuperMatrix* A, int m, int n, int nnz, + Teuchos::Array & convert_nzval, view_t & nzval, + int* rowind, int* colptr, + SLU::Stype_t stype, SLU::Dtype_t dtype, SLU::Mtype_t mtype) { - SLU::D::dCreate_CompCol_Matrix(A, m, n, nnz, nzval, rowind, colptr, + // conversion not necessay - pass view data directly + SLU::D::dCreate_CompCol_Matrix(A, m, n, nnz, nzval.data(), rowind, colptr, stype, dtype, mtype); } static void create_CompRow_Matrix(SLU::SuperMatrix* A, int m, int n, - int nnz, type_map::type* nzval, int* rowind, int* colptr, - SLU::Stype_t stype, SLU::Dtype_t dtype, SLU::Mtype_t mtype) + int nnz, double* nzval, int* rowind, int* colptr, + SLU::Stype_t stype, SLU::Dtype_t dtype, SLU::Mtype_t mtype) { SLU::D::dCreate_CompRow_Matrix(A, m, n, nnz, nzval, rowind, colptr, stype, dtype, mtype); } - static void create_Dense_Matrix(SLU::SuperMatrix* X, int m, - int n, type_map::type* x, int ldx, SLU::Stype_t stype, - SLU::Dtype_t dtype, SLU::Mtype_t mtype) + template + static void create_Dense_Matrix(SLU::SuperMatrix* X, int m, int n, + Teuchos::Array & convert_x, view_t & x, + int ldx, SLU::Stype_t stype, + SLU::Dtype_t dtype, SLU::Mtype_t mtype) { - SLU::D::dCreate_Dense_Matrix(X, m, n, x, ldx, stype, dtype, mtype); + // conversion not necessay - pass view data directly + SLU::D::dCreate_Dense_Matrix(X, m, n, x.data(), ldx, stype, dtype, mtype); + } + + template + static void convert_back_Dense_Matrix( + Teuchos::Array & convert_x, view_t & x) + { + // conversion not necessay - pass view data directly } static void gsequ(SLU::SuperMatrix* A, double* R, double* C, @@ -724,11 +761,8 @@ namespace Amesos2 { #ifdef HAVE_TEUCHOS_COMPLEX - /* The specializations for Teuchos::as<> for SLU::complex and - * SLU::doublecomplex are provided in Amesos2_Superlu_Type.hpp - */ template <> - struct FunctionMap + struct FunctionMap> { #ifdef HAVE_AMESOS2_SUPERLU5_API typedef typename SLU::C::GlobalLU_t GlobalLU_type; @@ -804,27 +838,54 @@ namespace Amesos2 { stat, info); } + template static void create_CompCol_Matrix(SLU::SuperMatrix* A, int m, int n, int nnz, - SLU::C::complex* nzval, int* rowind, int* colptr, - SLU::Stype_t stype, SLU::Dtype_t dtype, SLU::Mtype_t mtype) + Teuchos::Array & convert_nzval, view_t & nzval, + int* rowind, int* colptr, + SLU::Stype_t stype, SLU::Dtype_t dtype, SLU::Mtype_t mtype) { - SLU::C::cCreate_CompCol_Matrix(A, m, n, nnz, nzval, rowind, colptr, + convert_nzval.resize(nnz); + for(int i = 0; i < nnz; ++i) { + convert_nzval[i] = Teuchos::as(nzval(i)); + } + SLU::C::cCreate_CompCol_Matrix(A, m, n, nnz, convert_nzval.data(), rowind, colptr, stype, dtype, mtype); } static void create_CompRow_Matrix(SLU::SuperMatrix* A, int m, int n, int nnz, - SLU::C::complex* nzval, int* rowind, int* colptr, - SLU::Stype_t stype, SLU::Dtype_t dtype, SLU::Mtype_t mtype) + SLU::C::complex* nzval, int* rowind, int* colptr, + SLU::Stype_t stype, SLU::Dtype_t dtype, SLU::Mtype_t mtype) { SLU::C::cCreate_CompRow_Matrix(A, m, n, nnz, nzval, rowind, colptr, stype, dtype, mtype); } + template static void create_Dense_Matrix(SLU::SuperMatrix* X, int m, int n, - SLU::C::complex* x, int ldx, SLU::Stype_t stype, - SLU::Dtype_t dtype, SLU::Mtype_t mtype) + Teuchos::Array & convert_x, view_t & x, + int ldx, SLU::Stype_t stype, + SLU::Dtype_t dtype, SLU::Mtype_t mtype) + { + convert_x.resize(m * n); + int write_index = 0; + for(int j = 0; j < n; ++j) { + for(int i = 0; i < m; ++i) { // layout left + convert_x[write_index++] = Teuchos::as(x(i,j)); + } + } + SLU::C::cCreate_Dense_Matrix(X, m, n, convert_x.data(), ldx, stype, dtype, mtype); + } + + template + static void convert_back_Dense_Matrix( + Teuchos::Array & convert_x, view_t & x) { - SLU::C::cCreate_Dense_Matrix(X, m, n, x, ldx, stype, dtype, mtype); + int read_index = 0; + for(int j = 0; j < static_cast(x.extent(1)); ++j) { + for(int i = 0; i < static_cast(x.extent(0)); ++i) { // layout left + x(i,j) = Teuchos::as>(convert_x[read_index++]); + } + } } static void gsequ(SLU::SuperMatrix* A, float* R, float* C, @@ -842,7 +903,7 @@ namespace Amesos2 { template <> - struct FunctionMap + struct FunctionMap> { #ifdef HAVE_AMESOS2_SUPERLU5_API typedef typename SLU::Z::GlobalLU_t GlobalLU_type; @@ -918,11 +979,17 @@ namespace Amesos2 { stat, info); } + template static void create_CompCol_Matrix(SLU::SuperMatrix* A, int m, int n, int nnz, - SLU::Z::doublecomplex* nzval, int* rowind, int* colptr, - SLU::Stype_t stype, SLU::Dtype_t dtype, SLU::Mtype_t mtype) + Teuchos::Array & convert_nzval, view_t & nzval, + int* rowind, int* colptr, + SLU::Stype_t stype, SLU::Dtype_t dtype, SLU::Mtype_t mtype) { - SLU::Z::zCreate_CompCol_Matrix(A, m, n, nnz, nzval, rowind, colptr, + convert_nzval.resize(nnz); + for(int i = 0; i < nnz; ++i) { + convert_nzval[i] = Teuchos::as(nzval(i)); + } + SLU::Z::zCreate_CompCol_Matrix(A, m, n, nnz, convert_nzval.data(), rowind, colptr, stype, dtype, mtype); TEUCHOS_TEST_FOR_EXCEPTION( A == NULL, @@ -932,8 +999,8 @@ namespace Amesos2 { static void create_CompRow_Matrix(SLU::SuperMatrix* A, int m, int n, int nnz, - SLU::Z::doublecomplex* nzval, int* rowind, int* colptr, - SLU::Stype_t stype, SLU::Dtype_t dtype, SLU::Mtype_t mtype) + SLU::Z::doublecomplex* nzval, int* rowind, int* colptr, + SLU::Stype_t stype, SLU::Dtype_t dtype, SLU::Mtype_t mtype) { SLU::Z::zCreate_CompRow_Matrix(A, m, n, nnz, nzval, rowind, colptr, stype, dtype, mtype); @@ -943,11 +1010,32 @@ namespace Amesos2 { "Supermatrix A not initialized properly!"); } + template static void create_Dense_Matrix(SLU::SuperMatrix* X, int m, int n, - SLU::Z::doublecomplex* x, int ldx, SLU::Stype_t stype, - SLU::Dtype_t dtype, SLU::Mtype_t mtype) + Teuchos::Array & convert_x, view_t & x, + int ldx, SLU::Stype_t stype, + SLU::Dtype_t dtype, SLU::Mtype_t mtype) + { + convert_x.resize(m * n); + int write_index = 0; + for(int j = 0; j < n; ++j) { + for(int i = 0; i < m; ++i) { // layout left + convert_x[write_index++] = Teuchos::as(x(i,j)); + } + } + SLU::Z::zCreate_Dense_Matrix(X, m, n, convert_x.data(), ldx, stype, dtype, mtype); + } + + template + static void convert_back_Dense_Matrix( + Teuchos::Array & convert_x, view_t & x) { - SLU::Z::zCreate_Dense_Matrix(X, m, n, x, ldx, stype, dtype, mtype); + int read_index = 0; + for(int j = 0; j < static_cast(x.extent(1)); ++j) { + for(int i = 0; i < static_cast(x.extent(0)); ++i) { // layout left + x(i,j) = Teuchos::as>(convert_x[read_index++]); + } + } } static void gsequ(SLU::SuperMatrix* A, double* R, double* C, diff --git a/packages/amesos2/src/Amesos2_Superlu_TypeMap.cpp b/packages/amesos2/src/Amesos2_Superlu_TypeMap.cpp index 808e73e2d9e0..8689a4a007c0 100644 --- a/packages/amesos2/src/Amesos2_Superlu_TypeMap.cpp +++ b/packages/amesos2/src/Amesos2_Superlu_TypeMap.cpp @@ -63,21 +63,9 @@ namespace Amesos2 { SLU::Dtype_t TypeMap >::dtype = SLU::SLU_Z; - SLU::Dtype_t TypeMap::dtype = SLU::SLU_C; + SLU::Dtype_t TypeMap>::dtype = SLU::SLU_C; - SLU::Dtype_t TypeMap::dtype = SLU::SLU_Z; + SLU::Dtype_t TypeMap>::dtype = SLU::SLU_Z; #endif } - -#ifdef HAVE_TEUCHOS_COMPLEX -namespace std { - ostream& operator<<(ostream& out, const SLU::Z::doublecomplex z){ - return (out << "(" << z.r << "," << z.i << ")"); - } - - ostream& operator<<(ostream& out, const SLU::C::complex c){ - return (out << "(" << c.r << "," << c.i << ")"); - } -} -#endif diff --git a/packages/amesos2/src/Amesos2_Superlu_TypeMap.hpp b/packages/amesos2/src/Amesos2_Superlu_TypeMap.hpp index 77a46a47070c..1552bace824f 100644 --- a/packages/amesos2/src/Amesos2_Superlu_TypeMap.hpp +++ b/packages/amesos2/src/Amesos2_Superlu_TypeMap.hpp @@ -66,7 +66,6 @@ #include "Amesos2_TypeMap.hpp" - /* The SuperLU comples headers file only need to be included if complex has been enabled in Teuchos. In addition we only need to define the conversion and printing functions if complex has been @@ -92,65 +91,12 @@ namespace Z { #undef DCOMPLEX_INCLUDE #include "slu_dcomplex.h" // double-precision complex data type definitions } -#endif // HAVE_TEUCHOS_COMPLEX +#endif // HAVE_TEUCHOS_COMPLEX } // end extern "C" - // Declare and specialize a std::binary_funtion class for - // multiplication of SuperLU types - template - struct slu_mult {}; - - // This specialization handles the generic case were the scalar and - // magnitude types are double or float. - template - struct slu_mult : std::multiplies {}; - -#ifdef HAVE_TEUCHOS_COMPLEX - - // For namespace/macro reasons, we prefix our variables with amesos_* - template <> - struct slu_mult - : std::binary_function { - C::complex operator()(C::complex amesos_c, float amesos_f) { - C::complex amesos_cr; - cs_mult(&amesos_cr, &amesos_c, amesos_f); // cs_mult is a macro, so no namespacing - return( amesos_cr ); - } - }; - - template <> - struct slu_mult - : std::binary_function { - C::complex operator()(C::complex amesos_c1, C::complex amesos_c2) { - C::complex amesos_cr; - cc_mult(&amesos_cr, &amesos_c1, &amesos_c2); // cc_mult is a macro, so no namespacing - return( amesos_cr ); - } - }; - - template <> - struct slu_mult - : std::binary_function { - Z::doublecomplex operator()(Z::doublecomplex amesos_z, double amesos_d) { - Z::doublecomplex amesos_zr; - zd_mult(&amesos_zr, &amesos_z, amesos_d); // zd_mult is a macro, so no namespacing - return( amesos_zr ); - } - }; - - template <> - struct slu_mult - : std::binary_function { - Z::doublecomplex operator()(Z::doublecomplex amesos_z1, Z::doublecomplex amesos_z2) { - Z::doublecomplex amesos_zr; - zz_mult(&amesos_zr, &amesos_z1, &amesos_z2); // zz_mult is a macro, so no namespacing - return( amesos_zr ); - } - }; - -#endif // HAVE_TEUCHOS_COMPLEX } // end namespace SLU + #ifdef HAVE_TEUCHOS_COMPLEX /* ==================== Conversion ==================== */ @@ -160,213 +106,80 @@ namespace Teuchos { * \defgroup slu_conversion Conversion definitions for SLU types. * * Define specializations of Teuchos::as<> for the SLU types. - * - * These specializations are meant to work with any complex data type that - * implements the same interface as the STL complex type. - * * @{ */ template <> -class ValueTypeConversionTraits> -{ -public: - static SLU::C::complex convert( const std::complex t ) - { - SLU::C::complex ret; - ret.r = Teuchos::as(t.real()); - ret.i = Teuchos::as(t.imag()); - return( ret ); - } - - static SLU::C::complex safeConvert( const std::complex t ) - { - SLU::C::complex ret; - ret.r = Teuchos::as(t.real()); - ret.i = Teuchos::as(t.imag()); - return( ret ); - } -}; - -template <> -class ValueTypeConversionTraits> -{ -public: - static SLU::C::complex convert( const std::complex t ) - { - SLU::C::complex ret; - ret.r = Teuchos::as(t.real()); - ret.i = Teuchos::as(t.imag()); - return( ret ); - } - - static SLU::C::complex safeConvert( const std::complex t ) - { - SLU::C::complex ret; - ret.r = Teuchos::as(t.real()); - ret.i = Teuchos::as(t.imag()); - return( ret ); - } -}; - - -template <> -class ValueTypeConversionTraits> +class ValueTypeConversionTraits> { public: - static SLU::Z::doublecomplex convert( const std::complex t ) - { - SLU::Z::doublecomplex ret; - ret.r = Teuchos::as(t.real()); - ret.i = Teuchos::as(t.imag()); - return( ret ); - } - - static SLU::Z::doublecomplex safeConvert( const std::complex t ) - { - SLU::Z::doublecomplex ret; - ret.r = Teuchos::as(t.real()); - ret.i = Teuchos::as(t.imag()); - return( ret ); - } + static SLU::C::complex convert( const Kokkos::complex t ) { + SLU::C::complex ret; + ret.r = t.real(); + ret.i = t.imag(); + return( ret ); + } + + static SLU::C::complex safeConvert( const Kokkos::complex t ) { + SLU::C::complex ret; + ret.r = t.real(); + ret.i = t.imag(); + return( ret ); + } }; template <> -class ValueTypeConversionTraits> +class ValueTypeConversionTraits> { public: - static SLU::Z::doublecomplex convert( const std::complex t ) - { - SLU::Z::doublecomplex ret; - ret.r = Teuchos::as(t.real()); - ret.i = Teuchos::as(t.imag()); - return( ret ); - } - - static SLU::Z::doublecomplex safeConvert( const std::complex t ) - { - SLU::Z::doublecomplex ret; - ret.r = Teuchos::as(t.real()); - ret.i = Teuchos::as(t.imag()); - return( ret ); - } + static SLU::Z::doublecomplex convert( const Kokkos::complex t ) { + SLU::Z::doublecomplex ret; + ret.r = t.real(); + ret.i = t.imag(); + return( ret ); + } + + static SLU::Z::doublecomplex safeConvert( const Kokkos::complex t ) { + SLU::Z::doublecomplex ret; + ret.r = t.real(); + ret.i = t.imag(); + return( ret ); + } }; - // Also convert from SLU types template <> -class ValueTypeConversionTraits, SLU::C::complex> +class ValueTypeConversionTraits, SLU::C::complex> { public: - static std::complex convert( const SLU::C::complex t ) - { - typedef typename std::complex::value_type value_type; - value_type ret_r = Teuchos::as( t.r ); - value_type ret_i = Teuchos::as( t.i ); - return ( std::complex( ret_r, ret_i ) ); - } - - // No special checks for safe Convert - static std::complex safeConvert( const SLU::C::complex t ) - { - typedef typename std::complex::value_type value_type; - value_type ret_r = Teuchos::as( t.r ); - value_type ret_i = Teuchos::as( t.i ); - return ( std::complex( ret_r, ret_i ) ); - } -}; + static Kokkos::complex convert( const SLU::C::complex t ) { + return ( Kokkos::complex( t.r, t.i ) ); + } -template <> -class ValueTypeConversionTraits, SLU::C::complex> -{ -public: - static std::complex convert( const SLU::C::complex t ) - { - typedef typename std::complex::value_type value_type; - value_type ret_r = Teuchos::as( t.r ); - value_type ret_i = Teuchos::as( t.i ); - return ( std::complex( ret_r, ret_i ) ); - } - - // No special checks for safe Convert - static std::complex safeConvert( const SLU::C::complex t ) - { - typedef typename std::complex::value_type value_type; - value_type ret_r = Teuchos::as( t.r ); - value_type ret_i = Teuchos::as( t.i ); - return ( std::complex( ret_r, ret_i ) ); - } + static Kokkos::complex safeConvert( const SLU::C::complex t ) { + return ( Kokkos::complex( t.r, t.i ) ); + } }; - template <> -class ValueTypeConversionTraits, SLU::Z::doublecomplex> +class ValueTypeConversionTraits, SLU::Z::doublecomplex> { public: - static std::complex convert( const SLU::Z::doublecomplex t ) - { - typedef typename std::complex::value_type value_type; - value_type ret_r = Teuchos::as( t.r ); - value_type ret_i = Teuchos::as( t.i ); - return ( std::complex( ret_r, ret_i ) ); - } - - // No special checks for safe Convert - static std::complex safeConvert( const SLU::Z::doublecomplex t ) - { - typedef typename std::complex::value_type value_type; - value_type ret_r = Teuchos::as( t.r ); - value_type ret_i = Teuchos::as( t.i ); - return ( std::complex( ret_r, ret_i ) ); - } -}; + static Kokkos::complex convert( const SLU::Z::doublecomplex t ) { + return ( Kokkos::complex( t.r, t.i ) ); + } -template <> -class ValueTypeConversionTraits, SLU::Z::doublecomplex> -{ -public: - static std::complex convert( const SLU::Z::doublecomplex t ) - { - typedef typename std::complex::value_type value_type; - value_type ret_r = Teuchos::as( t.r ); - value_type ret_i = Teuchos::as( t.i ); - return ( std::complex( ret_r, ret_i ) ); - } - - // No special checks for safe Convert - static std::complex safeConvert( const SLU::Z::doublecomplex t ) - { - typedef typename std::complex::value_type value_type; - value_type ret_r = Teuchos::as( t.r ); - value_type ret_i = Teuchos::as( t.i ); - return ( std::complex( ret_r, ret_i ) ); - } + static Kokkos::complex safeConvert( const SLU::Z::doublecomplex t ) { + return ( Kokkos::complex( t.r, t.i ) ); + } }; -template -class SerializationTraits - : public DirectSerializationTraits -{}; - -template -class SerializationTraits - : public DirectSerializationTraits -{}; - //@} End Conversion group } // end namespace Teuchos -// C++-style output functions for Superlu complex types -namespace std { - ostream& operator<<(ostream& out, const SLU::Z::doublecomplex z); - - ostream& operator<<(ostream& out, const SLU::C::complex c); -} - -#endif // HAVE_TEUCHOS_COMPLEX - +#endif // HAVE_TEUCHOS_COMPLEX namespace Amesos2 { @@ -380,6 +193,7 @@ template <> struct TypeMap { static SLU::Dtype_t dtype; + typedef float convert_type; typedef float type; typedef float magnitude_type; }; @@ -389,6 +203,7 @@ template <> struct TypeMap { static SLU::Dtype_t dtype; + typedef double convert_type; typedef double type; typedef double magnitude_type; }; @@ -400,7 +215,8 @@ template <> struct TypeMap > { static SLU::Dtype_t dtype; - typedef SLU::C::complex type; + typedef SLU::C::complex convert_type; // to create array before calling superlu + typedef Kokkos::complex type; typedef float magnitude_type; }; @@ -409,25 +225,28 @@ template <> struct TypeMap > { static SLU::Dtype_t dtype; - typedef SLU::Z::doublecomplex type; + typedef SLU::Z::doublecomplex convert_type; // to create array before calling superlu + typedef Kokkos::complex type; typedef double magnitude_type; }; template <> -struct TypeMap +struct TypeMap > { static SLU::Dtype_t dtype; - typedef SLU::C::complex type; + typedef SLU::C::complex convert_type; // to create array before calling superlu + typedef Kokkos::complex type; typedef float magnitude_type; }; template <> -struct TypeMap +struct TypeMap > { static SLU::Dtype_t dtype; - typedef SLU::Z::doublecomplex type; + typedef SLU::Z::doublecomplex convert_type; // to create array before calling superlu + typedef Kokkos::complex type; typedef double magnitude_type; }; diff --git a/packages/amesos2/src/Amesos2_Superlu_decl.hpp b/packages/amesos2/src/Amesos2_Superlu_decl.hpp index c21b23b6ea1a..62d4dec96c48 100644 --- a/packages/amesos2/src/Amesos2_Superlu_decl.hpp +++ b/packages/amesos2/src/Amesos2_Superlu_decl.hpp @@ -57,6 +57,9 @@ #include "Amesos2_SolverCore.hpp" #include "Amesos2_Superlu_FunctionMap.hpp" +#if defined(KOKKOSKERNELS_ENABLE_SUPERNODAL_SPTRSV) && defined(KOKKOSKERNELS_ENABLE_TPL_SUPERLU) +#include "KokkosKernels_Handle.hpp" +#endif namespace Amesos2 { @@ -97,6 +100,7 @@ class Superlu : public SolverCore * - the corresponding type to use for magnitude */ typedef typename type_map::type slu_type; + typedef typename type_map::convert_type slu_convert_type; typedef typename type_map::magnitude_type magnitude_type; typedef FunctionMap function_map; @@ -232,6 +236,7 @@ class Superlu : public SolverCore */ bool loadA_impl(EPhase current_phase); + typedef Kokkos::DefaultHostExecutionSpace HostExecSpaceType; // struct holds all data necessary to make a superlu factorization or solve call mutable struct SLUData { @@ -245,13 +250,21 @@ class Superlu : public SolverCore #endif SLU::SuperLUStat_t stat; - Teuchos::Array berr; ///< backward error bounds - Teuchos::Array ferr; ///< forward error bounds - Teuchos::Array perm_r; - Teuchos::Array perm_c; - Teuchos::Array etree; - Teuchos::Array R; - Teuchos::Array C; + + + typedef Kokkos::View host_mag_array; + typedef Kokkos::View host_int_array; + host_mag_array berr; ///< backward error bounds + host_mag_array ferr; ///< forward error bounds + host_int_array perm_r; + host_int_array perm_c; + host_int_array etree; + host_mag_array R; + host_mag_array C; + +#if defined(KOKKOSKERNELS_ENABLE_SUPERNODAL_SPTRSV) && defined(KOKKOSKERNELS_ENABLE_TPL_SUPERLU) + host_int_array parents; +#endif char equed; bool rowequ, colequ; // flags what type of equilibration @@ -261,18 +274,61 @@ class Superlu : public SolverCore int panel_size; } data_; + typedef int size_type; + typedef int ordinal_type; + typedef Kokkos::View host_size_type_array; + typedef Kokkos::View host_ordinal_type_array; + typedef Kokkos::View host_value_type_array; + // The following Arrays are persisting storage arrays for A, X, and B /// Stores the values of the nonzero entries for SuperLU - Teuchos::Array nzvals_; + host_value_type_array host_nzvals_view_; + Teuchos::Array convert_nzvals_; // copy to SuperLU native array before calling SuperLU + /// Stores the location in \c Ai_ and Aval_ that starts row j - Teuchos::Array rowind_; + host_size_type_array host_rows_view_; /// Stores the row indices of the nonzero entries - Teuchos::Array colptr_; + host_ordinal_type_array host_col_ptr_view_; + + typedef typename Kokkos::View + host_solve_array_t; /// Persisting 1D store for X - Teuchos::Array xvals_; int ldx_; + mutable host_solve_array_t host_xValues_; + mutable Teuchos::Array convert_xValues_; // copy to SuperLU native array before calling SuperLU + int ldx_; + /// Persisting 1D store for B - Teuchos::Array bvals_; int ldb_; + mutable host_solve_array_t host_bValues_; + mutable Teuchos::Array convert_bValues_; // copy to SuperLU native array before calling SuperLU + int ldb_; + +#if defined(KOKKOSKERNELS_ENABLE_SUPERNODAL_SPTRSV) && defined(KOKKOSKERNELS_ENABLE_TPL_SUPERLU) + typedef Kokkos::DefaultExecutionSpace DeviceExecSpaceType; + + #ifdef KOKKOS_ENABLE_CUDA + // solver will be UVM off even though Tpetra is CudaUVMSpace + typedef typename Kokkos::CudaSpace DeviceMemSpaceType; + #else + typedef typename DeviceExecSpaceType::memory_space DeviceMemSpaceType; + #endif + + typedef Kokkos::View + device_solve_array_t; + // For triangular solves we have both host and device versions of xValues and + // bValues because a parameter can turn it on or off. + mutable device_solve_array_t device_xValues_; + mutable device_solve_array_t device_bValues_; + typedef Kokkos::View device_int_array; + device_int_array device_trsv_perm_r_; + device_int_array device_trsv_perm_c_; + mutable device_solve_array_t device_trsv_rhs_; + mutable device_solve_array_t device_trsv_sol_; + typedef KokkosKernels::Experimental::KokkosKernelsHandle kernel_handle_type; + mutable kernel_handle_type device_khL_; + mutable kernel_handle_type device_khU_; +#endif /* Note: In the above, must use "Amesos2::Superlu" rather than * "Superlu" because otherwise the compiler references the @@ -305,6 +361,12 @@ class Superlu : public SolverCore bool ILU_Flag_; bool is_contiguous_; + bool use_triangular_solves_; + + void triangular_solve_factor(); + + public: // for GPU + void triangular_solve() const; // Only for internal use - public to support kernels }; // End class Superlu @@ -312,17 +374,21 @@ class Superlu : public SolverCore template <> struct solver_traits { #ifdef HAVE_TEUCHOS_COMPLEX - typedef Meta::make_list6, - std::complex, - SLU::C::complex, - SLU::Z::doublecomplex> supported_scalars; + typedef Meta::make_list6, std::complex, + Kokkos::complex, Kokkos::complex> + supported_scalars; #else typedef Meta::make_list2 supported_scalars; #endif }; +template +struct solver_supports_matrix> { + static const bool value = true; +}; + } // end namespace Amesos2 #endif // AMESOS2_SUPERLU_DECL_HPP diff --git a/packages/amesos2/src/Amesos2_Superlu_def.hpp b/packages/amesos2/src/Amesos2_Superlu_def.hpp index 3beab666fee7..9fc4cbc10074 100644 --- a/packages/amesos2/src/Amesos2_Superlu_def.hpp +++ b/packages/amesos2/src/Amesos2_Superlu_def.hpp @@ -60,6 +60,16 @@ #include "Amesos2_SolverCore_def.hpp" #include "Amesos2_Superlu_decl.hpp" +#if defined(KOKKOSKERNELS_ENABLE_SUPERNODAL_SPTRSV) && defined(KOKKOSKERNELS_ENABLE_TPL_SUPERLU) +// TODO: This 'using namespace SLU' is not a good thing. +// It was added because kernels does not namespace SuperLU but Amesos2 does. +// Declaring the namespace SLU allows us to reuse that file without duplication. +// We need to determine a uniform system to avoid this this but for now, at least +// this issue is only present when TRSV is enabled. +using namespace SLU; +#include "KokkosSparse_sptrsv_superlu.hpp" +#endif + namespace Amesos2 { @@ -69,10 +79,8 @@ Superlu::Superlu( Teuchos::RCP X, Teuchos::RCP B ) : SolverCore(A, X, B) - , nzvals_() // initialize to empty arrays - , rowind_() - , colptr_() - , is_contiguous_(true) + , is_contiguous_(true) // default is set by params + , use_triangular_solves_(false) // default is set by params { // ilu_set_default_options is called later in set parameter list if required. // This is not the ideal way, but the other option to always call @@ -85,11 +93,11 @@ Superlu::Superlu( SLU::StatInit(&(data_.stat)); - data_.perm_r.resize(this->globalNumRows_); - data_.perm_c.resize(this->globalNumCols_); - data_.etree.resize(this->globalNumCols_); - data_.R.resize(this->globalNumRows_); - data_.C.resize(this->globalNumCols_); + Kokkos::resize(data_.perm_r, this->globalNumRows_); + Kokkos::resize(data_.perm_c, this->globalNumCols_); + Kokkos::resize(data_.etree, this->globalNumCols_); + Kokkos::resize(data_.R, this->globalNumRows_); + Kokkos::resize(data_.C, this->globalNumCols_); data_.relax = SLU::sp_ienv(2); // Query optimal relax param from superlu data_.panel_size = SLU::sp_ienv(1); // Query optimal panel size @@ -199,7 +207,7 @@ Superlu::preOrdering_impl() Teuchos::TimeMonitor preOrderTimer(this->timers_.preOrderTime_); #endif - SLU::get_perm_c(permc_spec, &(data_.A), data_.perm_c.getRawPtr()); + SLU::get_perm_c(permc_spec, &(data_.A), data_.perm_c.data()); } return(0); @@ -263,8 +271,8 @@ Superlu::numericFactorization_impl() int info2 = 0; // calculate row and column scalings - function_map::gsequ(&(data_.A), data_.R.getRawPtr(), - data_.C.getRawPtr(), &rowcnd, &colcnd, + function_map::gsequ(&(data_.A), data_.R.data(), + data_.C.data(), &rowcnd, &colcnd, &amax, &info2); TEUCHOS_TEST_FOR_EXCEPTION (info2 < 0, std::runtime_error, @@ -295,8 +303,8 @@ Superlu::numericFactorization_impl() } // apply row and column scalings if necessary - function_map::laqgs(&(data_.A), data_.R.getRawPtr(), - data_.C.getRawPtr(), rowcnd, colcnd, + function_map::laqgs(&(data_.A), data_.R.data(), + data_.C.data(), rowcnd, colcnd, amax, &(data_.equed)); // // check what types of equilibration was actually done @@ -306,8 +314,8 @@ Superlu::numericFactorization_impl() // Apply the column permutation computed in preOrdering. Place the // column-permuted matrix in AC - SLU::sp_preorder(&(data_.options), &(data_.A), data_.perm_c.getRawPtr(), - data_.etree.getRawPtr(), &(data_.AC)); + SLU::sp_preorder(&(data_.options), &(data_.A), data_.perm_c.data(), + data_.etree.data(), &(data_.AC)); { // Do factorization #ifdef HAVE_AMESOS2_TIMERS @@ -323,8 +331,8 @@ Superlu::numericFactorization_impl() if(ILU_Flag_==false) { function_map::gstrf(&(data_.options), &(data_.AC), - data_.relax, data_.panel_size, data_.etree.getRawPtr(), - NULL, 0, data_.perm_c.getRawPtr(), data_.perm_r.getRawPtr(), + data_.relax, data_.panel_size, data_.etree.data(), + NULL, 0, data_.perm_c.data(), data_.perm_r.data(), &(data_.L), &(data_.U), #ifdef HAVE_AMESOS2_SUPERLU5_API &(data_.lu), @@ -333,8 +341,8 @@ Superlu::numericFactorization_impl() } else { function_map::gsitrf(&(data_.options), &(data_.AC), - data_.relax, data_.panel_size, data_.etree.getRawPtr(), - NULL, 0, data_.perm_c.getRawPtr(), data_.perm_r.getRawPtr(), + data_.relax, data_.panel_size, data_.etree.data(), + NULL, 0, data_.perm_c.data(), data_.perm_r.data(), &(data_.L), &(data_.U), #ifdef HAVE_AMESOS2_SUPERLU5_API &(data_.lu), @@ -365,6 +373,10 @@ Superlu::numericFactorization_impl() data_.options.Fact = SLU::FACTORED; same_symbolic_ = true; + if(use_triangular_solves_) { + triangular_solve_factor(); + } + return(info); } @@ -379,26 +391,62 @@ Superlu::solve_impl(const Teuchos::Ptr > const global_size_type ld_rhs = this->root_ ? X->getGlobalLength() : 0; const size_t nrhs = X->getGlobalNumVectors(); - const size_t val_store_size = as(ld_rhs * nrhs); - Teuchos::Array xValues(val_store_size); - Teuchos::Array bValues(val_store_size); - { // Get values from RHS B #ifdef HAVE_AMESOS2_TIMERS Teuchos::TimeMonitor mvConvTimer(this->timers_.vecConvTime_); Teuchos::TimeMonitor redistTimer( this->timers_.vecRedistTime_ ); #endif - if ( is_contiguous_ == true ) { - Util::get_1d_copy_helper, - slu_type>::do_get(B, bValues(), + + // In general we may want to write directly to the x space without a copy. + // So we 'get' x which may be a direct view assignment to the MV. + if(use_triangular_solves_) { // to device +#if defined(KOKKOSKERNELS_ENABLE_SUPERNODAL_SPTRSV) && defined(KOKKOSKERNELS_ENABLE_TPL_SUPERLU) + Util::get_1d_copy_helper_kokkos_view, + device_solve_array_t>::do_get(X, device_xValues_, as(ld_rhs), - ROOTED, this->rowIndexBase_); + (is_contiguous_ == true) ? ROOTED : CONTIGUOUS_AND_ROOTED, + this->rowIndexBase_); + Util::get_1d_copy_helper_kokkos_view, + device_solve_array_t>::do_get(B, device_bValues_, + as(ld_rhs), + (is_contiguous_ == true) ? ROOTED : CONTIGUOUS_AND_ROOTED, + this->rowIndexBase_); +#endif } - else { - Util::get_1d_copy_helper, - slu_type>::do_get(B, bValues(), + else { // to host + Util::get_1d_copy_helper_kokkos_view, + host_solve_array_t>::do_get(X, host_xValues_, as(ld_rhs), - CONTIGUOUS_AND_ROOTED, this->rowIndexBase_); + (is_contiguous_ == true) ? ROOTED : CONTIGUOUS_AND_ROOTED, + this->rowIndexBase_); + Util::get_1d_copy_helper_kokkos_view, + host_solve_array_t>::do_get(B, host_bValues_, + as(ld_rhs), + (is_contiguous_ == true) ? ROOTED : CONTIGUOUS_AND_ROOTED, + this->rowIndexBase_); + } + } + + // If equilibration was applied at numeric, then gssvx and gsisx are going to + // modify B, so we can't use the optimized assignment to B since we'll change + // the source test vector and then fail the subsequent cycle. We need a copy. + // TODO: If above get_1d_copy_helper_kokkos_view already copied then we can + // skip this. Generally need an API which tells us what happened internally + // in above get_1d_copy_helper_kokkos_view - whether is was copy or assign. + if(data_.equed != 'N') { + if(use_triangular_solves_) { // to device +#if defined(KOKKOSKERNELS_ENABLE_SUPERNODAL_SPTRSV) && defined(KOKKOSKERNELS_ENABLE_TPL_SUPERLU) + device_solve_array_t copyB(Kokkos::ViewAllocateWithoutInitializing("copyB"), + device_bValues_.extent(0), device_bValues_.extent(1)); + Kokkos::deep_copy(copyB, device_bValues_); + device_bValues_ = copyB; +#endif + } + else { + host_solve_array_t copyB(Kokkos::ViewAllocateWithoutInitializing("copyB"), + host_bValues_.extent(0), host_bValues_.extent(1)); + Kokkos::deep_copy(copyB, host_bValues_); + host_bValues_ = copyB; } } @@ -406,55 +454,74 @@ Superlu::solve_impl(const Teuchos::Ptr > magnitude_type rpg, rcond; if ( this->root_ ) { - data_.ferr.resize(nrhs); - data_.berr.resize(nrhs); - - { -#ifdef HAVE_AMESOS2_TIMERS - Teuchos::TimeMonitor mvConvTimer(this->timers_.vecConvTime_); -#endif - SLU::Dtype_t dtype = type_map::dtype; - int i_ld_rhs = as(ld_rhs); - function_map::create_Dense_Matrix(&(data_.B), i_ld_rhs, as(nrhs), - bValues.getRawPtr(), i_ld_rhs, - SLU::SLU_DN, dtype, SLU::SLU_GE); - function_map::create_Dense_Matrix(&(data_.X), i_ld_rhs, as(nrhs), - xValues.getRawPtr(), i_ld_rhs, - SLU::SLU_DN, dtype, SLU::SLU_GE); - } - // Note: the values of B and X (after solution) are adjusted // appropriately within gssvx for row and column scalings. - { // Do solve! #ifdef HAVE_AMESOS2_TIMERS Teuchos::TimeMonitor solveTimer(this->timers_.solveTime_); #endif - if(ILU_Flag_==false) { - function_map::gssvx(&(data_.options), &(data_.A), - data_.perm_c.getRawPtr(), data_.perm_r.getRawPtr(), - data_.etree.getRawPtr(), &(data_.equed), data_.R.getRawPtr(), - data_.C.getRawPtr(), &(data_.L), &(data_.U), NULL, 0, &(data_.B), - &(data_.X), &rpg, &rcond, data_.ferr.getRawPtr(), - data_.berr.getRawPtr(), -#ifdef HAVE_AMESOS2_SUPERLU5_API - &(data_.lu), -#endif - &(data_.mem_usage), &(data_.stat), &ierr); + if(use_triangular_solves_) { + triangular_solve(); } else { - function_map::gsisx(&(data_.options), &(data_.A), - data_.perm_c.getRawPtr(), data_.perm_r.getRawPtr(), - data_.etree.getRawPtr(), &(data_.equed), data_.R.getRawPtr(), - data_.C.getRawPtr(), &(data_.L), &(data_.U), NULL, 0, &(data_.B), - &(data_.X), &rpg, &rcond, -#ifdef HAVE_AMESOS2_SUPERLU5_API - &(data_.lu), -#endif - &(data_.mem_usage), &(data_.stat), &ierr); + Kokkos::resize(data_.ferr, nrhs); + Kokkos::resize(data_.berr, nrhs); + + { + #ifdef HAVE_AMESOS2_TIMERS + Teuchos::TimeMonitor mvConvTimer(this->timers_.vecConvTime_); + #endif + SLU::Dtype_t dtype = type_map::dtype; + int i_ld_rhs = as(ld_rhs); + function_map::create_Dense_Matrix(&(data_.B), i_ld_rhs, as(nrhs), + convert_bValues_, host_bValues_, i_ld_rhs, + SLU::SLU_DN, dtype, SLU::SLU_GE); + function_map::create_Dense_Matrix(&(data_.X), i_ld_rhs, as(nrhs), + convert_xValues_, host_xValues_, i_ld_rhs, + SLU::SLU_DN, dtype, SLU::SLU_GE); + } + + if(ILU_Flag_==false) { + function_map::gssvx(&(data_.options), &(data_.A), + data_.perm_c.data(), data_.perm_r.data(), + data_.etree.data(), &(data_.equed), data_.R.data(), + data_.C.data(), &(data_.L), &(data_.U), NULL, 0, &(data_.B), + &(data_.X), &rpg, &rcond, data_.ferr.data(), + data_.berr.data(), + #ifdef HAVE_AMESOS2_SUPERLU5_API + &(data_.lu), + #endif + &(data_.mem_usage), &(data_.stat), &ierr); + } + else { + function_map::gsisx(&(data_.options), &(data_.A), + data_.perm_c.data(), data_.perm_r.data(), + data_.etree.data(), &(data_.equed), data_.R.data(), + data_.C.data(), &(data_.L), &(data_.U), NULL, 0, &(data_.B), + &(data_.X), &rpg, &rcond, + #ifdef HAVE_AMESOS2_SUPERLU5_API + &(data_.lu), + #endif + &(data_.mem_usage), &(data_.stat), &ierr); + } + + // Cleanup X and B stores + SLU::Destroy_SuperMatrix_Store( &(data_.X) ); + SLU::Destroy_SuperMatrix_Store( &(data_.B) ); + data_.X.Store = NULL; + data_.B.Store = NULL; } + } // do solve + + // convert back to Kokkos views + { +#ifdef HAVE_AMESOS2_TIMERS + Teuchos::TimeMonitor mvConvTimer(this->timers_.vecConvTime_); +#endif + function_map::convert_back_Dense_Matrix(convert_bValues_, host_bValues_); + function_map::convert_back_Dense_Matrix(convert_xValues_, host_xValues_); } // Cleanup X and B stores @@ -485,18 +552,23 @@ Superlu::solve_impl(const Teuchos::Ptr > Teuchos::TimeMonitor redistTimer(this->timers_.vecRedistTime_); #endif - if ( is_contiguous_ == true ) { - Util::put_1d_data_helper< - MultiVecAdapter,slu_type>::do_put(X, xValues(), - as(ld_rhs), - ROOTED, this->rowIndexBase_); - } - else { - Util::put_1d_data_helper< - MultiVecAdapter,slu_type>::do_put(X, xValues(), - as(ld_rhs), - CONTIGUOUS_AND_ROOTED, this->rowIndexBase_); - } + if(use_triangular_solves_) { // to device +#if defined(KOKKOSKERNELS_ENABLE_SUPERNODAL_SPTRSV) && defined(KOKKOSKERNELS_ENABLE_TPL_SUPERLU) + Util::put_1d_data_helper_kokkos_view< + MultiVecAdapter,device_solve_array_t>::do_put(X, device_xValues_, + as(ld_rhs), + (is_contiguous_ == true) ? ROOTED : CONTIGUOUS_AND_ROOTED, + this->rowIndexBase_); +#endif + } + else { + Util::put_1d_data_helper_kokkos_view< + MultiVecAdapter,host_solve_array_t>::do_put(X, host_xValues_, + as(ld_rhs), + (is_contiguous_ == true) ? ROOTED : CONTIGUOUS_AND_ROOTED, + this->rowIndexBase_); + } + } @@ -594,8 +666,14 @@ Superlu::setParameters_impl(const Teuchos::RCPget("ILU_FillTol", 0.01); - if( parameterList->isParameter("IsContiguous") ){ - is_contiguous_ = parameterList->get("IsContiguous"); + is_contiguous_ = parameterList->get("IsContiguous", true); + use_triangular_solves_ = parameterList->get("Enable_KokkosKernels_TriangularSolves", false); + + if(use_triangular_solves_) { +#if not defined(KOKKOSKERNELS_ENABLE_SUPERNODAL_SPTRSV) || not defined(KOKKOSKERNELS_ENABLE_TPL_SUPERLU) + TEUCHOS_TEST_FOR_EXCEPTION(true, std::runtime_error, + "Calling for triangular solves but KokkosKernels_ENABLE_SUPERNODAL_SPTRSV and KokkosKernels_ENABLE_TPL_SUPERLU were not configured." ); +#endif } } @@ -717,6 +795,8 @@ Superlu::getValidParameters_impl() const pl->set("ILU_Flag", false, "ILU flag: if true, run ILU routines"); + pl->set("Enable_KokkosKernels_TriangularSolves", false, "Whether to use triangular solves."); + pl->set("IsContiguous", true, "Whether GIDs contiguous"); valid_params = pl; @@ -747,9 +827,9 @@ Superlu::loadA_impl(EPhase current_phase) // Only the root image needs storage allocated if( this->root_ ){ - nzvals_.resize(this->globalNumNonZeros_); - rowind_.resize(this->globalNumNonZeros_); - colptr_.resize(this->globalNumCols_ + 1); + Kokkos::resize(host_nzvals_view_, this->globalNumNonZeros_); + Kokkos::resize(host_rows_view_, this->globalNumNonZeros_); + Kokkos::resize(host_col_ptr_view_, this->globalNumRows_ + 1); } int nnz_ret = 0; @@ -763,18 +843,20 @@ Superlu::loadA_impl(EPhase current_phase) "Row and column maps have different indexbase "); if ( is_contiguous_ == true ) { - Util::get_ccs_helper< - MatrixAdapter,slu_type,int,int>::do_get(this->matrixA_.ptr(), - nzvals_(), rowind_(), - colptr_(), nnz_ret, ROOTED, + Util::get_ccs_helper_kokkos_view< + MatrixAdapter,host_value_type_array,host_ordinal_type_array, + host_size_type_array>::do_get(this->matrixA_.ptr(), + host_nzvals_view_, host_rows_view_, + host_col_ptr_view_, nnz_ret, ROOTED, ARBITRARY, this->rowIndexBase_); } else { - Util::get_ccs_helper< - MatrixAdapter,slu_type,int,int>::do_get(this->matrixA_.ptr(), - nzvals_(), rowind_(), - colptr_(), nnz_ret, CONTIGUOUS_AND_ROOTED, + Util::get_ccs_helper_kokkos_view< + MatrixAdapter,host_value_type_array,host_ordinal_type_array, + host_size_type_array>::do_get(this->matrixA_.ptr(), + host_nzvals_view_, host_rows_view_, + host_col_ptr_view_, nnz_ret, CONTIGUOUS_AND_ROOTED, ARBITRARY, this->rowIndexBase_); } @@ -788,18 +870,133 @@ Superlu::loadA_impl(EPhase current_phase) std::runtime_error, "Did not get the expected number of non-zero vals"); - function_map::create_CompCol_Matrix( &(data_.A), + function_map::template create_CompCol_Matrix( &(data_.A), this->globalNumRows_, this->globalNumCols_, nnz_ret, - nzvals_.getRawPtr(), - rowind_.getRawPtr(), - colptr_.getRawPtr(), + convert_nzvals_, host_nzvals_view_, + host_rows_view_.data(), + host_col_ptr_view_.data(), SLU::SLU_NC, dtype, SLU::SLU_GE); } return true; } +template +void +Superlu::triangular_solve_factor() +{ +#if defined(KOKKOSKERNELS_ENABLE_SUPERNODAL_SPTRSV) && defined(KOKKOSKERNELS_ENABLE_TPL_SUPERLU) + size_t ld_rhs = this->matrixA_->getGlobalNumRows(); + + // convert etree to parents + SLU::SCformat * Lstore = (SLU::SCformat*)(data_.L.Store); + int nsuper = 1 + Lstore->nsuper; // # of supernodal columns + Kokkos::resize(data_.parents, nsuper); + for (int s = 0; s < nsuper; s++) { + int j = Lstore->sup_to_col[s+1]-1; // the last column index of this supernode + if (data_.etree[j] == static_cast(ld_rhs)) { + data_.parents(s) = -1; + } else { + data_.parents(s) = Lstore->col_to_sup[data_.etree[j]]; + } + } + + deep_copy_or_assign_view(device_trsv_perm_r_, data_.perm_r); // will use device to permute + deep_copy_or_assign_view(device_trsv_perm_c_, data_.perm_c); // will use device to permute + + // Create handles for U and U^T solves + device_khL_.create_sptrsv_handle( + KokkosSparse::Experimental::SPTRSVAlgorithm::SUPERNODAL_ETREE, ld_rhs, true); + device_khU_.create_sptrsv_handle( + KokkosSparse::Experimental::SPTRSVAlgorithm::SUPERNODAL_ETREE, ld_rhs, false); + + const bool u_in_csr = true; // TODO: add needed params + device_khU_.set_sptrsv_column_major (!u_in_csr); + + const bool merge = false; // TODO: add needed params + device_khL_.set_sptrsv_merge_supernodes (merge); + device_khU_.set_sptrsv_merge_supernodes (merge); + + // specify whether to invert diagonal blocks + const bool invert_diag = true; // TODO: add needed params + device_khL_.set_sptrsv_invert_diagonal (invert_diag); + device_khU_.set_sptrsv_invert_diagonal (invert_diag); + + // specify wheather to apply diagonal-inversion to off-diagonal blocks (optional, default is false) + const bool invert_offdiag = false; // TODO: add needed params + device_khL_.set_sptrsv_invert_offdiagonal (invert_offdiag); + device_khU_.set_sptrsv_invert_offdiagonal (invert_offdiag); + + // set etree + device_khL_.set_sptrsv_etree(data_.parents.data()); + device_khU_.set_sptrsv_etree(data_.parents.data()); + + // set permutation + device_khL_.set_sptrsv_perm(data_.perm_r.data()); + device_khU_.set_sptrsv_perm(data_.perm_c.data()); + + int block_size = -1; // TODO: add needed params + if (block_size >= 0) { + std::cout << " Block Size : " << block_size << std::endl; + device_khL_.set_sptrsv_diag_supernode_sizes (block_size, block_size); + device_khU_.set_sptrsv_diag_supernode_sizes (block_size, block_size); + } + + // Do symbolic analysis + KokkosSparse::Experimental::sptrsv_symbolic + (&device_khL_, &device_khU_, data_.L, data_.U); + + // Do numerical compute + KokkosSparse::Experimental::sptrsv_compute + (&device_khL_, &device_khU_, data_.L, data_.U); +#endif // HAVE_AMESOS2_TRIANGULAR_SOLVE +} + +template +void +Superlu::triangular_solve() const +{ +#if defined(KOKKOSKERNELS_ENABLE_SUPERNODAL_SPTRSV) && defined(KOKKOSKERNELS_ENABLE_TPL_SUPERLU) + size_t ld_rhs = device_xValues_.extent(0); + size_t nrhs = device_xValues_.extent(1); + + Kokkos::resize(device_trsv_rhs_, ld_rhs, nrhs); + Kokkos::resize(device_trsv_sol_, ld_rhs, nrhs); + + // forward pivot + auto local_device_bValues = device_bValues_; + auto local_device_trsv_perm_r = device_trsv_perm_r_; + auto local_device_trsv_rhs = device_trsv_rhs_; + Kokkos::parallel_for(Kokkos::RangePolicy(0, ld_rhs), + KOKKOS_LAMBDA(size_t j) { + for(size_t k = 0; k < nrhs; ++k) { + local_device_trsv_rhs(local_device_trsv_perm_r(j),k) = local_device_bValues(j,k); + } + }); + + for(size_t k = 0; k < nrhs; ++k) { // sptrsv_solve does not batch + auto sub_sol = Kokkos::subview(device_trsv_sol_, Kokkos::ALL, k); + auto sub_rhs = Kokkos::subview(device_trsv_rhs_, Kokkos::ALL, k); + + // do L solve= - numeric (only rhs is modified) on the default device/host space + KokkosSparse::Experimental::sptrsv_solve(&device_khL_, sub_sol, sub_rhs); + + // do L^T solve - numeric (only rhs is modified) on the default device/host space + KokkosSparse::Experimental::sptrsv_solve(&device_khU_, sub_rhs, sub_sol); + } // end loop over rhs vectors + + // backward pivot + auto local_device_xValues = device_xValues_; + auto local_device_trsv_perm_c = device_trsv_perm_c_; + Kokkos::parallel_for(Kokkos::RangePolicy(0, ld_rhs), + KOKKOS_LAMBDA(size_t j) { + for(size_t k = 0; k < nrhs; ++k) { + local_device_xValues(j,k) = local_device_trsv_rhs(local_device_trsv_perm_c(j),k); + } + }); +#endif // HAVE_AMESOS2_TRIANGULAR_SOLVE +} template const char* Superlu::name = "SuperLU"; diff --git a/packages/amesos2/src/Amesos2_TpetraMultiVecAdapter_def.hpp b/packages/amesos2/src/Amesos2_TpetraMultiVecAdapter_def.hpp index dd3bd3c98d9d..13f68698ec4e 100644 --- a/packages/amesos2/src/Amesos2_TpetraMultiVecAdapter_def.hpp +++ b/packages/amesos2/src/Amesos2_TpetraMultiVecAdapter_def.hpp @@ -302,6 +302,11 @@ namespace Amesos2 { redist_mv.doExport (*mv_, *exporter_, Tpetra::REPLACE); if ( distribution != CONTIGUOUS_AND_ROOTED ) { + // Do this if GIDs contiguous - existing functionality + // Copy the imported (multi)vector's data into the Kokkos View. + deep_copy_or_assign_view(kokkos_view, redist_mv.getLocalViewDevice()); + } + else { if(redist_mv.isConstantStride()) { redist_mv.sync_device(); // no testing of this right now - since UVM on deep_copy_or_assign_view(kokkos_view, redist_mv.getLocalViewDevice()); @@ -310,9 +315,6 @@ namespace Amesos2 { TEUCHOS_TEST_FOR_EXCEPTION(true, std::runtime_error, "Kokkos adapter non-constant stride not imlemented."); } } - else { - TEUCHOS_TEST_FOR_EXCEPTION(true, std::runtime_error, "Kokkos adapter CONTIGUOUS_AND_ROOTED path not implemented for get1dCopy_kokkos_view()."); - } } } @@ -564,7 +566,36 @@ namespace Amesos2 { mv_->doImport (source_mv, *importer_, Tpetra::REPLACE); } else { - TEUCHOS_TEST_FOR_EXCEPTION(true, std::runtime_error, "Kokkos adapter CONTIGUOUS_AND_ROOTED not implemented for put1dData_kokkos_view."); + multivec_t redist_mv (srcMap, num_vecs); // unused for ROOTED case + typedef typename multivec_t::dual_view_type dual_view_type; + typedef typename dual_view_type::host_mirror_space host_execution_space; + redist_mv.template modify< host_execution_space > (); + + // Cuda solvers won't currently use this path since they are just serial + // right now, so this mirror should be harmless (and not strictly necessary). + // Adding it for future possibilities though we may then refactor this + // for better efficiency if the kokkos_new_data view is on device. + auto host_kokkos_new_data = Kokkos::create_mirror_view(kokkos_new_data); + Kokkos::deep_copy(host_kokkos_new_data, kokkos_new_data); + if ( redist_mv.isConstantStride() ) { + auto contig_local_view_2d = redist_mv.template getLocalView(); + for ( size_t j = 0; j < num_vecs; ++j) { + auto av_j = Kokkos::subview(host_kokkos_new_data, Kokkos::ALL, j); + for ( size_t i = 0; i < lda; ++i ) { + contig_local_view_2d(i,j) = av_j(i); + } + } + } + else { + TEUCHOS_TEST_FOR_EXCEPTION(true, std::runtime_error, "Kokkos adapter " + "CONTIGUOUS_AND_ROOTED not implemented for put1dData_kokkos_view " + "with non constant stride."); + } + + typedef typename multivec_t::node_type::memory_space memory_space; + redist_mv.template sync (); + + mv_->doImport (redist_mv, *importer_, Tpetra::REPLACE); } } diff --git a/packages/amesos2/src/Amesos2_Util.hpp b/packages/amesos2/src/Amesos2_Util.hpp index c5f87b662075..c5986e34b5df 100644 --- a/packages/amesos2/src/Amesos2_Util.hpp +++ b/packages/amesos2/src/Amesos2_Util.hpp @@ -1024,11 +1024,10 @@ namespace Amesos2 { } } - template + template void - reorder(values_view_t & values, row_ptr_view_t & row_ptr, cols_view_t & cols, - per_view_t & perm, per_view_t & peri) + reorder(row_ptr_view_t & row_ptr, cols_view_t & cols, + per_view_t & perm, per_view_t & peri, size_t & nnz) { #ifndef HAVE_AMESOS2_METIS TEUCHOS_TEST_FOR_EXCEPTION(true, std::runtime_error, @@ -1080,36 +1079,24 @@ namespace Amesos2 { TEUCHOS_TEST_FOR_EXCEPTION(err != METIS_OK, std::runtime_error, "METIS_NodeND failed to sort matrix."); - // exec space to resort the matrix - // right now we're assuming all three vectors are in fact on the same - // memory space but this is not necessarily true for future use. Then - // we'll need to make the exec space an option to set and they'll all - // need to be mirrored into that space. Add a compilation failure here - // to make that clear to a future user. - typedef typename values_view_t::execution_space exec_space_t; - typedef typename cols_view_t::execution_space cols_exec_space_t; - typedef typename row_ptr_view_t::execution_space row_ptr_exec_space_t; - static_assert(std::is_same::value && - std::is_same::value, - "Amesos2 reorder method is currently assuming all three " - "matrix vectors are on the same memory space. If this " - "requirement is changing it will need some minor updates " - "to make it work with differing memory spaces."); - // put the permutations on our saved device ptrs // these will be used to permute x and b when we solve + typedef typename cols_view_t::execution_space exec_space_t; auto device_perm = Kokkos::create_mirror_view(exec_space_t(), host_perm); auto device_peri = Kokkos::create_mirror_view(exec_space_t(), host_peri); deep_copy(device_perm, host_perm); deep_copy(device_peri, host_peri); + // also set the permutation which may need to convert the type from + // metis to the native ordinal_type + deep_copy_or_assign_view(perm, device_perm); + deep_copy_or_assign_view(peri, device_peri); + // we'll permute matrix on device to a new set of arrays row_ptr_view_t new_row_ptr( Kokkos::ViewAllocateWithoutInitializing("new_row_ptr"), row_ptr.size()); cols_view_t new_cols( Kokkos::ViewAllocateWithoutInitializing("new_cols"), cols.size() - new_nnz/2); - values_view_t new_values( - Kokkos::ViewAllocateWithoutInitializing("new_values"), values.size() - new_nnz/2); // permute row indices Kokkos::RangePolicy policy_row(0, row_ptr.size()); @@ -1121,7 +1108,7 @@ namespace Amesos2 { if(i < size) { ordinal_type count = 0; const ordinal_type row = device_perm(i); - for(size_t k = row_ptr(row); k < row_ptr(row + 1); ++k) { + for(ordinal_type k = row_ptr(row); k < row_ptr(row + 1); ++k) { const ordinal_type j = device_peri(cols(k)); /// col in A count += (i >= j); /// lower triangular } @@ -1143,7 +1130,6 @@ namespace Amesos2 { const ordinal_type j = device_peri(cols(sk)); if(i >= j) { new_cols(tk) = j; - new_values(tk) = values(sk); ++t; } } @@ -1152,23 +1138,61 @@ namespace Amesos2 { // finally set the inputs to the new sorted arrays row_ptr = new_row_ptr; cols = new_cols; - values = new_values; - // also set the permutation which may need to convert the type from - // metis to the native ordinal_type - deep_copy_or_assign_view(perm, device_perm); - deep_copy_or_assign_view(peri, device_peri); - #endif + nnz = new_nnz; + #endif // HAVE_AMESOS2_METIS + } + + template + void + reorder_values(values_view_t & values, const row_ptr_view_t & orig_row_ptr, + const row_ptr_view_t & new_row_ptr, + const cols_view_t & orig_cols, const per_view_t & perm, const per_view_t & peri, + size_t nnz) + { + typedef typename cols_view_t::value_type ordinal_type; + typedef typename cols_view_t::execution_space exec_space_t; + + auto device_perm = Kokkos::create_mirror_view(exec_space_t(), perm); + auto device_peri = Kokkos::create_mirror_view(exec_space_t(), peri); + deep_copy(device_perm, perm); + deep_copy(device_peri, peri); + + const ordinal_type size = orig_row_ptr.size() - 1; + + auto host_orig_row_ptr = Kokkos::create_mirror_view(orig_row_ptr); + auto new_nnz = host_orig_row_ptr(size); // TODO: Maybe optimize this by caching + + values_view_t new_values( + Kokkos::ViewAllocateWithoutInitializing("new_values"), values.size() - new_nnz/2); + + // permute col indices + Kokkos::RangePolicy policy_col(0, size); + Kokkos::parallel_for(policy_col, KOKKOS_LAMBDA(ordinal_type i) { + const ordinal_type kbeg = new_row_ptr(i); + const ordinal_type row = device_perm(i); + const ordinal_type col_beg = orig_row_ptr(row); + const ordinal_type col_end = orig_row_ptr(row + 1); + const ordinal_type nk = col_end - col_beg; + for(ordinal_type k = 0, t = 0; k < nk; ++k) { + const ordinal_type tk = kbeg + t; + const ordinal_type sk = col_beg + k; + const ordinal_type j = device_peri(orig_cols(sk)); + if(i >= j) { + new_values(tk) = values(sk); + ++t; + } + } + }); + + values = new_values; } template void apply_reorder_permutation(const array_view_t & array, array_view_t & permuted_array, const per_view_t & permutation) { - #ifndef HAVE_AMESOS2_METIS - TEUCHOS_TEST_FOR_EXCEPTION(true, std::runtime_error, - "Cannot apply_reorder_permutation for cuSolver because no METIS is available."); - #else if(permuted_array.extent(0) != array.extent(0) || permuted_array.extent(1) != array.extent(1)) { permuted_array = array_view_t( Kokkos::ViewAllocateWithoutInitializing("permuted_array"), @@ -1181,7 +1205,6 @@ namespace Amesos2 { permuted_array(i, j) = array(permutation(i), j); } }); - #endif } /** @} */ diff --git a/packages/amesos2/src/Amesos2_cuSOLVER_decl.hpp b/packages/amesos2/src/Amesos2_cuSOLVER_decl.hpp index 765b26756916..a33624d4e45f 100644 --- a/packages/amesos2/src/Amesos2_cuSOLVER_decl.hpp +++ b/packages/amesos2/src/Amesos2_cuSOLVER_decl.hpp @@ -203,6 +203,7 @@ class cuSOLVER : public SolverCore device_value_type_array device_nzvals_view_; device_size_type_array device_row_ptr_view_; device_ordinal_type_array device_cols_view_; + size_t sorted_nnz; // data for reordering typedef Kokkos::View permute_array_t; diff --git a/packages/amesos2/src/Amesos2_cuSOLVER_def.hpp b/packages/amesos2/src/Amesos2_cuSOLVER_def.hpp index aa3831a049bf..2da60eb10cc0 100644 --- a/packages/amesos2/src/Amesos2_cuSOLVER_def.hpp +++ b/packages/amesos2/src/Amesos2_cuSOLVER_def.hpp @@ -91,13 +91,12 @@ cuSOLVER::preOrdering_impl() if(do_optimization()) { this->matrixA_->returnRowPtr_kokkos_view(device_row_ptr_view_); this->matrixA_->returnColInd_kokkos_view(device_cols_view_); - this->matrixA_->returnValues_kokkos_view(device_nzvals_view_); // reorder to optimize cuSolver if(data_.bReorder) { Amesos2::Util::reorder( - device_nzvals_view_, device_row_ptr_view_, device_cols_view_, - device_perm_, device_peri_); + device_row_ptr_view_, device_cols_view_, + device_perm_, device_peri_, sorted_nnz); } } @@ -135,7 +134,22 @@ int cuSOLVER::numericFactorization_impl() { int err = 0; - if ( this->root_ ) { + if(do_optimization()) { // just supporting one rank right now + this->matrixA_->returnValues_kokkos_view(device_nzvals_view_); + + // reorder to optimize cuSolver + if(data_.bReorder) { + // must have original row and cols - maybe cache this from 1st symbiolic setup + // this setup exists to support the refactor option + device_size_type_array orig_device_row_ptr_view; + device_ordinal_type_array orig_device_cols_view; + this->matrixA_->returnRowPtr_kokkos_view(orig_device_row_ptr_view); + this->matrixA_->returnColInd_kokkos_view(orig_device_cols_view); + Amesos2::Util::reorder_values( + device_nzvals_view_, orig_device_row_ptr_view, device_row_ptr_view_, orig_device_cols_view, + device_perm_, device_peri_, sorted_nnz); + } + const int size = this->globalNumRows_; const int nnz = device_cols_view_.size(); // reorder may have changed this const cusolver_type * values = device_nzvals_view_.data(); diff --git a/packages/amesos2/test/solvers/CMakeLists.txt b/packages/amesos2/test/solvers/CMakeLists.txt index 7cd9505e0fbd..8b68fcfebfc5 100644 --- a/packages/amesos2/test/solvers/CMakeLists.txt +++ b/packages/amesos2/test/solvers/CMakeLists.txt @@ -68,6 +68,24 @@ IF (${PACKAGE_NAME}_ENABLE_SuperLU) COMM serial mpi ) + IF (KokkosKernels_ENABLE_SUPERNODAL_SPTRSV AND KokkosKernels_ENABLE_TPL_SUPERLU) + + TRIBITS_COPY_FILES_TO_BINARY_DIR(SolverTestSuperLUTRSVFiles + SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR} + SOURCE_FILES superlu_trsv_test.xml + EXEDEPS Solver_Test + ) + + TRIBITS_ADD_TEST( + Solver_Test + NAME SuperLU_TriangularSolve_Solver_Test + ARGS "--xml-params=superlu_trsv_test.xml --filedir=${CMAKE_CURRENT_BINARY_DIR}/../matrices/ --multiple-solves --refactor" + STANDARD_PASS_OUTPUT + NUM_MPI_PROCS 1 + COMM serial mpi + ) + + ENDIF() IF (NOT ${PROJECT_NAME}_ENABLE_DEBUG) TRIBITS_ADD_EXECUTABLE_AND_TEST( @@ -157,7 +175,7 @@ IF (${PACKAGE_NAME}_ENABLE_Cholmod) COMM serial mpi ) - IF (${PACKAGE_NAME}_ENABLE_TRIANGULAR_SOLVES) + IF (KokkosKernels_ENABLE_SUPERNODAL_SPTRSV AND KokkosKernels_ENABLE_TPL_CHOLMOD) TRIBITS_COPY_FILES_TO_BINARY_DIR(SolverTestCholmodTRSVFiles SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR} diff --git a/packages/amesos2/test/solvers/Solver_Test.cpp b/packages/amesos2/test/solvers/Solver_Test.cpp index a4077d5f525d..0b12a993305f 100644 --- a/packages/amesos2/test/solvers/Solver_Test.cpp +++ b/packages/amesos2/test/solvers/Solver_Test.cpp @@ -52,6 +52,9 @@ */ #include "KokkosBlas.hpp" +#include "Kokkos_Random.hpp" +#include "KokkosSparse_spmv.hpp" +#include "KokkosKernels_IOUtils.hpp" #include #include @@ -311,12 +314,11 @@ bool do_mat_test(const ParameterList& parameters) bool complex = false; if( parameters.isParameter("complex") ){ if( ! parameters.isType("complex") ){ - *fos << "'complex' parameter type should be bool! ignoring..." << std::endl; + *fos << "'complex' parameter type should be bool! ignoring and leaving at default: " << complex << std::endl; // read complex to remove unused warning on cuda build } else { complex = parameters.get("complex"); } } - (void) complex; // forestall warning for set but unused variable ParameterList solve_params("Amesos2"); if( parameters.isSublist("all_solver_params") ){ @@ -501,9 +503,9 @@ struct solution_checkerextent(1); Teuchos::Array ts_norms(num_vecs), gs_norms(num_vecs); for (size_t k = 0; k < num_vecs; ++k) { - ts_norms[k] = KokkosBlas::nrm2_squared( + ts_norms[k] = KokkosBlas::nrm2( Kokkos::subview(*true_solution, Kokkos::ALL, k)); - gs_norms[k] = KokkosBlas::nrm2_squared( + gs_norms[k] = KokkosBlas::nrm2( Kokkos::subview(*given_solution, Kokkos::ALL, k)); } @@ -847,6 +849,7 @@ bool do_epetra_test(const string& mm_file, } A2->ReplaceMyValues(0, l_fst_row_nnz, values.getRawPtr(), indices.getRawPtr()); + x2->Random(); A2->Multiply(transpose, *x2, *b2); } // else A2 is never read @@ -1031,6 +1034,7 @@ bool do_tpetra_test_with_types(const string& mm_file, A2->replaceLocalValues (0, indices, values); A2->fillComplete (A->getDomainMap (), A->getRangeMap ()); + x2->randomize(); A2->apply (*x2, *b2, trans); } // else A2 is never read @@ -1417,218 +1421,90 @@ bool test_tpetra(const string& mm_file, template + typename Node> bool do_kokkos_test_with_types(const string& mm_file, const string& solver_name, ParameterList solve_params) { - // Here I am using Tpetra as a helper to load and make solutions. - typedef DefaultNode TpetraNode; - - using Tpetra::CrsMatrix; - using Tpetra::MultiVector; - using Teuchos::Comm; - using Teuchos::ScalarTraits; using std::endl; using std::flush; - typedef Kokkos::Device device_t; + typedef typename Node::execution_space execution_space; + typedef typename Node::memory_space memory_space; + typedef Kokkos::Device device_t; typedef KokkosSparse::CrsMatrix MAT; typedef Kokkos::View view_t; - const size_t numVecs = 5; // arbitrary number - const size_t numRHS = 5; // also arbitrary + RCP > comm = Tpetra::getDefaultComm(); - bool transpose = solve_params.get("Transpose", false); + // Kokkos adapter doesn't support the distributed modes. + // We just load to the root rank which allows something like SuperLU to + // run the kokkos tests even if the test is set to more than 1 rank. + bool bEmptyLoad = (comm->getRank() != 0); - RCP > comm = Tpetra::getDefaultComm(); + bool transpose = solve_params.get("Transpose", false); if (verbosity > 2) { *fos << endl << " Reading matrix from " << mm_file << " ... " << flush; } std::string path = filedir + mm_file; - // not sure about the loading schemes for kokkos - just use Tpetra right now - // and load it into the Kokkos CrsMatrix - typedef Tpetra::Map<>::global_ordinal_type TpetraGO; - typedef Tpetra::CrsMatrix tpetra_crsmatrix_t; - RCP tpetraM = - Tpetra::MatrixMarket::Reader::readSparseFile (path, comm); - - Teuchos::ArrayRCP rowPointers; - Teuchos::ArrayRCP columnIndices; - Teuchos::ArrayRCP values; - tpetraM->getAllValues(rowPointers, columnIndices, values); - - // convert Tpetra size_t row ptrs to kokkos crsmatrix LO type - Teuchos::ArrayRCP kokkosRowPointers = Teuchos::arcp(new LocalOrdinal[rowPointers.size()], 0, rowPointers.size()); - for(int n = 0; n < rowPointers.size(); ++n) { - kokkosRowPointers[n] = Teuchos::as(rowPointers[n]); - } + RCP A = rcp(new MAT); - // convert Tpetra values to kokkos - for complex this will be converting - // std::complex to Kokkos::complex - Teuchos::ArrayRCP kokkosValues = Teuchos::arcp(new Scalar[values.size()], 0, values.size()); - for(int n = 0; n < values.size(); ++n) { - kokkosValues[n] = Teuchos::as(values[n]); - } + const size_t numVecs = bEmptyLoad ? 0 : 5; // arbitrary number + const size_t numRHS = 5; // also arbitrary - auto num_rows = tpetraM->getNodeNumRows(); - auto num_cols = tpetraM->getNodeNumCols(); - - // Kokkos CrsMatrix builds with non const ptrs while Tpetra loads into const - Teuchos::ArrayRCP non_const_values = Teuchos::arcp_const_cast(kokkosValues); - Teuchos::ArrayRCP non_const_kokkosRowPointers = Teuchos::arcp_const_cast(kokkosRowPointers); - Teuchos::ArrayRCP non_const_columnIndices = Teuchos::arcp_const_cast(columnIndices); - RCP A = rcp(new MAT("Kokkos CrsMatrix", - num_rows, - num_cols, - tpetraM->getGlobalNumEntries(), - non_const_values.getRawPtr(), - non_const_kokkosRowPointers.getRawPtr(), - non_const_columnIndices.getRawPtr())); + if(!bEmptyLoad) { + *A = KokkosKernels::Impl::read_kokkos_crst_matrix(path.c_str()); + } if (verbosity > 2) { *fos << endl << " Creating right-hand side and solution vectors" << endl; } - ETransp trans = transpose ? CONJ_TRANS : NO_TRANS; - typedef Tpetra::MultiVector MV; - RCP > dmnmap = tpetraM->getDomainMap(); - RCP > rngmap = tpetraM->getRangeMap(); - Array > xMV(numRHS); - Array > bMV(numRHS); - for( size_t i = 0; i < numRHS; ++i ){ - if( transpose ){ - xMV[i] = rcp(new MV(dmnmap,numVecs)); - bMV[i] = rcp(new MV(rngmap,numVecs)); - } else { - xMV[i] = rcp(new MV(rngmap,numVecs)); - bMV[i] = rcp(new MV(dmnmap,numVecs)); - } - std::ostringstream xlabel, blabel; - xlabel << "x[" << i << "]"; - blabel << "b[" << i << "]"; - xMV[i]->setObjectLabel(xlabel.str()); - bMV[i]->setObjectLabel(blabel.str()); + auto num_rows = bEmptyLoad ? 0 : A->graph.numRows(); - xMV[i]->randomize(); - tpetraM->apply(*xMV[i], *bMV[i], trans); - } + RCP A2 = rcp(new MAT); + RCP Xhat = rcp(new view_t(Kokkos::ViewAllocateWithoutInitializing("Xhat"), num_rows, numVecs)); Array> x(numRHS); Array> b(numRHS); - for( size_t i = 0; i < numRHS; ++i ){ - std::ostringstream xlabel, blabel; - xlabel << "x[" << i << "]"; - blabel << "b[" << i << "]"; - if( transpose ){ - x[i] = rcp(new view_t(xlabel.str(), num_cols, numRHS)); - b[i] = rcp(new view_t(blabel.str(), num_cols, numRHS)); - } else { - x[i] = rcp(new view_t(xlabel.str(), num_rows, numRHS)); - b[i] = rcp(new view_t(blabel.str(), num_rows, numRHS)); - } - - // MDM Right now I'm employing the Tpetra version to generate the random - // values. But probably should make a pure kokkos version though I'd like - // them all to be the same. - RCP xMV, bMV; - if( transpose ){ - xMV = rcp(new MV(rngmap,numVecs)); - bMV = rcp(new MV(dmnmap,numVecs)); - } - else { - xMV = rcp(new MV(dmnmap,numVecs)); - bMV = rcp(new MV(rngmap,numVecs)); - } - xMV->randomize(); - tpetraM->apply(*xMV, *bMV, trans); - - Kokkos::deep_copy(*x[i], xMV->getLocalViewHost()); - Kokkos::deep_copy(*b[i], bMV->getLocalViewHost()); - } - RCP temp_tpetraM = - Tpetra::MatrixMarket::Reader::readSparseFile (path, comm); + uint64_t random_seed = 28713; + Kokkos::Random_XorShift64_Pool random(random_seed); - RCP A2; - RCP Xhat, x2, b2; - - if (transpose) { - Xhat = rcp(new view_t("Xhat", num_rows, numVecs)); - if (refactor) { - x2 = rcp(new view_t("x2", num_rows, numVecs)); - b2 = rcp(new view_t("b2", num_cols, numVecs)); - } - } else { - Xhat = rcp(new view_t("Xhat", num_cols, numVecs)); - if (refactor) { - x2 = rcp(new view_t("x2", num_cols, numVecs)); - b2 = rcp(new view_t ("b2", num_rows, numVecs)); + Scalar Scalar1 = static_cast(1.0); + Scalar Scalar0 = static_cast(0.0); + for( size_t i = 0; i < numRHS; ++i ){ + x[i] = rcp(new view_t(Kokkos::ViewAllocateWithoutInitializing("x"), num_rows, numVecs)); + b[i] = rcp(new view_t(Kokkos::ViewAllocateWithoutInitializing("b"), num_rows, numVecs)); + if(!bEmptyLoad) { + Kokkos::fill_random(*x[i], random, -Scalar1, Scalar1); // -1.0 to 1.0 matches Tpetra randomize + KokkosSparse::spmv(transpose?"T":"N", Scalar1, *A, *x[i], Scalar0, *b[i]); } } + RCP x2, b2; if (refactor) { if (verbosity > 2) { *fos << endl << " Creating near-copy of matrix for refactor test" << endl; } - - RCP tpetraM2 = - Tpetra::MatrixMarket::Reader::readSparseFile (path, comm); - - // perturb the values just a bit (element-wise square of first row) - size_t l_fst_row_nnz = tpetraM2->getNumEntriesInLocalRow(0); - Array indices(l_fst_row_nnz); - Array values(l_fst_row_nnz); - tpetraM2->getLocalRowCopy(0, indices, values, l_fst_row_nnz); - for( size_t i = 0; i < l_fst_row_nnz; ++i ){ - values[i] = values[i] * values[i]; - } - tpetraM2->resumeFill (); - tpetraM2->replaceLocalValues (0, indices, values); - tpetraM2->fillComplete (tpetraM->getDomainMap (), tpetraM->getRangeMap ()); - - // Get Tpetra ahain - Teuchos::ArrayRCP rowPointers2; - Teuchos::ArrayRCP columnIndices2; - Teuchos::ArrayRCP values2; - tpetraM2->getAllValues(rowPointers2, columnIndices2, values2); - - Teuchos::ArrayRCP kokkosRowPointers2 = Teuchos::arcp(new LocalOrdinal[rowPointers2.size()], 0, rowPointers2.size()); - for(int n = 0; n < rowPointers2.size(); ++n) { - kokkosRowPointers2[n] = Teuchos::as(rowPointers2[n]); - } - - auto num_rows2 = tpetraM2->getNodeNumRows(); - auto num_cols2 = tpetraM2->getNodeNumCols(); - - A2 = rcp(new MAT("Kokkos CrsMatrix 2", - num_rows2, - num_cols2, - tpetraM2->getGlobalNumEntries(), - (Scalar*)values2.getRawPtr(), - (LocalOrdinal*)kokkosRowPointers2.getRawPtr(), - (LocalOrdinal*)columnIndices2.getRawPtr())); - - RCP x2MV, b2MV; - if (transpose) { - if (refactor) { - x2MV = rcp(new MV(dmnmap,numVecs)); - b2MV = rcp(new MV(rngmap,numVecs)); - } - } else { - if (refactor) { - x2MV = rcp(new MV(rngmap,numVecs)); - b2MV = rcp(new MV(dmnmap,numVecs)); - } + x2 = rcp(new view_t(Kokkos::ViewAllocateWithoutInitializing("x2"), num_rows, numVecs)); + b2 = rcp(new view_t(Kokkos::ViewAllocateWithoutInitializing("b2"), num_rows, numVecs)); + if(!bEmptyLoad) { + *A2 = KokkosKernels::Impl::read_kokkos_crst_matrix(path.c_str()); + auto vals = A2->values; // don't use RCP in kernel + // perturb the values just a bit (element-wise square of first row) + auto row_map = A2->graph.row_map; + Kokkos::RangePolicy policy(0, vals.size()); + Kokkos::parallel_for(policy, KOKKOS_LAMBDA(size_t i) { + if(i < row_map(1)) { // just do 1st row + vals(i) = vals(i) * vals(i); + } + }); + Kokkos::fill_random(*x2, random, -Scalar1, Scalar1); // -1.0 to 1.0 matches Tpetra randomize + KokkosSparse::spmv(transpose?"T":"N", Scalar1, *A2, *x2, Scalar0, *b2); } - - tpetraM2->apply (*x2MV, *b2MV, trans); - - Kokkos::deep_copy(*x2, x2MV->getLocalViewHost()); - Kokkos::deep_copy(*b2, b2MV->getLocalViewHost()); } // else A2 is never read return do_solve_routine(solver_name, A, A2, @@ -1715,7 +1591,7 @@ bool test_kokkos(const string& mm_file, bool test_done = false; -#define AMESOS2_SOLVER_KOKKOS_TEST(S,LO,N,TpetraScalar) \ +#define AMESOS2_SOLVER_KOKKOS_TEST(S,LO,N) \ test_done = true; \ if (verbosity > 1) { \ *fos << std::endl \ @@ -1726,7 +1602,7 @@ bool test_kokkos(const string& mm_file, << std::endl; \ } \ bool run_success = \ - do_kokkos_test_with_types \ + do_kokkos_test_with_types \ (mm_file,solver_name, solve_params_copy); \ if (verbosity > 1) { \ if (!run_success) \ @@ -1748,12 +1624,12 @@ bool test_kokkos(const string& mm_file, if( scalar == "float" ) { #ifdef HAVE_TPETRA_INST_FLOAT// Because of Tpetra maps this is currently needed for Kokkos adapter if( node == "default" ) { - AMESOS2_SOLVER_KOKKOS_TEST(float,int,DefaultNode,float); + AMESOS2_SOLVER_KOKKOS_TEST(float,int,DefaultNode); } else if( node == "serial" ) { #ifdef KOKKOS_ENABLE_SERIAL *fos << "KokkosSerialWrapperNode float "; - AMESOS2_SOLVER_KOKKOS_TEST(float,int,Kokkos::Serial,float); + AMESOS2_SOLVER_KOKKOS_TEST(float,int,Kokkos::Serial); #else *fos << "node=serial was not enabled at configure time" << std::endl; #endif @@ -1761,7 +1637,7 @@ bool test_kokkos(const string& mm_file, else if( node == "cuda" ) { #ifdef KOKKOS_ENABLE_CUDA *fos << "KokkosCudaWrapperNode float "; - AMESOS2_SOLVER_KOKKOS_TEST(float,int,Kokkos::Cuda,float); + AMESOS2_SOLVER_KOKKOS_TEST(float,int,Kokkos::Cuda); #else *fos << "node=cuda was not enabled at configure time" << std::endl; #endif @@ -1769,7 +1645,7 @@ bool test_kokkos(const string& mm_file, else if( node == "cudauvmoff" ) { #ifdef KOKKOS_ENABLE_CUDA *fos << "KokkosCudaUVMOffWrapperNode float "; - AMESOS2_SOLVER_KOKKOS_TEST(float,int,uvm_off_node_t,float); + AMESOS2_SOLVER_KOKKOS_TEST(float,int,uvm_off_node_t); #else *fos << "node=cudauvmoff was not enabled at configure time" << std::endl; #endif @@ -1781,12 +1657,12 @@ bool test_kokkos(const string& mm_file, else if( scalar == "double" ) { #ifdef HAVE_TPETRA_INST_DOUBLE // Because of Tpetra maps this is currently needed for Kokkos adapter if( node == "default" ) { - AMESOS2_SOLVER_KOKKOS_TEST(double,int,DefaultNode,double); + AMESOS2_SOLVER_KOKKOS_TEST(double,int,DefaultNode); } else if( node == "serial" ) { #ifdef KOKKOS_ENABLE_SERIAL *fos << "KokkosSerialWrapperNode double "; - AMESOS2_SOLVER_KOKKOS_TEST(double,int,Kokkos::Serial,double); + AMESOS2_SOLVER_KOKKOS_TEST(double,int,Kokkos::Serial); #else *fos << "node=serial was not enabled at configure time" << std::endl; #endif @@ -1794,7 +1670,7 @@ bool test_kokkos(const string& mm_file, else if( node == "cuda" ) { #ifdef KOKKOS_ENABLE_CUDA *fos << "KokkosCudaWrapperNode double "; - AMESOS2_SOLVER_KOKKOS_TEST(double,int,Kokkos::Cuda,double); + AMESOS2_SOLVER_KOKKOS_TEST(double,int,Kokkos::Cuda); #else *fos << "node=cuda was not enabled at configure time" << std::endl; #endif @@ -1802,7 +1678,7 @@ bool test_kokkos(const string& mm_file, else if( node == "cudauvmoff" ) { #ifdef KOKKOS_ENABLE_CUDA *fos << "KokkosCudaUVMOffWrapperNode double "; - AMESOS2_SOLVER_KOKKOS_TEST(double,int,uvm_off_node_t,double); + AMESOS2_SOLVER_KOKKOS_TEST(double,int,uvm_off_node_t); #else *fos << "node=cudauvmoff was not enabled at configure time" << std::endl; #endif @@ -1821,15 +1697,14 @@ bool test_kokkos(const string& mm_file, if( mag == "float" ){ #ifdef HAVE_TPETRA_INST_COMPLEX_FLOAT typedef Kokkos::complex cmplx_float; - typedef std::complex tpetra_cmplx_float; if( lo == "int" ){ if( node == "default" ) { - AMESOS2_SOLVER_KOKKOS_TEST(cmplx_float,int,DefaultNode,tpetra_cmplx_float); + AMESOS2_SOLVER_KOKKOS_TEST(cmplx_float,int,DefaultNode); } else if( node == "serial" ) { #ifdef KOKKOS_ENABLE_SERIAL *fos << "KokkosSerialWrapperNode complex "; - AMESOS2_SOLVER_KOKKOS_TEST(cmplx_float,int,Kokkos::Serial,tpetra_cmplx_float); + AMESOS2_SOLVER_KOKKOS_TEST(cmplx_float,int,Kokkos::Serial); #else *fos << "node=serial was not enabled at configure time" << std::endl; #endif @@ -1837,7 +1712,7 @@ bool test_kokkos(const string& mm_file, else if( node == "cuda" ) { #ifdef KOKKOS_ENABLE_CUDA *fos << "KokkosCudaWrapperNode complex "; - AMESOS2_SOLVER_KOKKOS_TEST(cmplx_float,int,Kokkos::Cuda,tpetra_cmplx_float); + AMESOS2_SOLVER_KOKKOS_TEST(cmplx_float,int,Kokkos::Cuda); #else *fos << "node=cuda was not enabled at configure time" << std::endl; #endif @@ -1845,7 +1720,7 @@ bool test_kokkos(const string& mm_file, else if( node == "cudauvmoff" ) { #ifdef KOKKOS_ENABLE_CUDA *fos << "KokkosCudaUVMOffWrapperNode complex "; - AMESOS2_SOLVER_KOKKOS_TEST(cmplx_float,int,uvm_off_node_t,tpetra_cmplx_float); + AMESOS2_SOLVER_KOKKOS_TEST(cmplx_float,int,uvm_off_node_t); #else *fos << "node=cudauvmoff was not enabled at configure time" << std::endl; #endif @@ -1866,15 +1741,14 @@ bool test_kokkos(const string& mm_file, if( mag == "double" ){ #ifdef HAVE_TPETRA_INST_COMPLEX_DOUBLE typedef Kokkos::complex cmplx_double; - typedef std::complex tpetra_cmplx_double; if( lo == "int" ){ if( node == "default" ) { - AMESOS2_SOLVER_KOKKOS_TEST(cmplx_double,int,DefaultNode,tpetra_cmplx_double); + AMESOS2_SOLVER_KOKKOS_TEST(cmplx_double,int,DefaultNode); } else if( node == "serial" ) { #ifdef KOKKOS_ENABLE_SERIAL *fos << "KokkosSerialWrapperNode complex "; - AMESOS2_SOLVER_KOKKOS_TEST(cmplx_double,int,Kokkos::Serial,tpetra_cmplx_double); + AMESOS2_SOLVER_KOKKOS_TEST(cmplx_double,int,Kokkos::Serial); #else *fos << "node=serial was not enabled at configure time" << std::endl; #endif @@ -1882,7 +1756,7 @@ bool test_kokkos(const string& mm_file, else if( node == "cuda" ) { #ifdef KOKKOS_ENABLE_CUDA *fos << "KokkosCudaWrapperNode complex "; - AMESOS2_SOLVER_KOKKOS_TEST(cmplx_double,int,Kokkos::Cuda,tpetra_cmplx_double); + AMESOS2_SOLVER_KOKKOS_TEST(cmplx_double,int,Kokkos::Cuda); #else *fos << "node=cuda was not enabled at configure time" << std::endl; #endif @@ -1890,7 +1764,7 @@ bool test_kokkos(const string& mm_file, else if( node == "cudauvmoff" ) { #ifdef KOKKOS_ENABLE_CUDA *fos << "KokkosCudaUVMOffWrapperNode complex "; - AMESOS2_SOLVER_KOKKOS_TEST(cmplx_double,int,uvm_off_node_t,tpetra_cmplx_double); + AMESOS2_SOLVER_KOKKOS_TEST(cmplx_double,int,uvm_off_node_t); #else *fos << "node=cudauvmoff was not enabled at configure time" << std::endl; #endif diff --git a/packages/amesos2/test/solvers/Superlu_UnitTests.cpp b/packages/amesos2/test/solvers/Superlu_UnitTests.cpp index 97eb3eb81513..0005912ec890 100644 --- a/packages/amesos2/test/solvers/Superlu_UnitTests.cpp +++ b/packages/amesos2/test/solvers/Superlu_UnitTests.cpp @@ -412,8 +412,7 @@ namespace { std::logic_error, "SuperLU NonContigGID Test: The non-contiguous map claims to be contiguous."); - //RCP A = rcp( new MAT(map,3) ); // max of three entries in a row - RCP A = rcp( new MAT(map,0) ); + RCP A = rcp( new MAT(map,3) ); // max of three entries in a row A->setObjectLabel("A"); /* diff --git a/packages/amesos2/test/solvers/cholmod_trsv_test.xml b/packages/amesos2/test/solvers/cholmod_trsv_test.xml index e749bd34ca6a..ff949d5e9704 100644 --- a/packages/amesos2/test/solvers/cholmod_trsv_test.xml +++ b/packages/amesos2/test/solvers/cholmod_trsv_test.xml @@ -52,7 +52,7 @@ - + @@ -101,7 +101,7 @@ - + diff --git a/packages/amesos2/test/solvers/superlu_test.xml b/packages/amesos2/test/solvers/superlu_test.xml index 80b3544f4c55..cfc4b7d9ccb9 100644 --- a/packages/amesos2/test/solvers/superlu_test.xml +++ b/packages/amesos2/test/solvers/superlu_test.xml @@ -28,13 +28,13 @@ - + - + @@ -43,35 +43,60 @@ - + - - - - - - - - - - - + - + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -89,31 +114,58 @@ - - - - - - - - + - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/packages/amesos2/test/solvers/superlu_trsv_test.xml b/packages/amesos2/test/solvers/superlu_trsv_test.xml new file mode 100644 index 000000000000..e72e5e547395 --- /dev/null +++ b/packages/amesos2/test/solvers/superlu_trsv_test.xml @@ -0,0 +1,132 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/packages/belos/epetra/example/BlockGmres/BlockGmresEpetraExFile.cpp b/packages/belos/epetra/example/BlockGmres/BlockGmresEpetraExFile.cpp index 74a49b27b15e..6cb69d02b9f7 100644 --- a/packages/belos/epetra/example/BlockGmres/BlockGmresEpetraExFile.cpp +++ b/packages/belos/epetra/example/BlockGmres/BlockGmresEpetraExFile.cpp @@ -101,6 +101,7 @@ bool debug = false; int maxrestarts = 15; // number of restarts allowed std::string filename("orsirr1.hb"); MT tol = 1.0e-5; // relative residual tolerance + std::string ortho = "ICGS";// orthogonalization method Teuchos::CommandLineProcessor cmdp(false,true); cmdp.setOption("verbose","quiet",&verbose,"Print messages and results."); @@ -113,6 +114,7 @@ bool debug = false; cmdp.setOption("max-iters",&maxiters,"Maximum number of iterations per linear system (-1 = adapted to problem/block size)."); cmdp.setOption("max-subspace",&maxsubspace,"Maximum number of blocks the solver can use for the subspace."); cmdp.setOption("max-restarts",&maxrestarts,"Maximum number of restarts allowed for GMRES solver."); + cmdp.setOption("ortho",&ortho,"Orthogonalization being used by GMRES solver."); if (cmdp.parse(argc,argv) != Teuchos::CommandLineProcessor::PARSE_SUCCESSFUL) { return -1; } @@ -155,6 +157,7 @@ bool debug = false; belosList.set( "Maximum Iterations", maxiters ); // Maximum number of iterations allowed belosList.set( "Maximum Restarts", maxrestarts ); // Maximum number of restarts allowed belosList.set( "Convergence Tolerance", tol ); // Relative convergence tolerance requested + belosList.set( "Orthogonalization", ortho ); // Orthogonalization used by iterative solver int verbosity = Belos::Errors + Belos::Warnings; if (verbose) { verbosity += Belos::TimingDetails + Belos::StatusTestDetails; diff --git a/packages/belos/epetra/test/OrthoManager/CMakeLists.txt b/packages/belos/epetra/test/OrthoManager/CMakeLists.txt index e4e3a24536b4..ed4babdd54f5 100644 --- a/packages/belos/epetra/test/OrthoManager/CMakeLists.txt +++ b/packages/belos/epetra/test/OrthoManager/CMakeLists.txt @@ -7,9 +7,9 @@ IF (${PACKAGE_NAME}_ENABLE_Triutils) TRIBITS_ADD_EXECUTABLE_AND_TEST( Epetra_OrthoManager_test SOURCES belos_orthomanager_epetra.cpp - ARGS "--ortho=ICGS --verbose" - "--ortho=DGKS --verbose" - "--ortho=IMGS --verbose" + ARGS "--ortho=ICGS --verbose --debug" + "--ortho=DGKS --verbose --debug" + "--ortho=IMGS --verbose --debug" COMM serial mpi ) diff --git a/packages/belos/src/BelosBlockCGSolMgr.hpp b/packages/belos/src/BelosBlockCGSolMgr.hpp index a1b0a1dda7c6..a11cf3e55772 100644 --- a/packages/belos/src/BelosBlockCGSolMgr.hpp +++ b/packages/belos/src/BelosBlockCGSolMgr.hpp @@ -55,9 +55,7 @@ #include "BelosCGIter.hpp" #include "BelosCGSingleRedIter.hpp" #include "BelosBlockCGIter.hpp" -#include "BelosDGKSOrthoManager.hpp" -#include "BelosICGSOrthoManager.hpp" -#include "BelosIMGSOrthoManager.hpp" +#include "BelosOrthoManagerFactory.hpp" #include "BelosStatusTestMaxIters.hpp" #include "BelosStatusTestGenResNorm.hpp" #include "BelosStatusTestCombo.hpp" @@ -548,54 +546,6 @@ setParameters (const Teuchos::RCP ¶ms) } } - // Check if the orthogonalization changed. - if (params->isParameter("Orthogonalization")) { - std::string tempOrthoType = params->get("Orthogonalization",orthoType_default_); - TEUCHOS_TEST_FOR_EXCEPTION( tempOrthoType != "DGKS" && tempOrthoType != "ICGS" && tempOrthoType != "IMGS", - std::invalid_argument, - "Belos::BlockCGSolMgr: \"Orthogonalization\" must be either \"DGKS\", \"ICGS\", or \"IMGS\"."); - if (tempOrthoType != orthoType_) { - orthoType_ = tempOrthoType; - params_->set("Orthogonalization", orthoType_); - // Create orthogonalization manager - if (orthoType_=="DGKS") { - if (orthoKappa_ <= 0) { - ortho_ = Teuchos::rcp( new DGKSOrthoManager( label_ ) ); - } - else { - ortho_ = Teuchos::rcp( new DGKSOrthoManager( label_ ) ); - Teuchos::rcp_dynamic_cast >(ortho_)->setDepTol( orthoKappa_ ); - } - } - else if (orthoType_=="ICGS") { - ortho_ = Teuchos::rcp( new ICGSOrthoManager( label_ ) ); - } - else if (orthoType_=="IMGS") { - ortho_ = Teuchos::rcp( new IMGSOrthoManager( label_ ) ); - } - } - } - - // Check which orthogonalization constant to use. - if (params->isParameter("Orthogonalization Constant")) { - if (params->isType ("Orthogonalization Constant")) { - orthoKappa_ = params->get ("Orthogonalization Constant", - static_cast (DefaultSolverParameters::orthoKappa)); - } - else { - orthoKappa_ = params->get ("Orthogonalization Constant", - DefaultSolverParameters::orthoKappa); - } - - // Update parameter in our list. - params_->set("Orthogonalization Constant",orthoKappa_); - if (orthoType_=="DGKS") { - if (orthoKappa_ > 0 && ortho_ != Teuchos::null) { - Teuchos::rcp_dynamic_cast >(ortho_)->setDepTol( orthoKappa_ ); - } - } - } - // Check for a change in verbosity level if (params->isParameter("Verbosity")) { if (Teuchos::isParameterType(*params,"Verbosity")) { @@ -650,6 +600,48 @@ setParameters (const Teuchos::RCP ¶ms) printer_ = Teuchos::rcp( new OutputManager(verbosity_, outputStream_) ); } + // Check if the orthogonalization changed. + bool changedOrthoType = false; + if (params->isParameter("Orthogonalization")) { + std::string tempOrthoType = params->get("Orthogonalization",orthoType_default_); + if (tempOrthoType != orthoType_) { + orthoType_ = tempOrthoType; + changedOrthoType = true; + } + } + params_->set("Orthogonalization", orthoType_); + + // Check which orthogonalization constant to use. + if (params->isParameter("Orthogonalization Constant")) { + if (params->isType ("Orthogonalization Constant")) { + orthoKappa_ = params->get ("Orthogonalization Constant", + static_cast (DefaultSolverParameters::orthoKappa)); + } + else { + orthoKappa_ = params->get ("Orthogonalization Constant", + DefaultSolverParameters::orthoKappa); + } + + // Update parameter in our list. + params_->set("Orthogonalization Constant",orthoKappa_); + if (orthoType_=="DGKS") { + if (orthoKappa_ > 0 && ortho_ != Teuchos::null && !changedOrthoType) { + Teuchos::rcp_dynamic_cast >(ortho_)->setDepTol( orthoKappa_ ); + } + } + } + + // Create orthogonalization manager if we need to. + if (ortho_ == Teuchos::null || changedOrthoType) { + Belos::OrthoManagerFactory factory; + Teuchos::RCP paramsOrtho; // can be null + if (orthoType_=="DGKS" && orthoKappa_ > 0) { + paramsOrtho->set ("depTol", orthoKappa_ ); + } + + ortho_ = factory.makeMatOrthoManager (orthoType_, Teuchos::null, printer_, label_, paramsOrtho); + } + // Convergence typedef Belos::StatusTestCombo StatusTestCombo_t; typedef Belos::StatusTestGenResNorm StatusTestResNorm_t; @@ -752,30 +744,6 @@ setParameters (const Teuchos::RCP ¶ms) } - // Create orthogonalization manager if we need to. - if (ortho_ == Teuchos::null) { - params_->set("Orthogonalization", orthoType_); - if (orthoType_=="DGKS") { - if (orthoKappa_ <= 0) { - ortho_ = Teuchos::rcp( new DGKSOrthoManager( label_ ) ); - } - else { - ortho_ = Teuchos::rcp( new DGKSOrthoManager( label_ ) ); - Teuchos::rcp_dynamic_cast >(ortho_)->setDepTol( orthoKappa_ ); - } - } - else if (orthoType_=="ICGS") { - ortho_ = Teuchos::rcp( new ICGSOrthoManager( label_ ) ); - } - else if (orthoType_=="IMGS") { - ortho_ = Teuchos::rcp( new IMGSOrthoManager( label_ ) ); - } - else { - TEUCHOS_TEST_FOR_EXCEPTION(orthoType_!="ICGS"&&orthoType_!="DGKS"&&orthoType_!="IMGS",std::logic_error, - "Belos::BlockCGSolMgr(): Invalid orthogonalization type."); - } - } - // BelosCgIter accepts a parameter specifying whether to assert for the positivity of p^H*A*p in the CG iteration if (params->isParameter("Assert Positive Definiteness")) { assertPositiveDefiniteness_ = Teuchos::getParameter(*params,"Assert Positive Definiteness"); diff --git a/packages/belos/src/BelosBlockGmresSolMgr.hpp b/packages/belos/src/BelosBlockGmresSolMgr.hpp index 17fd28455a48..93d47e92b646 100644 --- a/packages/belos/src/BelosBlockGmresSolMgr.hpp +++ b/packages/belos/src/BelosBlockGmresSolMgr.hpp @@ -631,24 +631,15 @@ void BlockGmresSolMgr::setParameters( const Teuchos::RCPisParameter("Orthogonalization")) { std::string tempOrthoType = params->get("Orthogonalization",orthoType_default_); if (tempOrthoType != orthoType_) { orthoType_ = tempOrthoType; - params_->set("Orthogonalization", orthoType_); - // Create orthogonalization manager - Belos::OrthoManagerFactory factory; - Teuchos::RCP paramsOrtho; // can be null - if (orthoType_=="DGKS" && orthoKappa_ > 0) { - paramsOrtho->set ("depTol", orthoKappa_ ); - } - - ortho_ = factory.makeMatOrthoManager (orthoType_, Teuchos::null, printer_, "Belos", paramsOrtho); - TEUCHOS_TEST_FOR_EXCEPTION - (ortho_.get () == nullptr, std::runtime_error, "BlockGmres: Failed to " - "create (Mat)OrthoManager of type \"" << orthoType_ << "\"."); + changedOrthoType = true; } } + params_->set("Orthogonalization", orthoType_); // Check which orthogonalization constant to use. if (params->isParameter("Orthogonalization Constant")) { @@ -664,12 +655,23 @@ void BlockGmresSolMgr::setParameters( const Teuchos::RCPset("Orthogonalization Constant",orthoKappa_); if (orthoType_=="DGKS") { - if (orthoKappa_ > 0 && ortho_ != Teuchos::null) { + if (orthoKappa_ > 0 && ortho_ != Teuchos::null && !changedOrthoType) { Teuchos::rcp_dynamic_cast >(ortho_)->setDepTol( orthoKappa_ ); } } } + // Create orthogonalization manager if we need to. + if (ortho_ == Teuchos::null || changedOrthoType) { + Belos::OrthoManagerFactory factory; + Teuchos::RCP paramsOrtho; // can be null + if (orthoType_=="DGKS" && orthoKappa_ > 0) { + paramsOrtho->set ("depTol", orthoKappa_ ); + } + + ortho_ = factory.makeMatOrthoManager (orthoType_, Teuchos::null, printer_, label_, paramsOrtho); + } + // Check for convergence tolerance if (params->isParameter("Convergence Tolerance")) { if (params->isType ("Convergence Tolerance")) { @@ -743,7 +745,6 @@ void BlockGmresSolMgr::setParameters( const Teuchos::RCPisParameter("Show Maximum Residual Norm Only")) { showMaxResNormOnly_ = Teuchos::getParameter(*params,"Show Maximum Residual Norm Only"); @@ -755,17 +756,6 @@ void BlockGmresSolMgr::setParameters( const Teuchos::RCPsetShowMaxResNormOnly( showMaxResNormOnly_ ); } - // Create orthogonalization manager if we need to. - if (ortho_ == Teuchos::null) { - params_->set("Orthogonalization", orthoType_); - Belos::OrthoManagerFactory factory; - Teuchos::RCP paramsOrtho; // can be null - if (orthoType_=="DGKS" && orthoKappa_ > 0) { - paramsOrtho->set ("depTol", orthoKappa_ ); - } - - ortho_ = factory.makeMatOrthoManager (orthoType_, Teuchos::null, printer_, "Belos", paramsOrtho); - } // Create the timer if we need to. if (timerSolve_ == Teuchos::null) { diff --git a/packages/belos/src/BelosGmresPolyOp.hpp b/packages/belos/src/BelosGmresPolyOp.hpp index 16c62fc93dad..f1364b045a3e 100644 --- a/packages/belos/src/BelosGmresPolyOp.hpp +++ b/packages/belos/src/BelosGmresPolyOp.hpp @@ -57,10 +57,7 @@ #include "BelosGmresIteration.hpp" #include "BelosBlockGmresIter.hpp" - -#include "BelosDGKSOrthoManager.hpp" -#include "BelosICGSOrthoManager.hpp" -#include "BelosIMGSOrthoManager.hpp" +#include "BelosOrthoManagerFactory.hpp" #include "BelosStatusTestMaxIters.hpp" #include "BelosStatusTestGenResNorm.hpp" @@ -394,9 +391,6 @@ namespace Belos { if (params_in->isParameter("Orthogonalization")) { orthoType_ = params_in->get("Orthogonalization",orthoType_default_); - TEUCHOS_TEST_FOR_EXCEPTION( orthoType_ != "DGKS" && orthoType_ != "ICGS" && orthoType_ != "IMGS", - std::invalid_argument, - "Belos::GmresPolyOp: \"Orthogonalization\" must be either \"DGKS\", \"ICGS\", or \"IMGS\"."); } // Check for timer label @@ -553,26 +547,17 @@ namespace Belos { polyList.set("Block Size",1); polyList.set("Keep Hessenberg", true); + // Create output manager. + printer_ = Teuchos::rcp( new OutputManager(verbosity_, outputStream_) ); + // Create orthogonalization manager if we need to. if (ortho_.is_null()) { params_->set("Orthogonalization", orthoType_); - if (orthoType_=="DGKS") { - ortho_ = Teuchos::rcp( new DGKSOrthoManager( polyLabel ) ); - } - else if (orthoType_=="ICGS") { - ortho_ = Teuchos::rcp( new ICGSOrthoManager( polyLabel ) ); - } - else if (orthoType_=="IMGS") { - ortho_ = Teuchos::rcp( new IMGSOrthoManager( polyLabel ) ); - } - else { - TEUCHOS_TEST_FOR_EXCEPTION(orthoType_!="ICGS"&&orthoType_!="DGKS"&&orthoType_!="IMGS",std::invalid_argument, - "Belos::GmresPolyOp(): Invalid orthogonalization type."); - } - } + Belos::OrthoManagerFactory factory; + Teuchos::RCP paramsOrtho; // can be null - // Create output manager. - printer_ = Teuchos::rcp( new OutputManager(verbosity_, outputStream_) ); + ortho_ = factory.makeMatOrthoManager (orthoType_, Teuchos::null, printer_, polyLabel, paramsOrtho); + } // Create a simple status test that either reaches the relative residual tolerance or maximum polynomial size. Teuchos::RCP > maxItrTst = diff --git a/packages/belos/src/BelosGmresPolySolMgr.hpp b/packages/belos/src/BelosGmresPolySolMgr.hpp index 4f3759e851a8..b2958ace47f8 100644 --- a/packages/belos/src/BelosGmresPolySolMgr.hpp +++ b/packages/belos/src/BelosGmresPolySolMgr.hpp @@ -54,6 +54,7 @@ #include "BelosSolverManager.hpp" #include "BelosGmresPolyOp.hpp" #include "BelosSolverFactory_Generic.hpp" +#include "BelosOrthoManagerFactory.hpp" #include "Teuchos_as.hpp" #ifdef BELOS_TEUCHOS_TIME_MONITOR #include "Teuchos_TimeMonitor.hpp" @@ -507,9 +508,16 @@ setParameters (const Teuchos::RCP& params) // Check if the orthogonalization changed. if (params->isParameter("Orthogonalization")) { std::string tempOrthoType = params->get("Orthogonalization",orthoType_default_); - TEUCHOS_TEST_FOR_EXCEPTION( tempOrthoType != "DGKS" && tempOrthoType != "ICGS" && tempOrthoType != "IMGS", - std::invalid_argument, - "Belos::GmresPolySolMgr: \"Orthogonalization\" must be either \"DGKS\", \"ICGS\", or \"IMGS\"."); + OrthoManagerFactory factory; + // Ensure that the specified orthogonalization type is valid. + if (! factory.isValidName (tempOrthoType)) { + std::ostringstream os; + os << "Belos::GCRODRSolMgr: Invalid orthogonalization name \"" + << tempOrthoType << "\". The following are valid options " + << "for the \"Orthogonalization\" name parameter: "; + factory.printValidNames (os); + throw std::invalid_argument (os.str()); + } if (tempOrthoType != orthoType_) { orthoType_ = tempOrthoType; } diff --git a/packages/belos/src/BelosICGSOrthoManager.hpp b/packages/belos/src/BelosICGSOrthoManager.hpp index 0009799015c7..135d92cfd018 100644 --- a/packages/belos/src/BelosICGSOrthoManager.hpp +++ b/packages/belos/src/BelosICGSOrthoManager.hpp @@ -1196,7 +1196,7 @@ namespace Belos { // Normalize Xj. // Xj <- Xj / std::sqrt(newDot) ScalarType diag = SCT::squareroot(SCT::magnitude(newDot[0])); - { + if (SCT::magnitude(diag) > ZERO) { MVT::MvScale( *Xj, ONE/diag ); if (this->_hasOp) { // Update MXj. diff --git a/packages/belos/src/BelosIMGSOrthoManager.hpp b/packages/belos/src/BelosIMGSOrthoManager.hpp index 88d6c5c33b8d..4baef552087f 100644 --- a/packages/belos/src/BelosIMGSOrthoManager.hpp +++ b/packages/belos/src/BelosIMGSOrthoManager.hpp @@ -1163,7 +1163,7 @@ namespace Belos { // Normalize Xj. // Xj <- Xj / std::sqrt(newDot) ScalarType diag = SCT::squareroot(SCT::magnitude(newDot[0])); - { + if (SCT::magnitude(diag) > ZERO) { MVT::MvScale( *Xj, ONE/diag ); if (this->_hasOp) { // Update MXj. diff --git a/packages/belos/src/BelosOrthoManagerFactory.hpp b/packages/belos/src/BelosOrthoManagerFactory.hpp index 2054ed885e87..bc92642f48b0 100644 --- a/packages/belos/src/BelosOrthoManagerFactory.hpp +++ b/packages/belos/src/BelosOrthoManagerFactory.hpp @@ -112,9 +112,9 @@ namespace Belos { OrthoManagerFactory () : theList_ (numOrthoManagers()) { int index = 0; - theList_[index++] = "DGKS"; theList_[index++] = "ICGS"; theList_[index++] = "IMGS"; + theList_[index++] = "DGKS"; #ifdef HAVE_BELOS_TSQR theList_[index++] = "TSQR"; #endif // HAVE_BELOS_TSQR diff --git a/packages/belos/src/BelosOrthoManagerTest.hpp b/packages/belos/src/BelosOrthoManagerTest.hpp index 97589c149d13..4d6e52fb1542 100644 --- a/packages/belos/src/BelosOrthoManagerTest.hpp +++ b/packages/belos/src/BelosOrthoManagerTest.hpp @@ -579,6 +579,15 @@ namespace Belos { << " failed." << endl; } + { + // + // Test normalize() for various deficient cases + // + debugOut << "Testing normalize() on bad multivectors " << endl; + const int thisNumFailed = testNormalize(OM,S,MyOM); + numFailed += thisNumFailed; + } + if (isRankRevealing) { // run a X1,Y2 range multivector against P_{X1,X1} P_{Y2,Y2} @@ -618,7 +627,7 @@ namespace Belos { MVT::SetBlock(*mid,ind,*S); debugOut << "Testing normalize() on a rank-deficient multivector " << endl; - const int thisNumFailed = testNormalize(OM,S,MyOM); + const int thisNumFailed = testNormalizeRankReveal(OM,S,MyOM); numFailed += thisNumFailed; if (thisNumFailed > 0) debugOut << " *** " << thisNumFailed @@ -644,7 +653,7 @@ namespace Belos { MVT::MvAddMv(scaleS(i,0),*one,ZERO,*one,*Si); } debugOut << "Testing normalize() on a rank-1 multivector " << endl; - const int thisNumFailed = testNormalize(OM,S,MyOM); + const int thisNumFailed = testNormalizeRankReveal(OM,S,MyOM); numFailed += thisNumFailed; if (thisNumFailed > 0) debugOut << " *** " << thisNumFailed @@ -1137,6 +1146,40 @@ namespace Belos { testNormalize (const Teuchos::RCP< Belos::OrthoManager< Scalar, MV > >& OM, const Teuchos::RCP< const MV >& S, const Teuchos::RCP< Belos::OutputManager< Scalar > >& MyOM) + { + using Teuchos::RCP; + + int numFailures = 0; + const scalar_type ZERO = SCT::zero(); + + const int msgType = (static_cast(Debug) | static_cast(Errors)); + + // Check that the orthogonalization gracefully handles zero vectors. + RCP zeroVec = MVT::Clone(*S,1); + RCP< mat_type > bZero (new mat_type (1, 1)); + std::vector< magnitude_type > zeroNorm( 1 ); + + MVT::MvInit( *zeroVec, ZERO ); + OM->normalize( *zeroVec, bZero ); + MVT::MvNorm( *zeroVec, zeroNorm ); + // Check if the number is a NaN, this orthogonalization fails if it is. + if ( zeroNorm[0] != ZERO ) + { + MyOM->stream(static_cast< MsgType >(msgType)) << " --> Normalization of zero vector FAILED!" << std::endl; + numFailures++; + } + + return numFailures; + } + + /// Test OrthoManager::normalize() for the specific OrthoManager + /// instance. + /// + /// \return Count of errors (should be zero) + static int + testNormalizeRankReveal (const Teuchos::RCP< Belos::OrthoManager< Scalar, MV > >& OM, + const Teuchos::RCP< const MV >& S, + const Teuchos::RCP< Belos::OutputManager< Scalar > >& MyOM) { using Teuchos::Array; using Teuchos::RCP; diff --git a/packages/belos/src/BelosPCPGSolMgr.hpp b/packages/belos/src/BelosPCPGSolMgr.hpp index 9780857a94ca..0bc7890d22d9 100644 --- a/packages/belos/src/BelosPCPGSolMgr.hpp +++ b/packages/belos/src/BelosPCPGSolMgr.hpp @@ -53,9 +53,7 @@ #include "BelosPCPGIter.hpp" -#include "BelosDGKSOrthoManager.hpp" -#include "BelosICGSOrthoManager.hpp" -#include "BelosIMGSOrthoManager.hpp" +#include "BelosOrthoManagerFactory.hpp" #include "BelosStatusTestMaxIters.hpp" #include "BelosStatusTestGenResNorm.hpp" #include "BelosStatusTestCombo.hpp" @@ -541,54 +539,6 @@ void PCPGSolMgr::setParameters( const Teuchos::RCPisParameter("Orthogonalization")) { - std::string tempOrthoType = params->get("Orthogonalization",orthoType_default_); - TEUCHOS_TEST_FOR_EXCEPTION( tempOrthoType != "DGKS" && tempOrthoType != "ICGS" && tempOrthoType != "IMGS", - std::invalid_argument, - "Belos::PCPGSolMgr: \"Orthogonalization\" must be either \"DGKS\", \"ICGS\", or \"IMGS\"."); - if (tempOrthoType != orthoType_) { - orthoType_ = tempOrthoType; - params_->set("Orthogonalization", orthoType_); - // Create orthogonalization manager - if (orthoType_=="DGKS") { - if (orthoKappa_ <= 0) { - ortho_ = Teuchos::rcp( new DGKSOrthoManager( label_ ) ); - } - else { - ortho_ = Teuchos::rcp( new DGKSOrthoManager( label_ ) ); - Teuchos::rcp_dynamic_cast >(ortho_)->setDepTol( orthoKappa_ ); - } - } - else if (orthoType_=="ICGS") { - ortho_ = Teuchos::rcp( new ICGSOrthoManager( label_ ) ); - } - else if (orthoType_=="IMGS") { - ortho_ = Teuchos::rcp( new IMGSOrthoManager( label_ ) ); - } - } - } - - // Check which orthogonalization constant to use. - if (params->isParameter("Orthogonalization Constant")) { - if (params->isType ("Orthogonalization Constant")) { - orthoKappa_ = params->get ("Orthogonalization Constant", - static_cast (DefaultSolverParameters::orthoKappa)); - } - else { - orthoKappa_ = params->get ("Orthogonalization Constant", - DefaultSolverParameters::orthoKappa); - } - - // Update parameter in our list. - params_->set("Orthogonalization Constant",orthoKappa_); - if (orthoType_=="DGKS") { - if (orthoKappa_ > 0 && ortho_ != Teuchos::null) { - Teuchos::rcp_dynamic_cast >(ortho_)->setDepTol( orthoKappa_ ); - } - } - } - // Check for a change in verbosity level if (params->isParameter("Verbosity")) { if (Teuchos::isParameterType(*params,"Verbosity")) { @@ -643,6 +593,48 @@ void PCPGSolMgr::setParameters( const Teuchos::RCP(verbosity_, outputStream_) ); } + // Check if the orthogonalization changed. + bool changedOrthoType = false; + if (params->isParameter("Orthogonalization")) { + std::string tempOrthoType = params->get("Orthogonalization",orthoType_default_); + if (tempOrthoType != orthoType_) { + orthoType_ = tempOrthoType; + changedOrthoType = true; + } + } + params_->set("Orthogonalization", orthoType_); + + // Check which orthogonalization constant to use. + if (params->isParameter("Orthogonalization Constant")) { + if (params->isType ("Orthogonalization Constant")) { + orthoKappa_ = params->get ("Orthogonalization Constant", + static_cast (DefaultSolverParameters::orthoKappa)); + } + else { + orthoKappa_ = params->get ("Orthogonalization Constant", + DefaultSolverParameters::orthoKappa); + } + + // Update parameter in our list. + params_->set("Orthogonalization Constant",orthoKappa_); + if (orthoType_=="DGKS") { + if (orthoKappa_ > 0 && ortho_ != Teuchos::null && !changedOrthoType) { + Teuchos::rcp_dynamic_cast >(ortho_)->setDepTol( orthoKappa_ ); + } + } + } + + // Create orthogonalization manager if we need to. + if (ortho_ == Teuchos::null || changedOrthoType) { + Belos::OrthoManagerFactory factory; + Teuchos::RCP paramsOrtho; // can be null + if (orthoType_=="DGKS" && orthoKappa_ > 0) { + paramsOrtho->set ("depTol", orthoKappa_ ); + } + + ortho_ = factory.makeMatOrthoManager (orthoType_, Teuchos::null, printer_, label_, paramsOrtho); + } + // Convergence typedef Belos::StatusTestCombo StatusTestCombo_t; typedef Belos::StatusTestGenResNorm StatusTestResNorm_t; @@ -683,31 +675,6 @@ void PCPGSolMgr::setParameters( const Teuchos::RCPsetSolverDesc( solverDesc ); - - // Create orthogonalization manager if we need to. - if (ortho_ == Teuchos::null) { - params_->set("Orthogonalization", orthoType_); - if (orthoType_=="DGKS") { - if (orthoKappa_ <= 0) { - ortho_ = Teuchos::rcp( new DGKSOrthoManager( label_ ) ); - } - else { - ortho_ = Teuchos::rcp( new DGKSOrthoManager( label_ ) ); - Teuchos::rcp_dynamic_cast >(ortho_)->setDepTol( orthoKappa_ ); - } - } - else if (orthoType_=="ICGS") { - ortho_ = Teuchos::rcp( new ICGSOrthoManager( label_ ) ); - } - else if (orthoType_=="IMGS") { - ortho_ = Teuchos::rcp( new IMGSOrthoManager( label_ ) ); - } - else { - TEUCHOS_TEST_FOR_EXCEPTION(orthoType_!="ICGS"&&orthoType_!="DGKS"&&orthoType_!="IMGS",std::logic_error, - "Belos::PCPGSolMgr(): Invalid orthogonalization type."); - } - } - // Create the timer if we need to. if (timerSolve_ == Teuchos::null) { std::string solveLabel = label_ + ": PCPGSolMgr total solve time"; diff --git a/packages/belos/src/BelosPseudoBlockGmresSolMgr.hpp b/packages/belos/src/BelosPseudoBlockGmresSolMgr.hpp index ee50651808a0..0c485fbda3af 100644 --- a/packages/belos/src/BelosPseudoBlockGmresSolMgr.hpp +++ b/packages/belos/src/BelosPseudoBlockGmresSolMgr.hpp @@ -53,12 +53,7 @@ #include "BelosSolverManager.hpp" #include "BelosPseudoBlockGmresIter.hpp" -#include "BelosDGKSOrthoManager.hpp" -#include "BelosICGSOrthoManager.hpp" -#include "BelosIMGSOrthoManager.hpp" -#ifdef HAVE_BELOS_TSQR -# include "BelosTsqrOrthoManager.hpp" -#endif // HAVE_BELOS_TSQR +#include "BelosOrthoManagerFactory.hpp" #include "BelosStatusTestFactory.hpp" #include "BelosStatusTestOutputFactory.hpp" #include "BelosOutputManager.hpp" @@ -683,78 +678,6 @@ setParameters (const Teuchos::RCP& params) } } - // Check if the orthogonalization changed. - if (params->isParameter ("Orthogonalization")) { - std::string tempOrthoType = params->get ("Orthogonalization", orthoType_default_); -#ifdef HAVE_BELOS_TSQR - TEUCHOS_TEST_FOR_EXCEPTION( - tempOrthoType != "DGKS" && tempOrthoType != "ICGS" && - tempOrthoType != "IMGS" && tempOrthoType != "TSQR", - std::invalid_argument, - "Belos::PseudoBlockGmresSolMgr::setParameters: " - "The \"Orthogonalization\" parameter must be one of \"DGKS\", \"ICGS\", " - "\"IMGS\", or \"TSQR\"."); -#else - TEUCHOS_TEST_FOR_EXCEPTION( - tempOrthoType != "DGKS" && tempOrthoType != "ICGS" && - tempOrthoType != "IMGS", - std::invalid_argument, - "Belos::PseudoBlockGmresSolMgr::setParameters: " - "The \"Orthogonalization\" parameter must be one of \"DGKS\", \"ICGS\", " - "or \"IMGS\"."); -#endif // HAVE_BELOS_TSQR - - if (tempOrthoType != orthoType_) { - orthoType_ = tempOrthoType; - params_->set("Orthogonalization", orthoType_); - // Create orthogonalization manager - if (orthoType_ == "DGKS") { - typedef DGKSOrthoManager ortho_type; - if (orthoKappa_ <= 0) { - ortho_ = rcp (new ortho_type (label_)); - } - else { - ortho_ = rcp (new ortho_type (label_)); - rcp_dynamic_cast (ortho_)->setDepTol (orthoKappa_); - } - } - else if (orthoType_ == "ICGS") { - typedef ICGSOrthoManager ortho_type; - ortho_ = rcp (new ortho_type (label_)); - } - else if (orthoType_ == "IMGS") { - typedef IMGSOrthoManager ortho_type; - ortho_ = rcp (new ortho_type (label_)); - } -#ifdef HAVE_BELOS_TSQR - else if (orthoType_ == "TSQR") { - typedef TsqrMatOrthoManager ortho_type; - ortho_ = rcp (new ortho_type (label_)); - } -#endif // HAVE_BELOS_TSQR - } - } - - // Check which orthogonalization constant to use. - if (params->isParameter ("Orthogonalization Constant")) { - if (params->isType ("Orthogonalization Constant")) { - orthoKappa_ = params->get ("Orthogonalization Constant", - static_cast (DefaultSolverParameters::orthoKappa)); - } - else { - orthoKappa_ = params->get ("Orthogonalization Constant", - DefaultSolverParameters::orthoKappa); - } - - // Update parameter in our list. - params_->set ("Orthogonalization Constant", orthoKappa_); - if (orthoType_ == "DGKS") { - if (orthoKappa_ > 0 && ! ortho_.is_null ()) { - typedef DGKSOrthoManager ortho_type; - rcp_dynamic_cast (ortho_)->setDepTol (orthoKappa_); - } - } - } // Check for a change in verbosity level if (params->isParameter ("Verbosity")) { @@ -828,6 +751,49 @@ setParameters (const Teuchos::RCP& params) printer_ = rcp (new OutputManager (verbosity_, outputStream_)); } + // Check if the orthogonalization changed. + bool changedOrthoType = false; + if (params->isParameter ("Orthogonalization")) { + std::string tempOrthoType = params->get ("Orthogonalization", orthoType_default_); + if (tempOrthoType != orthoType_) { + orthoType_ = tempOrthoType; + changedOrthoType = true; + } + } + params_->set("Orthogonalization", orthoType_); + + // Check which orthogonalization constant to use. + if (params->isParameter ("Orthogonalization Constant")) { + if (params->isType ("Orthogonalization Constant")) { + orthoKappa_ = params->get ("Orthogonalization Constant", + static_cast (DefaultSolverParameters::orthoKappa)); + } + else { + orthoKappa_ = params->get ("Orthogonalization Constant", + DefaultSolverParameters::orthoKappa); + } + + // Update parameter in our list. + params_->set ("Orthogonalization Constant", orthoKappa_); + if (orthoType_ == "DGKS") { + if (orthoKappa_ > 0 && ! ortho_.is_null() && !changedOrthoType) { + typedef DGKSOrthoManager ortho_type; + rcp_dynamic_cast (ortho_)->setDepTol (orthoKappa_); + } + } + } + + // Create orthogonalization manager if we need to. + if (ortho_.is_null() || changedOrthoType) { + Belos::OrthoManagerFactory factory; + Teuchos::RCP paramsOrtho; // can be null + if (orthoType_=="DGKS" && orthoKappa_ > 0) { + paramsOrtho->set ("depTol", orthoKappa_ ); + } + + ortho_ = factory.makeMatOrthoManager (orthoType_, Teuchos::null, printer_, label_, paramsOrtho); + } + // Convergence // Check for convergence tolerance @@ -1009,52 +975,6 @@ setParameters (const Teuchos::RCP& params) } } - // Create orthogonalization manager if we need to. - if (ortho_.is_null ()) { - params_->set("Orthogonalization", orthoType_); - if (orthoType_ == "DGKS") { - typedef DGKSOrthoManager ortho_type; - if (orthoKappa_ <= 0) { - ortho_ = rcp (new ortho_type (label_)); - } - else { - ortho_ = rcp (new ortho_type (label_)); - rcp_dynamic_cast (ortho_)->setDepTol (orthoKappa_); - } - } - else if (orthoType_ == "ICGS") { - typedef ICGSOrthoManager ortho_type; - ortho_ = rcp (new ortho_type (label_)); - } - else if (orthoType_ == "IMGS") { - typedef IMGSOrthoManager ortho_type; - ortho_ = rcp (new ortho_type (label_)); - } -#ifdef HAVE_BELOS_TSQR - else if (orthoType_ == "TSQR") { - typedef TsqrMatOrthoManager ortho_type; - ortho_ = rcp (new ortho_type (label_)); - } -#endif // HAVE_BELOS_TSQR - else { -#ifdef HAVE_BELOS_TSQR - TEUCHOS_TEST_FOR_EXCEPTION( - orthoType_ != "ICGS" && orthoType_ != "DGKS" && - orthoType_ != "IMGS" && orthoType_ != "TSQR", - std::logic_error, - "Belos::PseudoBlockGmresSolMgr::setParameters(): " - "Invalid orthogonalization type \"" << orthoType_ << "\"."); -#else - TEUCHOS_TEST_FOR_EXCEPTION( - orthoType_ != "ICGS" && orthoType_ != "DGKS" && - orthoType_ != "IMGS", - std::logic_error, - "Belos::PseudoBlockGmresSolMgr::setParameters(): " - "Invalid orthogonalization type \"" << orthoType_ << "\"."); -#endif // HAVE_BELOS_TSQR - } - } - // Create the timer if we need to. if (timerSolve_ == Teuchos::null) { std::string solveLabel = label_ + ": PseudoBlockGmresSolMgr total solve time"; diff --git a/packages/compadre/CMakeLists.txt b/packages/compadre/CMakeLists.txt index 9e5511dbd30f..153060e2c378 100644 --- a/packages/compadre/CMakeLists.txt +++ b/packages/compadre/CMakeLists.txt @@ -1,6 +1,7 @@ CMAKE_MINIMUM_REQUIRED(VERSION 3.10.0 FATAL_ERROR) -set(Compadre_VERSION "1.0.3") +# get Compadre_VERSION +file(STRINGS ${CMAKE_CURRENT_LIST_DIR}/cmake/Compadre_Version.txt Compadre_VERSION) # Called at the top of every CMakeLists.txt file macro(include_tribits_build) @@ -69,6 +70,10 @@ else() # Raw CMake Project get_directory_property(Compadre_HAS_PARENT PARENT_DIRECTORY) + if (NOT Compadre_HAS_PARENT) + include(GNUInstallDirs) + endif() + bob_begin_package() # Set to OFF for significantly faster performance and ON for error tracking @@ -549,28 +554,6 @@ else() # Raw CMake Project add_subdirectory(python) endif() - ########## - # - # - # DOXYGEN - # - # - ########## - - find_package(Doxygen QUIET) - if (DOXYGEN_FOUND) - if (NOT(Compadre_HAS_PARENT)) - configure_file("${CMAKE_CURRENT_SOURCE_DIR}/doc/Doxyfile.in" "${CMAKE_CURRENT_SOURCE_DIR}/doc/Doxyfile" @ONLY) - add_custom_target(doc - COMMAND ${DOXYGEN_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/doc/Doxyfile - WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/doc - VERBATIM - ) - set_target_properties(doc PROPERTIES EXCLUDE_FROM_ALL TRUE) - # still must be called manually with "make doc" - endif() - endif() - if (Trilinos_PREFIX) bob_end_package_no_recurse("${Trilinos_LIBRARIES}") diff --git a/packages/compadre/cmake/Compadre_Version.txt b/packages/compadre/cmake/Compadre_Version.txt new file mode 100644 index 000000000000..21e8796a09d4 --- /dev/null +++ b/packages/compadre/cmake/Compadre_Version.txt @@ -0,0 +1 @@ +1.0.3 diff --git a/packages/compadre/doc/.gitignore b/packages/compadre/doc/.gitignore new file mode 100644 index 000000000000..ec5814524003 --- /dev/null +++ b/packages/compadre/doc/.gitignore @@ -0,0 +1,2 @@ +/html/ +/latex/ diff --git a/packages/compadre/doc/Doxyfile.in b/packages/compadre/doc/Doxyfile similarity index 99% rename from packages/compadre/doc/Doxyfile.in rename to packages/compadre/doc/Doxyfile index a6990dbeac34..88f59174dea4 100644 --- a/packages/compadre/doc/Doxyfile.in +++ b/packages/compadre/doc/Doxyfile @@ -38,7 +38,7 @@ PROJECT_NAME = Compadre # could be handy for archiving the generated documentation or if some version # control system is used. -PROJECT_NUMBER = @Compadre_VERSION_MAJOR@.@Compadre_VERSION_MINOR@.@Compadre_VERSION_PATCH@ +PROJECT_NUMBER = $(COMPADRE_VERSION) # Using the PROJECT_BRIEF tag one can provide an optional one line description # for a project that appears at the top of each page and should give viewer a @@ -58,7 +58,7 @@ PROJECT_LOGO = # entered, it will be relative to the location where doxygen was started. If # left blank the current directory will be used. -OUTPUT_DIRECTORY = @CMAKE_CURRENT_SOURCE_DIR@/doc/ +OUTPUT_DIRECTORY = . # If the CREATE_SUBDIRS tag is set to YES, then doxygen will create 4096 sub- # directories (in 2 levels) under the output directory of each output format and @@ -763,11 +763,13 @@ WARN_LOGFILE = # spaces. # Note: If this tag is empty the current directory is searched. -INPUT += @CMAKE_CURRENT_SOURCE_DIR@/src -INPUT += @CMAKE_CURRENT_SOURCE_DIR@/README.md -INPUT += @CMAKE_CURRENT_SOURCE_DIR@/LICENSE.md -INPUT += @CMAKE_CURRENT_SOURCE_DIR@/examples -INPUT += @CMAKE_CURRENT_SOURCE_DIR@/python +INPUT += ../src +INPUT += ../src/basis +INPUT += ../src/constraints +INPUT += ../README.md +INPUT += ../LICENSE.md +INPUT += ../examples +INPUT += ../python # This tag can be used to specify the character encoding of the source files # that doxygen parses. Internally doxygen uses the UTF-8 encoding. Doxygen uses @@ -846,9 +848,10 @@ RECURSIVE = NO # Note that relative paths are relative to the directory from which doxygen is # run. -EXCLUDE = @CMAKE_CURRENT_SOURCE_DIR@/python/GMLS_Module_wrap.cxx -EXCLUDE += @CMAKE_CURRENT_SOURCE_DIR@/python/__init__.py.in -EXCLUDE += @CMAKE_CURRENT_SOURCE_DIR@/python/GMLS_Module.py.in +EXCLUDE = ../python/GMLS_Module_wrap.cxx +EXCLUDE += ../python/__init__.py.in +EXCLUDE += ../python/GMLS_Module.py.in +EXCLUDE += ../python/insert_version.py # The EXCLUDE_SYMLINKS tag can be used to select whether or not files or # directories that are symbolic links (a Unix file system feature) are excluded @@ -881,7 +884,7 @@ EXCLUDE_SYMBOLS = Ifpack2 Tpetra # that contain example code fragments that are included (see the \include # command). -EXAMPLE_PATH = @CMAKE_CURRENT_SOURCE_DIR@/examples +EXAMPLE_PATH = ../examples # If the value of the EXAMPLE_PATH tag contains directories, you can use the # EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp and @@ -949,7 +952,7 @@ FILTER_SOURCE_PATTERNS = # (index.html). This can be useful if you have a project on for instance GitHub # and want to reuse the introduction page also for the doxygen output. -USE_MDFILE_AS_MAINPAGE = @CMAKE_CURRENT_SOURCE_DIR@/README.md +USE_MDFILE_AS_MAINPAGE = ../README.md #@CMAKE_CURRENT_SOURCE_DIR@/README.md #--------------------------------------------------------------------------- @@ -2149,7 +2152,7 @@ HIDE_UNDOC_RELATIONS = YES # set to NO # The default value is: NO. -HAVE_DOT = YES +HAVE_DOT = NO # The DOT_NUM_THREADS specifies the number of dot invocations doxygen is allowed # to run in parallel. When set to 0 doxygen will base this on the number of @@ -2321,7 +2324,7 @@ INTERACTIVE_SVG = NO # found. If left blank, it is assumed the dot tool can be found in the path. # This tag requires that the tag HAVE_DOT is set to YES. -DOT_PATH = /opt/local/bin/dot +DOT_PATH = # The DOTFILE_DIRS tag can be used to specify one or more directories that # contain dot files that are included in the documentation (see the \dotfile diff --git a/packages/compadre/doc/build_docs b/packages/compadre/doc/build_docs new file mode 100755 index 000000000000..1c955afe33ce --- /dev/null +++ b/packages/compadre/doc/build_docs @@ -0,0 +1,16 @@ +#!/bin/bash + +if [ $TRILINOS_HOME ]; then + echo "TRILINOS_HOME has already been set!" + export COMPADRE_VERSION=`<$TRILINOS_HOME/packages/compadre/cmake/Compadre_Version.txt` +else + echo "TRILINOS_HOME has not been set. Setting it!" + export TRILINOS_HOME=`pwd`/../../.. + export COMPADRE_VERSION=`<../cmake/Compadre_Version.txt` +fi + +echo +echo "Generating main compadre doxygen documentation ..." +echo + +doxygen Doxyfile diff --git a/packages/compadre/examples/CMakeLists.tribits.cmake b/packages/compadre/examples/CMakeLists.tribits.cmake index 546004cbf466..51fd305c2984 100644 --- a/packages/compadre/examples/CMakeLists.tribits.cmake +++ b/packages/compadre/examples/CMakeLists.tribits.cmake @@ -1,12 +1,12 @@ include_directories(${CMAKE_CURRENT_SOURCE_DIR}) -if (${TPL_ENABLE_LAPACK}) +if(Compadre_USE_LAPACK) tribits_add_executable( LAPACK_Test SOURCES UnitTest_ThreadedLapack.cpp ) # end tribits_add_executable -endif() # LAPACK enabled +endif() tribits_add_executable( GMLS_Host_Test @@ -88,7 +88,7 @@ tribits_add_executable( # Test if LAPACK+BLAS are compatible for use in the toolkit -if (${TPL_ENABLE_LAPACK}) +if(Compadre_USE_LAPACK) set(testName LAPACK_THREADSAFE) tribits_add_test( LAPACK_Test @@ -112,7 +112,7 @@ if (${TPL_ENABLE_LAPACK}) 77 ) # end set_tests_properties endif() # test created -endif() # LAPACK enabled +endif() # LAPACK being used # Host views tests for GMLS set(testName GMLS_Host_Dim3_SVD) @@ -133,7 +133,7 @@ if (${testName}_CREATED) LABELS "UnitTest;unit;kokkos" TIMEOUT - 10 + 60 ) # end set_tests_properties endif() # test created @@ -155,7 +155,7 @@ if (${testName}_CREATED) LABELS "UnitTest;unit;kokkos" TIMEOUT - 10 + 20 ) # end set_tests_properties endif() # test created @@ -177,7 +177,7 @@ if (${testName}_CREATED) LABELS "UnitTest;unit;kokkos" TIMEOUT - 10 + 20 ) # end set_tests_properties endif() # test created @@ -427,7 +427,7 @@ if (${testName}_CREATED) LABELS "UnitTest;unit;kokkos" TIMEOUT - 10 + 20 ) # end set_tests_properties endif() # test created @@ -449,7 +449,7 @@ if (${testName}_CREATED) LABELS "UnitTest;unit;kokkos" TIMEOUT - 10 + 20 ) # end set_tests_properties endif() # test created @@ -486,7 +486,7 @@ tribits_add_test( COMM serial mpi NUM_MPI_PROCS 1 ARGS - "3 200 3 1 0 0 --kokkos-threads=2" + "3 100 3 1 0 0 --kokkos-threads=4" ADDED_TESTS_NAMES_OUT ${testName}_CREATED ) # end tribits_add_test if (${testName}_CREATED) @@ -496,7 +496,7 @@ if (${testName}_CREATED) LABELS "UnitTest;unit;kokkos;staggered" TIMEOUT - 10 + 60 ) # end set_tests_properties endif() # test created @@ -520,7 +520,7 @@ if (${testName}_CREATED) LABELS "UnitTest;unit;kokkos;staggered" TIMEOUT - 10 + 20 ) # end set_tests_properties endif() # test created @@ -556,7 +556,7 @@ if (NOT(Compadre_DEBUG OR Compadre_EXTREME_DEBUG)) # Divergence-free basis test for GMLS on non-manifold # Note: SVD is needed to be used here due to the null space introduced - set(testName GMLS_DivergenceFree_Dim3_SVD) + set(testName GMLS_DivergenceFree_Dim3_P3_SVD) tribits_add_test( GMLS_Divergence_Test NAME @@ -571,11 +571,73 @@ if (NOT(Compadre_DEBUG OR Compadre_EXTREME_DEBUG)) ${${testName}_CREATED} PROPERTIES LABELS - "UnitTest;unit;kokkos;divergencefree;svd" + "UnitTest;unit;kokkos;divergencefree;svd;batched" + TIMEOUT + 60 + ) # end set_tests_properties + endif() # test created + #set(testName GMLS_DivergenceFree_Dim3_P2_SVD) + #tribits_add_test( + # GMLS_Divergence_Test + # NAME + # ${testName} + # NUM_MPI_PROCS 1 + # ARGS + # "2 200 3 0 0 0 --kokkos-threads=2" + # ADDED_TESTS_NAMES_OUT ${testName}_CREATED + # ) # end tribits_add_test + #if (${testName}_CREATED) + # set_tests_properties( + # ${${testName}_CREATED} + # PROPERTIES + # LABELS + # "UnitTest;unit;kokkos;divergencefree;svd" + # TIMEOUT + # 60 + # ) # end set_tests_properties + #endif() # test created + + # Divergence-free basis test for GMLS on non-manifold + set(testName GMLS_DivergenceFree_Dim2_P3_SVD) + tribits_add_test( + GMLS_Divergence_Test + NAME + ${testName} + NUM_MPI_PROCS 1 + ARGS + "3 200 2 0 0 0 --kokkos-threads=2" + ADDED_TESTS_NAMES_OUT ${testName}_CREATED + ) # end tribits_add_test + if (${testName}_CREATED) + set_tests_properties( + ${${testName}_CREATED} + PROPERTIES + LABELS + "UnitTest;unit;kokkos;divergencefree;svd;batched" TIMEOUT 60 ) # end set_tests_properties endif() # test created + #set(testName GMLS_DivergenceFree_Dim2_P2_SVD) + #tribits_add_test( + # GMLS_Divergence_Test + # NAME + # ${testName} + # NUM_MPI_PROCS 1 + # ARGS + # "2 200 2 0 0 0 --kokkos-threads=2" + # ADDED_TESTS_NAMES_OUT ${testName}_CREATED + # ) # end tribits_add_test + #if (${testName}_CREATED) + # set_tests_properties( + # ${${testName}_CREATED} + # PROPERTIES + # LABELS + # "UnitTest;unit;kokkos;divergencefree;svd" + # TIMEOUT + # 60 + # ) # end set_tests_properties + #endif() # test created endif() # not debug # Python driven test of a C++ executable (Python changes command line diff --git a/packages/compadre/examples/CMakeLists.txt b/packages/compadre/examples/CMakeLists.txt index 83747bb48db1..0ed90cb4fd85 100644 --- a/packages/compadre/examples/CMakeLists.txt +++ b/packages/compadre/examples/CMakeLists.txt @@ -55,13 +55,13 @@ if (Compadre_EXAMPLES) # Host views tests for GMLS ADD_TEST(NAME GMLS_Host_Dim3_SVD COMMAND ${CMAKE_CURRENT_BINARY_DIR}/GMLS_Host_Test "4" "200" "3" "0" "0" "0" "--kokkos-threads=2") - SET_TESTS_PROPERTIES(GMLS_Host_Dim3_SVD PROPERTIES LABELS "UnitTest;unit;kokkos" TIMEOUT 10) + SET_TESTS_PROPERTIES(GMLS_Host_Dim3_SVD PROPERTIES LABELS "UnitTest;unit;kokkos" TIMEOUT 60) ADD_TEST(NAME GMLS_Host_Dim2_SVD COMMAND ${CMAKE_CURRENT_BINARY_DIR}/GMLS_Host_Test "4" "200" "2" "0" "0" "0" "--kokkos-threads=2") - SET_TESTS_PROPERTIES(GMLS_Host_Dim2_SVD PROPERTIES LABELS "UnitTest;unit;kokkos" TIMEOUT 10) + SET_TESTS_PROPERTIES(GMLS_Host_Dim2_SVD PROPERTIES LABELS "UnitTest;unit;kokkos" TIMEOUT 20) ADD_TEST(NAME GMLS_Host_Dim1_SVD COMMAND ${CMAKE_CURRENT_BINARY_DIR}/GMLS_Host_Test "4" "200" "1" "0" "0" "0" "--kokkos-threads=2") - SET_TESTS_PROPERTIES(GMLS_Host_Dim1_SVD PROPERTIES LABELS "UnitTest;unit;kokkos" TIMEOUT 10) + SET_TESTS_PROPERTIES(GMLS_Host_Dim1_SVD PROPERTIES LABELS "UnitTest;unit;kokkos" TIMEOUT 20) # Device views tests for GMLS ADD_TEST(NAME GMLS_Device_Dim3_QR COMMAND ${CMAKE_CURRENT_BINARY_DIR}/GMLS_Device_Test "4" "200" "3" "1" "0" "0" "--kokkos-threads=2") @@ -101,10 +101,10 @@ if (Compadre_EXAMPLES) # Device views tests for small batch GMLS, reusing GMLS class object ADD_TEST(NAME GMLS_SmallBatchReuse_Device_Dim2_QR COMMAND ${CMAKE_CURRENT_BINARY_DIR}/GMLS_SmallBatchReuse_Device_Test "4" "200" "2" "1" "0" "0" "--kokkos-threads=2") - SET_TESTS_PROPERTIES(GMLS_SmallBatchReuse_Device_Dim2_QR PROPERTIES LABELS "UnitTest;unit;kokkos" TIMEOUT 10) + SET_TESTS_PROPERTIES(GMLS_SmallBatchReuse_Device_Dim2_QR PROPERTIES LABELS "UnitTest;unit;kokkos" TIMEOUT 20) ADD_TEST(NAME GMLS_SmallBatchReuse_Device_Dim1_QR COMMAND ${CMAKE_CURRENT_BINARY_DIR}/GMLS_SmallBatchReuse_Device_Test "4" "200" "1" "1" "0" "0" "--kokkos-threads=2") - SET_TESTS_PROPERTIES(GMLS_SmallBatchReuse_Device_Dim1_QR PROPERTIES LABELS "UnitTest;unit;kokkos" TIMEOUT 10) + SET_TESTS_PROPERTIES(GMLS_SmallBatchReuse_Device_Dim1_QR PROPERTIES LABELS "UnitTest;unit;kokkos" TIMEOUT 20) # Multisite test for GMLS ADD_TEST(NAME GMLS_MultiSite_Dim3_QR COMMAND ${CMAKE_CURRENT_BINARY_DIR}/GMLS_MultiSite_Test "4" "200" "3" "1" "0" "0" "--kokkos-threads=2") @@ -112,13 +112,13 @@ if (Compadre_EXAMPLES) # Staggered scheme test for GMLS on non-manifold # Note: Using even polynomial order may cause this test to fail - ADD_TEST(NAME GMLS_Staggered_Dim3_QR COMMAND ${CMAKD_CURRENT_BINARY_DIR}/GMLS_Staggered "3" "200" "3" "1" "0" "0" "--kokkos-threads=2") - SET_TESTS_PROPERTIES(GMLS_Staggered_Dim3_QR PROPERTIES LABELS "UnitTest;unit;kokkos;staggered" TIMEOUT 10) + ADD_TEST(NAME GMLS_Staggered_Dim3_QR COMMAND ${CMAKD_CURRENT_BINARY_DIR}/GMLS_Staggered "3" "100" "3" "1" "0" "0" "--kokkos-threads=4") + SET_TESTS_PROPERTIES(GMLS_Staggered_Dim3_QR PROPERTIES LABELS "UnitTest;unit;kokkos;staggered" TIMEOUT 60) # Staggered scheme test for GMLS on non-manifold # Note: Using even polynomial order may cause this test to fail ADD_TEST(NAME GMLS_Staggered_Dim2_QR COMMAND ${CMAKD_CURRENT_BINARY_DIR}/GMLS_Staggered "3" "200" "2" "1" "0" "0" "--kokkos-threads=2") - SET_TESTS_PROPERTIES(GMLS_Staggered_Dim2_QR PROPERTIES LABELS "UnitTest;unit;kokkos;staggered" TIMEOUT 10) + SET_TESTS_PROPERTIES(GMLS_Staggered_Dim2_QR PROPERTIES LABELS "UnitTest;unit;kokkos;staggered" TIMEOUT 20) if (NOT Compadre_DEBUG) # This test is too slow in DEBUG (3x longer than all other tests combined) @@ -132,8 +132,15 @@ if (Compadre_EXAMPLES) # Divergence-free basis test for GMLS on non-manifold # Note: SVD is needed to be used here due to the null space introduced - ADD_TEST(NAME GMLS_DivergenceFree_Dim3_SVD COMMAND ${CMAKD_CURRENT_BINARY_DIR}/GMLS_Divergence_Test "3" "200" "3" "0" "0" "0" "--kokkos-threads=2") - SET_TESTS_PROPERTIES(GMLS_DivergenceFree_Dim3_SVD PROPERTIES LABELS "UnitTest;unit;kokkos;divergencefree;svd" TIMEOUT 60) + ADD_TEST(NAME GMLS_DivergenceFree_Dim3_P3_SVD COMMAND ${CMAKD_CURRENT_BINARY_DIR}/GMLS_Divergence_Test "3" "200" "3" "0" "0" "0" "--kokkos-threads=2") + SET_TESTS_PROPERTIES(GMLS_DivergenceFree_Dim3_P3_SVD PROPERTIES LABELS "UnitTest;unit;kokkos;divergencefree;svd;batched" TIMEOUT 60) + #ADD_TEST(NAME GMLS_DivergenceFree_Dim3_P2_SVD COMMAND ${CMAKD_CURRENT_BINARY_DIR}/GMLS_Divergence_Test "2" "200" "3" "0" "0" "0" "--kokkos-threads=2") + #SET_TESTS_PROPERTIES(GMLS_DivergenceFree_Dim3_P2_SVD PROPERTIES LABELS "UnitTest;unit;kokkos;divergencefree;svd" TIMEOUT 60) + + ADD_TEST(NAME GMLS_DivergenceFree_Dim2_P3_SVD COMMAND ${CMAKD_CURRENT_BINARY_DIR}/GMLS_Divergence_Test "3" "200" "2" "0" "0" "0" "--kokkos-threads=2") + SET_TESTS_PROPERTIES(GMLS_DivergenceFree_Dim2_P3_SVD PROPERTIES LABELS "UnitTest;unit;kokkos;divergencefree;svd;batched" TIMEOUT 60) + #ADD_TEST(NAME GMLS_DivergenceFree_Dim2_P2_SVD COMMAND ${CMAKD_CURRENT_BINARY_DIR}/GMLS_Divergence_Test "2" "200" "2" "0" "0" "0" "--kokkos-threads=2") + #SET_TESTS_PROPERTIES(GMLS_DivergenceFree_Dim2_P2_SVD PROPERTIES LABELS "UnitTest;unit;kokkos;divergencefree;svd" TIMEOUT 60) endif() # # Manifold tests for GMLS diff --git a/packages/compadre/examples/GMLS_Device.cpp b/packages/compadre/examples/GMLS_Device.cpp index 5790bd17696b..02c89600f33c 100644 --- a/packages/compadre/examples/GMLS_Device.cpp +++ b/packages/compadre/examples/GMLS_Device.cpp @@ -51,6 +51,7 @@ bool all_passed = true; number_of_batches = arg8toi; } } + bool keep_coefficients = number_of_batches==1; // check if 7 arguments are given from the command line, the first being the program name // constraint_type used in solving each GMLS problem: @@ -365,7 +366,7 @@ bool all_passed = true; my_GMLS.setWeightingPower(2); // generate the alphas that to be combined with data for each target operation requested in lro - my_GMLS.generateAlphas(number_of_batches); + my_GMLS.generateAlphas(number_of_batches, keep_coefficients /* keep polynomial coefficients, only needed for a test later in this program */); //! [Setting Up The GMLS Object] diff --git a/packages/compadre/examples/GMLS_DivergenceFree.cpp b/packages/compadre/examples/GMLS_DivergenceFree.cpp index 22cbde29f0f2..dcf39aff43cb 100644 --- a/packages/compadre/examples/GMLS_DivergenceFree.cpp +++ b/packages/compadre/examples/GMLS_DivergenceFree.cpp @@ -113,7 +113,7 @@ bool all_passed = true; const double failure_tolerance = 1e-9; // minimum neighbors for unisolvency is the same as the size of the polynomial basis - const int min_neighbors = Compadre::GMLS::getNP(order, dimension); + const int min_neighbors = Compadre::GMLS::getNP(order, dimension, DivergenceFreeVectorTaylorPolynomial); //! [Parse Command Line Arguments] Kokkos::Timer timer; @@ -198,11 +198,9 @@ bool all_passed = true; Kokkos::deep_copy(target_coords_device, target_coords); // need Kokkos View storing true solution - Kokkos::View vector_sampling_data_device("samples of true vector solution", + Kokkos::View vector_sampling_span_basis_data_device("samples of true vector solution", source_coords_device.extent(0), dimension); - Kokkos::View curl_vector_sampling_data_device("samples of curl of true vector solution", - source_coords_device.extent(0), dimension); - Kokkos::View curlcurl_vector_sampling_data_device("samples of curl curl of true vector solution", + Kokkos::View vector_sampling_single_polynomial_data_device("samples of true vector solution", source_coords_device.extent(0), dimension); Kokkos::parallel_for("Sampling Manufactured Solutions", Kokkos::RangePolicy @@ -214,9 +212,8 @@ bool all_passed = true; // data for targets with vector input for (int j=0; j - (vector_sampling_data_device, VectorPointEvaluation, VectorPointSample); + (vector_sampling_span_basis_data_device, VectorPointEvaluation, VectorPointSample); auto output_curl_vector_evaluation = gmls_evaluator_vector.applyAlphasToDataAllComponentsAllTargetSites - (vector_sampling_data_device, CurlOfVectorPointEvaluation, VectorPointSample); + (vector_sampling_span_basis_data_device, CurlOfVectorPointEvaluation, VectorPointSample); auto output_curlcurl_vector_evaluation = gmls_evaluator_vector.applyAlphasToDataAllComponentsAllTargetSites - (vector_sampling_data_device, CurlCurlOfVectorPointEvaluation, VectorPointSample); + (vector_sampling_single_polynomial_data_device, CurlCurlOfVectorPointEvaluation, VectorPointSample); auto output_gradient_vector_evaluation = gmls_evaluator_vector.applyAlphasToDataAllComponentsAllTargetSites - (vector_sampling_data_device, GradientOfVectorPointEvaluation, VectorPointSample); + (vector_sampling_span_basis_data_device, GradientOfVectorPointEvaluation, VectorPointSample); //! [Apply GMLS Alphas To Data] @@ -388,7 +385,7 @@ bool all_passed = true; // load curl of vector components from output double GMLS_Curl_DivFree_VectorX = output_curl_vector_evaluation(i, 0); - double GMLS_Curl_DivFree_VectorY = (dimension>1) ? output_curl_vector_evaluation(i, 1) : 0; + double GMLS_Curl_DivFree_VectorY = (dimension>2) ? output_curl_vector_evaluation(i, 1) : 0; double GMLS_Curl_DivFree_VectorZ = (dimension>2) ? output_curl_vector_evaluation(i, 2) : 0; // load curl curl of vector components from output @@ -415,11 +412,11 @@ bool all_passed = true; // evaluation of vector exact solutions double actual_vector[3] = {0, 0, 0}; if (dimension>=1) { - actual_vector[0] = divfreeTestSolution(xval, yval, zval, 0, dimension); + actual_vector[0] = divfreeTestSolution_span_basis(xval, yval, zval, 0, dimension, order); if (dimension>=2) { - actual_vector[1] = divfreeTestSolution(xval, yval, zval, 1, dimension); + actual_vector[1] = divfreeTestSolution_span_basis(xval, yval, zval, 1, dimension, order); if (dimension==3) { - actual_vector[2] = divfreeTestSolution(xval, yval, zval, 2, dimension); + actual_vector[2] = divfreeTestSolution_span_basis(xval, yval, zval, 2, dimension, order); } } } @@ -427,23 +424,21 @@ bool all_passed = true; // evaluation of curl of vector exact solutions double actual_curl_vector[3] = {0, 0, 0}; if (dimension>=1) { - actual_curl_vector[0] = curldivfreeTestSolution(xval, yval, zval, 0, dimension); - if (dimension>=2) { - actual_curl_vector[1] = curldivfreeTestSolution(xval, yval, zval, 1, dimension); - if (dimension==3) { - actual_curl_vector[2] = curldivfreeTestSolution(xval, yval, zval, 2, dimension); - } + actual_curl_vector[0] = curldivfreeTestSolution_span_basis(xval, yval, zval, 0, dimension, order); + if (dimension==3) { + actual_curl_vector[1] = curldivfreeTestSolution_span_basis(xval, yval, zval, 1, dimension, order); + actual_curl_vector[2] = curldivfreeTestSolution_span_basis(xval, yval, zval, 2, dimension, order); } } // evaluation of curl of curl of vector exact solutions double actual_curlcurl_vector[3] = {0, 0, 0}; if (dimension>=1) { - actual_curlcurl_vector[0] = curlcurldivfreeTestSolution(xval, yval, zval, 0, dimension); + actual_curlcurl_vector[0] = curlcurldivfreeTestSolution_single_polynomial(xval, yval, zval, 0, dimension); if (dimension>=2) { - actual_curlcurl_vector[1] = curlcurldivfreeTestSolution(xval, yval, zval, 1, dimension); + actual_curlcurl_vector[1] = curlcurldivfreeTestSolution_single_polynomial(xval, yval, zval, 1, dimension); if (dimension==3) { - actual_curlcurl_vector[2] = curlcurldivfreeTestSolution(xval, yval, zval, 2, dimension); + actual_curlcurl_vector[2] = curlcurldivfreeTestSolution_single_polynomial(xval, yval, zval, 2, dimension); } } } @@ -451,11 +446,11 @@ bool all_passed = true; double actual_gradient_vector[9] = {0, 0, 0, 0, 0, 0, 0, 0, 0}; if (dimension==3) { for (int axes = 0; axes < 9; ++axes) - actual_gradient_vector[axes] = gradientdivfreeTestSolution(xval, yval, zval, axes, dimension); + actual_gradient_vector[axes] = gradientdivfreeTestSolution_span_basis(xval, yval, zval, axes/dimension, axes%dimension, dimension, order); } if (dimension==2) { for (int axes = 0; axes < 4; ++axes) - actual_gradient_vector[axes] = gradientdivfreeTestSolution(xval, yval, zval, axes, dimension); + actual_gradient_vector[axes] = gradientdivfreeTestSolution_span_basis(xval, yval, zval, axes/dimension, axes%dimension, dimension, order); } // check vector evaluation @@ -477,20 +472,23 @@ bool all_passed = true; } // check curl of vector evaluation - if(std::abs(actual_curl_vector[0] - GMLS_Curl_DivFree_VectorX) > failure_tolerance) { - all_passed = false; - std::cout << i << " Failed curl VectorX by: " << std::abs(actual_curl_vector[0] - GMLS_Curl_DivFree_VectorX) << std::endl; - if (dimension>1) { - if(std::abs(actual_curl_vector[1] - GMLS_Curl_DivFree_VectorY) > failure_tolerance) { - all_passed = false; - std::cout << i << " Failed curl VectorY by: " << std::abs(actual_curl_vector[1] - GMLS_Curl_DivFree_VectorY) << std::endl; - } + if (dimension==2) { + if(std::abs(actual_curl_vector[0] - GMLS_Curl_DivFree_VectorX) > failure_tolerance) { + all_passed = false; + std::cout << i << " Failed curl VectorX by: " << std::abs(actual_curl_vector[2] - GMLS_Curl_DivFree_VectorX) << std::endl; } - if (dimension>2) { - if(std::abs(actual_curl_vector[2] - GMLS_Curl_DivFree_VectorZ) > failure_tolerance) { - all_passed = false; - std::cout << i << " Failed curl VectorZ by: " << std::abs(actual_curl_vector[2] - GMLS_Curl_DivFree_VectorZ) << std::endl; - } + } else if (dimension>2) { + if(std::abs(actual_curl_vector[0] - GMLS_Curl_DivFree_VectorX) > failure_tolerance) { + all_passed = false; + std::cout << i << " Failed curl VectorX by: " << std::abs(actual_curl_vector[0] - GMLS_Curl_DivFree_VectorX) << std::endl; + } + if(std::abs(actual_curl_vector[1] - GMLS_Curl_DivFree_VectorY) > failure_tolerance) { + all_passed = false; + std::cout << i << " Failed curl VectorY by: " << std::abs(actual_curl_vector[1] - GMLS_Curl_DivFree_VectorY) << std::endl; + } + if(std::abs(actual_curl_vector[2] - GMLS_Curl_DivFree_VectorZ) > failure_tolerance) { + all_passed = false; + std::cout << i << " Failed curl VectorZ by: " << std::abs(actual_curl_vector[2] - GMLS_Curl_DivFree_VectorZ) << std::endl; } } @@ -498,17 +496,17 @@ bool all_passed = true; if(std::abs(actual_curlcurl_vector[0] - GMLS_CurlCurl_DivFree_VectorX) > failure_tolerance) { all_passed = false; std::cout << i << " Failed curl curl VectorX by: " << std::abs(actual_curlcurl_vector[0] - GMLS_CurlCurl_DivFree_VectorX) << std::endl; - if (dimension>1) { - if(std::abs(actual_curlcurl_vector[1] - GMLS_CurlCurl_DivFree_VectorY) > failure_tolerance) { - all_passed = false; - std::cout << i << " Failed curl curl VectorY by: " << std::abs(actual_curlcurl_vector[1] - GMLS_CurlCurl_DivFree_VectorY) << std::endl; - } + } + if (dimension>1) { + if(std::abs(actual_curlcurl_vector[1] - GMLS_CurlCurl_DivFree_VectorY) > failure_tolerance) { + all_passed = false; + std::cout << i << " Failed curl curl VectorY by: " << std::abs(actual_curlcurl_vector[1] - GMLS_CurlCurl_DivFree_VectorY) << std::endl; } - if (dimension>2) { - if(std::abs(actual_curlcurl_vector[2] - GMLS_CurlCurl_DivFree_VectorZ) > failure_tolerance) { - all_passed = false; - std::cout << i << " Failed curl curl VectorZ by: " << std::abs(actual_curlcurl_vector[2] - GMLS_CurlCurl_DivFree_VectorZ) << std::endl; - } + } + if (dimension>2) { + if(std::abs(actual_curlcurl_vector[2] - GMLS_CurlCurl_DivFree_VectorZ) > failure_tolerance) { + all_passed = false; + std::cout << i << " Failed curl curl VectorZ by: " << std::abs(actual_curlcurl_vector[2] - GMLS_CurlCurl_DivFree_VectorZ) << std::endl; } } diff --git a/packages/compadre/examples/GMLS_SmallBatchReuse_Device.cpp b/packages/compadre/examples/GMLS_SmallBatchReuse_Device.cpp index 9c0bddf3fba4..8d7705bdf46a 100644 --- a/packages/compadre/examples/GMLS_SmallBatchReuse_Device.cpp +++ b/packages/compadre/examples/GMLS_SmallBatchReuse_Device.cpp @@ -374,7 +374,7 @@ bool all_passed = true; // generate the alphas that to be combined with data for each target operation requested in lro - my_GMLS.generateAlphas(); + my_GMLS.generateAlphas(1, true /* keep polynomial coefficients, only needed for a test later in this program */); //! [Setting Up The GMLS Object] diff --git a/packages/compadre/examples/GMLS_Staggered.cpp b/packages/compadre/examples/GMLS_Staggered.cpp index 51e6a9d07508..9ecb6451e05a 100644 --- a/packages/compadre/examples/GMLS_Staggered.cpp +++ b/packages/compadre/examples/GMLS_Staggered.cpp @@ -113,7 +113,7 @@ bool all_passed = true; const double failure_tolerance = 9e-8; // minimum neighbors for unisolvency is the same as the size of the polynomial basis - const int min_neighbors = Compadre::GMLS::getNP(order, dimension); + const int min_neighbors = Compadre::GMLS::getNP(order+1, dimension); //! [Parse Command Line Arguments] Kokkos::Timer timer; @@ -366,7 +366,7 @@ bool all_passed = true; vector_basis_gmls.setWeightingPower(2); // setup quadrature for StaggeredEdgeIntegralSample - vector_basis_gmls.setOrderOfQuadraturePoints(2); + vector_basis_gmls.setOrderOfQuadraturePoints(order); vector_basis_gmls.setDimensionOfQuadraturePoints(1); vector_basis_gmls.setQuadratureType("LINE"); diff --git a/packages/compadre/examples/GMLS_Tutorial.hpp b/packages/compadre/examples/GMLS_Tutorial.hpp index 7cd0d3cccade..bee612fd9f00 100644 --- a/packages/compadre/examples/GMLS_Tutorial.hpp +++ b/packages/compadre/examples/GMLS_Tutorial.hpp @@ -2,6 +2,8 @@ #define _GMLS_TUTORIAL_HPP_ #include +#include +#include KOKKOS_INLINE_FUNCTION double device_max(double d1, double d2) { @@ -238,7 +240,7 @@ double curlTestSolution(double x, double y, double z, int component, int dimensi } KOKKOS_INLINE_FUNCTION -double divfreeTestSolution(double x, double y, double z, int component, int dimension) { +double divfreeTestSolution_single_polynomial(double x, double y, double z, int component, int dimension) { if (dimension==3) { // returns divfreeTestSamples switch (component) { @@ -257,12 +259,30 @@ double divfreeTestSolution(double x, double y, double z, int component, int dime return -6.0*x*y*y; } } else { - return 0; + return 0.0; } } KOKKOS_INLINE_FUNCTION -double curldivfreeTestSolution(double x, double y, double z, int component, int dimension) { +double divfreeTestSolution_span_basis(double x, double y, double z, int component, int dimension, int exact_order) { + double val = 0.0; + const int NP = Compadre::GMLS::getNP(exact_order, dimension, Compadre::ReconstructionSpace::DivergenceFreeVectorTaylorPolynomial); + if (dimension==3) { + for (int i=0; i) +target_include_directories(compadre PUBLIC $) +target_include_directories(compadre PUBLIC $) diff --git a/packages/compadre/src/CMakeLists.txt b/packages/compadre/src/CMakeLists.txt index fe45018ad5f2..74020d770dfa 100644 --- a/packages/compadre/src/CMakeLists.txt +++ b/packages/compadre/src/CMakeLists.txt @@ -2,40 +2,33 @@ include_tribits_build() bob_config_header("${CMAKE_CURRENT_BINARY_DIR}/Compadre_Config.h") -set(COMPADRE_HEADERS - "${CMAKE_CURRENT_BINARY_DIR}/Compadre_Config.h" - Compadre_Functors.hpp - Compadre_GMLS.hpp - Compadre_GMLS_ApplyTargetEvaluations.hpp - Compadre_GMLS_Basis.hpp - Compadre_GMLS_Targets.hpp - Compadre_KokkosParser.hpp - Compadre_LinearAlgebra_Declarations.hpp - Compadre_LinearAlgebra_Definitions.hpp - Compadre_Misc.hpp - Compadre_Operators.hpp - Compadre_ParallelManager.hpp - Compadre_PointCloudSearch.hpp - Compadre_Quadrature.hpp - Compadre_Typedefs.hpp - Compadre_Utilities.hpp - Compadre_Evaluator.hpp - USER_StandardTargetFunctionals.hpp - USER_ManifoldTargetFunctionals.hpp - basis/DivergenceFree3D.hpp - basis/CreateConstraints.hpp - ) - +MACRO(COMPADRE_APPEND_GLOB VAR) + FILE(GLOB LOCAL_TMP_VAR ${ARGN}) + LIST(APPEND ${VAR} ${LOCAL_TMP_VAR}) +ENDMACRO() -set(COMPADRE_SOURCES - Compadre_GMLS.cpp - Compadre_KokkosParser.cpp - Compadre_LinearAlgebra.cpp +set(COMPADRE_HEADERS "") +set(COMPADRE_SOURCES "") +set(COMPADRE_HEADERS ${COMPADRE_HEADERS} + ${CMAKE_CURRENT_BINARY_DIR}/Compadre_Config.h ) +compadre_append_glob(COMPADRE_HEADERS ${CMAKE_CURRENT_SOURCE_DIR}/*.hpp) +list(REMOVE_ITEM COMPADRE_HEADERS + ${CMAKE_CURRENT_SOURCE_DIR}/Compadre_Manifold_Functions.hpp + ) +compadre_append_glob(COMPADRE_HEADERS ${CMAKE_CURRENT_SOURCE_DIR}/basis/*.hpp) +compadre_append_glob(COMPADRE_HEADERS ${CMAKE_CURRENT_SOURCE_DIR}/constraints/*.hpp) +compadre_append_glob(COMPADRE_HEADERS ${CMAKE_CURRENT_SOURCE_DIR}/tpl/*.hpp) +compadre_append_glob(COMPADRE_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/*.cpp) add_library(compadre ${COMPADRE_SOURCES}) bob_library_includes(compadre) +# allows us to use flat directory includes when building, since that will be the file structure once installed +target_include_directories(compadre PUBLIC $) +target_include_directories(compadre PUBLIC $) +target_include_directories(compadre PUBLIC $) + # openmp if needed if (Compadre_USE_OPENMP) find_package(OpenMP QUIET) diff --git a/packages/compadre/src/Compadre_Evaluator.hpp b/packages/compadre/src/Compadre_Evaluator.hpp index 697ed4596d59..80dd096a3e9d 100644 --- a/packages/compadre/src/Compadre_Evaluator.hpp +++ b/packages/compadre/src/Compadre_Evaluator.hpp @@ -37,11 +37,12 @@ struct SubviewND { compadre_assert_debug(((size_t)((column_num+1)*block_size-1)<_data_in.extent(1)) && "Subview asked for column > second dimension of input data."); } - if ((size_t)((column_num+1)*block_size-1)<_data_in.extent(1)) + if ((size_t)((column_num+1)*block_size-1)<_data_in.extent(1)) { return Kokkos::subview(_data_in, Kokkos::ALL, Kokkos::make_pair(column_num*block_size, (column_num+1)*block_size)); - else + } else { compadre_assert_debug(((size_t)(block_size-1)<_data_in.extent(1)) && "Subview asked for column > second dimension of input data."); return Kokkos::subview(_data_in, Kokkos::ALL, Kokkos::make_pair(0,block_size)); + } } T2 copyToAndReturnOriginalView() { @@ -94,11 +95,11 @@ struct SubviewND > //! Handles either 2D or 1D views as input, and they can be on the host or the device. template auto CreateNDSliceOnDeviceView(T sampling_input_data_host_or_device, bool scalar_as_vector_if_needed) -> SubviewND { + device_memory_space(), sampling_input_data_host_or_device)), T> { // makes view on the device (does nothing if already on the device) auto sampling_input_data_device = Kokkos::create_mirror_view( - device_execution_space::memory_space(), sampling_input_data_host_or_device); + device_memory_space(), sampling_input_data_host_or_device); Kokkos::deep_copy(sampling_input_data_device, sampling_input_data_host_or_device); Kokkos::fence(); @@ -183,7 +184,7 @@ class Evaluator { //! components in order to fill a vector target or matrix target. //! //! Assumptions on input data: - //! \param output_data_single_column [out] - 1D Kokkos View (memory space must be device_execution_space::memory_space()) + //! \param output_data_single_column [out] - 1D Kokkos View (memory space must be device_memory_space()) //! \param sampling_data_single_column [in] - 1D Kokkos View (memory space must match output_data_single_column) //! \param lro [in] - Target operation from the TargetOperation enum //! \param sro [in] - Sampling functional from the SamplingFunctional enum @@ -295,7 +296,7 @@ class Evaluator { //! components in order to transform a vector target. //! //! Assumptions on input data: - //! \param output_data_single_column [out] - 1D Kokkos View (memory space must be device_execution_space::memory_space()) + //! \param output_data_single_column [out] - 1D Kokkos View (memory space must be device_memory_space()) //! \param sampling_data_single_column [in] - 1D Kokkos View (memory space must match output_data_single_column) //! \param local_dim_index [in] - For manifold problems, this is the local coordinate direction that sampling data may need to be transformed to before the application of GMLS //! \param global_dim_index [in] - For manifold problems, this is the global coordinate direction that sampling data can be represented in @@ -487,7 +488,7 @@ class Evaluator { //! components in order to fill a vector target or matrix target. //! //! Assumptions on input data: - //! \param output_data_block_column [out] - 2D Kokkos View (memory space must be device_execution_space::memory_space()) + //! \param output_data_block_column [out] - 2D Kokkos View (memory space must be device_memory_space()) //! \param sampling_data_single_column [in] - 1D Kokkos View (memory space must match output_data_single_column) //! \param sro [in] - Sampling functional from the SamplingFunctional enum //! \param target_index [in] - Target # user wants to reconstruct target functional at, corresponds to row number of neighbor_lists diff --git a/packages/compadre/src/Compadre_GMLS.cpp b/packages/compadre/src/Compadre_GMLS.cpp index eb4321f41c0e..2d47c65653fa 100644 --- a/packages/compadre/src/Compadre_GMLS.cpp +++ b/packages/compadre/src/Compadre_GMLS.cpp @@ -4,11 +4,14 @@ #include "Compadre_Quadrature.hpp" #include "Compadre_GMLS_Targets.hpp" #include "Compadre_Functors.hpp" -#include "basis/CreateConstraints.hpp" +#include "Compadre_CreateConstraints.hpp" namespace Compadre { -void GMLS::generatePolynomialCoefficients(const int number_of_batches) { +void GMLS::generatePolynomialCoefficients(const int number_of_batches, const bool keep_coefficients) { + + compadre_assert_release( (keep_coefficients==false || number_of_batches==1) + && "keep_coefficients is set to true, but number of batches exceeds 1."); /* * Generate Quadrature @@ -131,6 +134,7 @@ void GMLS::generatePolynomialCoefficients(const int number_of_batches) { _NP = this->getNP(_poly_order, _dimensions-1, _reconstruction_space); const int max_manifold_NP = (manifold_NP > _NP) ? manifold_NP : _NP; this_num_cols = _basis_multiplier*max_manifold_NP; + const int max_poly_order = (_poly_order > _curvature_poly_order) ? _poly_order : _curvature_poly_order; const int max_P_row_size = ((_dimensions-1)*manifold_NP > max_manifold_NP*_total_alpha_values*_basis_multiplier) ? (_dimensions-1)*manifold_NP : max_manifold_NP*_total_alpha_values*_basis_multiplier*max_evaluation_sites; /* @@ -146,6 +150,7 @@ void GMLS::generatePolynomialCoefficients(const int number_of_batches) { team_scratch_size_b += scratch_vector_type::shmem_size(max_P_row_size); // row of P matrix, one for each operator thread_scratch_size_b += scratch_vector_type::shmem_size(max_manifold_NP*_basis_multiplier); // delta, used for each thread + thread_scratch_size_b += scratch_vector_type::shmem_size((max_poly_order+1)*_global_dimensions); // temporary space for powers in basis if (_data_sampling_functional == VaryingManifoldVectorPointSample) { thread_scratch_size_b += scratch_vector_type::shmem_size(_dimensions*_dimensions); // temporary tangent calculations, used for each thread } @@ -171,6 +176,7 @@ void GMLS::generatePolynomialCoefficients(const int number_of_batches) { team_scratch_size_b += scratch_vector_type::shmem_size(this_num_cols*_total_alpha_values*max_evaluation_sites); thread_scratch_size_b += scratch_vector_type::shmem_size(this_num_cols); // delta, used for each thread + thread_scratch_size_b += scratch_vector_type::shmem_size((_poly_order+1)*_global_dimensions); // temporary space for powers in basis } #ifdef COMPADRE_USE_CUDA if (_basis_multiplier*_NP > 96) _pm.setThreadsPerTeam(_pm.getThreadsPerTeam() + 128); @@ -385,7 +391,8 @@ void GMLS::generatePolynomialCoefficients(const int number_of_batches) { } Kokkos::fence(); - _initial_index_for_batch += max_batch_size; + _initial_index_for_batch += this_batch_size; + if ((size_t)_initial_index_for_batch == _target_coordinates.extent(0)) break; } // end of batch loops // deallocate _P and _w @@ -393,16 +400,21 @@ void GMLS::generatePolynomialCoefficients(const int number_of_batches) { if (number_of_batches > 1) { // no reason to keep coefficients if they aren't all in memory _RHS = Kokkos::View("RHS",0); _P = Kokkos::View("P",0); + _entire_batch_computed_at_once = false; } else { if (_constraint_type != ConstraintType::NO_CONSTRAINT) { _RHS = Kokkos::View("RHS", 0); + if (!keep_coefficients) _P = Kokkos::View("P", 0); } else { if (_dense_solver_type != DenseSolverType::LU) { _P = Kokkos::View("P", 0); + if (!keep_coefficients) _RHS = Kokkos::View("RHS", 0); } else { _RHS = Kokkos::View("RHS", 0); + if (!keep_coefficients) _P = Kokkos::View("P", 0); } } + if (keep_coefficients) _store_PTWP_inv_PTW = true; } /* @@ -421,9 +433,9 @@ void GMLS::generatePolynomialCoefficients(const int number_of_batches) { } -void GMLS::generateAlphas(const int number_of_batches) { +void GMLS::generateAlphas(const int number_of_batches, const bool keep_coefficients) { - this->generatePolynomialCoefficients(number_of_batches); + this->generatePolynomialCoefficients(number_of_batches, keep_coefficients); } @@ -459,13 +471,14 @@ void GMLS::operator()(const AssembleStandardPsqrtW&, const member_type& teamMemb // delta, used for each thread scratch_vector_type delta(teamMember.thread_scratch(_pm.getThreadScratchLevel(1)), this_num_cols); + scratch_vector_type thread_workspace(teamMember.thread_scratch(_pm.getThreadScratchLevel(1)), (_poly_order+1)*_global_dimensions); /* * Assemble P*sqrt(W) and sqrt(w)*Identity */ // creates the matrix sqrt(W)*P - this->createWeightsAndP(teamMember, delta, PsqrtW, w, _dimensions, _poly_order, true /*weight_p*/, NULL /*&V*/, _reconstruction_space, _polynomial_sampling_functional); + this->createWeightsAndP(teamMember, delta, thread_workspace, PsqrtW, w, _dimensions, _poly_order, true /*weight_p*/, NULL /*&V*/, _reconstruction_space, _polynomial_sampling_functional); if ((_constraint_type == ConstraintType::NO_CONSTRAINT) && (_dense_solver_type != DenseSolverType::LU)) { // if (_dense_solver_type != DenseSolverType::LU) { @@ -545,12 +558,15 @@ void GMLS::operator()(const ApplyStandardTargets&, const member_type& teamMember scratch_vector_type t2(teamMember.team_scratch(_pm.getTeamScratchLevel(0)), max_num_rows); scratch_matrix_right_type P_target_row(teamMember.team_scratch(_pm.getTeamScratchLevel(1)), _total_alpha_values*max_evaluation_sites, this_num_cols); + scratch_vector_type delta(teamMember.thread_scratch(_pm.getThreadScratchLevel(1)), this_num_cols); + scratch_vector_type thread_workspace(teamMember.thread_scratch(_pm.getThreadScratchLevel(1)), (_poly_order+1)*_global_dimensions); + /* * Apply Standard Target Evaluations to Polynomial Coefficients */ // get evaluation of target functionals - this->computeTargetFunctionals(teamMember, t1, t2, P_target_row); + this->computeTargetFunctionals(teamMember, delta, thread_workspace, P_target_row); teamMember.team_barrier(); this->applyTargetsToCoefficients(teamMember, t1, t2, Coeffs, w, P_target_row, _NP); @@ -572,6 +588,7 @@ void GMLS::operator()(const ComputeCoarseTangentPlane&, const member_type& teamM const int manifold_NP = this->getNP(_curvature_poly_order, _dimensions-1, ReconstructionSpace::ScalarTaylorPolynomial); const int max_manifold_NP = (manifold_NP > _NP) ? manifold_NP : _NP; const int this_num_cols = _basis_multiplier*max_manifold_NP; + const int max_poly_order = (_poly_order > _curvature_poly_order) ? _poly_order : _curvature_poly_order; int P_dim_0, P_dim_1; getPDims(_dense_solver_type, _constraint_type, _reconstruction_space, _dimensions, max_num_rows, this_num_cols, P_dim_0, P_dim_1); @@ -591,13 +608,14 @@ void GMLS::operator()(const ComputeCoarseTangentPlane&, const member_type& teamM // delta, used for each thread scratch_vector_type delta(teamMember.thread_scratch(_pm.getThreadScratchLevel(1)), max_manifold_NP*_basis_multiplier); + scratch_vector_type thread_workspace(teamMember.thread_scratch(_pm.getThreadScratchLevel(1)), (max_poly_order+1)*_global_dimensions); /* * Determine Coarse Approximation of Manifold Tangent Plane */ // getting x y and z from which to derive a manifold - this->createWeightsAndPForCurvature(teamMember, delta, PsqrtW, w, _dimensions, true /* only specific order */); + this->createWeightsAndPForCurvature(teamMember, delta, thread_workspace, PsqrtW, w, _dimensions, true /* only specific order */); // create PsqrtW^T*PsqrtW GMLS_LinearAlgebra::createM(teamMember, PTP, PsqrtW, _dimensions /* # of columns */, this->getNNeighbors(target_index)); @@ -625,6 +643,7 @@ void GMLS::operator()(const AssembleCurvaturePsqrtW&, const member_type& teamMem const int max_manifold_NP = (manifold_NP > _NP) ? manifold_NP : _NP; const int this_num_neighbors = this->getNNeighbors(target_index); const int this_num_cols = _basis_multiplier*max_manifold_NP; + const int max_poly_order = (_poly_order > _curvature_poly_order) ? _poly_order : _curvature_poly_order; int RHS_square_dim = getRHSSquareDim(_dense_solver_type, _constraint_type, _reconstruction_space, _dimensions, max_num_rows, this_num_cols); int P_dim_0, P_dim_1; @@ -645,6 +664,7 @@ void GMLS::operator()(const AssembleCurvaturePsqrtW&, const member_type& teamMem // delta, used for each thread scratch_vector_type delta(teamMember.thread_scratch(_pm.getThreadScratchLevel(1)), max_manifold_NP*_basis_multiplier); + scratch_vector_type thread_workspace(teamMember.thread_scratch(_pm.getThreadScratchLevel(1)), (max_poly_order+1)*_global_dimensions); // @@ -652,7 +672,7 @@ void GMLS::operator()(const AssembleCurvaturePsqrtW&, const member_type& teamMem // // creates the matrix sqrt(W)*P - this->createWeightsAndPForCurvature(teamMember, delta, CurvaturePsqrtW, w, _dimensions-1, false /* only specific order */, &T); + this->createWeightsAndPForCurvature(teamMember, delta, thread_workspace, CurvaturePsqrtW, w, _dimensions-1, false /* only specific order */, &T); teamMember.team_barrier(); // CurvaturePsqrtW is sized according to max_num_rows x this_num_cols of which in this case @@ -697,6 +717,7 @@ void GMLS::operator()(const GetAccurateTangentDirections&, const member_type& te const int manifold_NP = this->getNP(_curvature_poly_order, _dimensions-1, ReconstructionSpace::ScalarTaylorPolynomial); const int max_manifold_NP = (manifold_NP > _NP) ? manifold_NP : _NP; const int this_num_cols = _basis_multiplier*max_manifold_NP; + const int max_poly_order = (_poly_order > _curvature_poly_order) ? _poly_order : _curvature_poly_order; const int max_evaluation_sites = (static_cast(_additional_evaluation_indices.extent(1)) > 1) ? static_cast(_additional_evaluation_indices.extent(1)) : 1; @@ -721,11 +742,12 @@ void GMLS::operator()(const GetAccurateTangentDirections&, const member_type& te scratch_matrix_right_type T(_T.data() + TO_GLOBAL(target_index)*TO_GLOBAL(_dimensions)*TO_GLOBAL(_dimensions), _dimensions, _dimensions); - scratch_vector_type t1(teamMember.team_scratch(_pm.getTeamScratchLevel(1)), _max_num_neighbors*((_sampling_multiplier>_basis_multiplier) ? _sampling_multiplier : _basis_multiplier)); - scratch_vector_type t2(teamMember.team_scratch(_pm.getTeamScratchLevel(1)), _max_num_neighbors*((_sampling_multiplier>_basis_multiplier) ? _sampling_multiplier : _basis_multiplier)); scratch_vector_type manifold_gradient(teamMember.team_scratch(_pm.getTeamScratchLevel(1)), (_dimensions-1)*_max_num_neighbors); scratch_matrix_right_type P_target_row(teamMember.team_scratch(_pm.getTeamScratchLevel(1)), _total_alpha_values*max_evaluation_sites, max_manifold_NP*_basis_multiplier); + // delta, used for each thread + scratch_vector_type delta(teamMember.thread_scratch(_pm.getThreadScratchLevel(1)), max_manifold_NP*_basis_multiplier); + scratch_vector_type thread_workspace(teamMember.thread_scratch(_pm.getThreadScratchLevel(1)), (max_poly_order+1)*_global_dimensions); /* * Manifold @@ -736,7 +758,7 @@ void GMLS::operator()(const GetAccurateTangentDirections&, const member_type& te // GET TARGET COEFFICIENTS RELATED TO GRADIENT TERMS // // reconstruct grad_xi1 and grad_xi2, not used for manifold_coeffs - this->computeCurvatureFunctionals(teamMember, t1, t2, P_target_row, &T); + this->computeCurvatureFunctionals(teamMember, delta, thread_workspace, P_target_row, &T); teamMember.team_barrier(); double grad_xi1 = 0, grad_xi2 = 0; @@ -895,6 +917,7 @@ void GMLS::operator()(const ApplyCurvatureTargets&, const member_type& teamMembe const int manifold_NP = this->getNP(_curvature_poly_order, _dimensions-1, ReconstructionSpace::ScalarTaylorPolynomial); const int max_manifold_NP = (manifold_NP > _NP) ? manifold_NP : _NP; const int this_num_cols = _basis_multiplier*max_manifold_NP; + const int max_poly_order = (_poly_order > _curvature_poly_order) ? _poly_order : _curvature_poly_order; const int max_evaluation_sites = (static_cast(_additional_evaluation_indices.extent(1)) > 1) ? static_cast(_additional_evaluation_indices.extent(1)) : 1; @@ -925,11 +948,13 @@ void GMLS::operator()(const ApplyCurvatureTargets&, const member_type& teamMembe scratch_vector_type manifold_gradient_coeffs(_manifold_curvature_gradient.data() + target_index*(_dimensions-1), (_dimensions-1)); scratch_matrix_right_type G(teamMember.team_scratch(_pm.getTeamScratchLevel(1)), _dimensions-1, _dimensions-1); - scratch_vector_type t1(teamMember.team_scratch(_pm.getTeamScratchLevel(1)), _max_num_neighbors*((_sampling_multiplier>_basis_multiplier) ? _sampling_multiplier : _basis_multiplier)); - scratch_vector_type t2(teamMember.team_scratch(_pm.getTeamScratchLevel(1)), _max_num_neighbors*((_sampling_multiplier>_basis_multiplier) ? _sampling_multiplier : _basis_multiplier)); scratch_vector_type manifold_gradient(teamMember.team_scratch(_pm.getTeamScratchLevel(1)), (_dimensions-1)*_max_num_neighbors); scratch_matrix_right_type P_target_row(teamMember.team_scratch(_pm.getTeamScratchLevel(1)), _total_alpha_values*max_evaluation_sites, max_manifold_NP*_basis_multiplier); + // delta, used for each thread + scratch_vector_type delta(teamMember.thread_scratch(_pm.getThreadScratchLevel(1)), max_manifold_NP*_basis_multiplier); + scratch_vector_type thread_workspace(teamMember.thread_scratch(_pm.getThreadScratchLevel(1)), (max_poly_order+1)*_global_dimensions); + /* * Manifold */ @@ -939,7 +964,7 @@ void GMLS::operator()(const ApplyCurvatureTargets&, const member_type& teamMembe // GET TARGET COEFFICIENTS RELATED TO GRADIENT TERMS // // reconstruct grad_xi1 and grad_xi2, not used for manifold_coeffs - this->computeCurvatureFunctionals(teamMember, t1, t2, P_target_row, &T); + this->computeCurvatureFunctionals(teamMember, delta, thread_workspace, P_target_row, &T); teamMember.team_barrier(); Kokkos::single(Kokkos::PerTeam(teamMember), [&] () { @@ -1039,6 +1064,7 @@ void GMLS::operator()(const AssembleManifoldPsqrtW&, const member_type& teamMemb const int max_manifold_NP = (manifold_NP > _NP) ? manifold_NP : _NP; const int this_num_rows = _sampling_multiplier*this->getNNeighbors(target_index); const int this_num_cols = _basis_multiplier*max_manifold_NP; + const int max_poly_order = (_poly_order > _curvature_poly_order) ? _poly_order : _curvature_poly_order; int RHS_square_dim = getRHSSquareDim(_dense_solver_type, _constraint_type, _reconstruction_space, _dimensions, max_num_rows, this_num_cols); int P_dim_0, P_dim_1; @@ -1059,13 +1085,14 @@ void GMLS::operator()(const AssembleManifoldPsqrtW&, const member_type& teamMemb // delta, used for each thread scratch_vector_type delta(teamMember.thread_scratch(_pm.getThreadScratchLevel(1)), max_manifold_NP*_basis_multiplier); + scratch_vector_type thread_workspace(teamMember.thread_scratch(_pm.getThreadScratchLevel(1)), (max_poly_order+1)*_global_dimensions); /* * Manifold */ - this->createWeightsAndP(teamMember, delta, PsqrtW, w, _dimensions-1, _poly_order, true /* weight with W*/, &T, _reconstruction_space, _polynomial_sampling_functional); + this->createWeightsAndP(teamMember, delta, thread_workspace, PsqrtW, w, _dimensions-1, _poly_order, true /* weight with W*/, &T, _reconstruction_space, _polynomial_sampling_functional); teamMember.team_barrier(); if (_dense_solver_type != DenseSolverType::LU) { @@ -1107,6 +1134,7 @@ void GMLS::operator()(const ApplyManifoldTargets&, const member_type& teamMember const int manifold_NP = this->getNP(_curvature_poly_order, _dimensions-1, ReconstructionSpace::ScalarTaylorPolynomial); const int max_manifold_NP = (manifold_NP > _NP) ? manifold_NP : _NP; const int this_num_cols = _basis_multiplier*max_manifold_NP; + const int max_poly_order = (_poly_order > _curvature_poly_order) ? _poly_order : _curvature_poly_order; const int max_evaluation_sites = (static_cast(_additional_evaluation_indices.extent(1)) > 1) ? static_cast(_additional_evaluation_indices.extent(1)) : 1; @@ -1140,11 +1168,15 @@ void GMLS::operator()(const ApplyManifoldTargets&, const member_type& teamMember scratch_vector_type t2(teamMember.team_scratch(_pm.getTeamScratchLevel(1)), _max_num_neighbors*((_sampling_multiplier>_basis_multiplier) ? _sampling_multiplier : _basis_multiplier)); scratch_matrix_right_type P_target_row(teamMember.team_scratch(_pm.getTeamScratchLevel(1)), _total_alpha_values*max_evaluation_sites, max_manifold_NP*_basis_multiplier); + // delta, used for each thread + scratch_vector_type delta(teamMember.thread_scratch(_pm.getThreadScratchLevel(1)), max_manifold_NP*_basis_multiplier); + scratch_vector_type thread_workspace(teamMember.thread_scratch(_pm.getThreadScratchLevel(1)), (max_poly_order+1)*_global_dimensions); + /* * Apply Standard Target Evaluations to Polynomial Coefficients */ - this->computeTargetFunctionalsOnManifold(teamMember, t1, t2, P_target_row, T, G_inv, manifold_coeffs, manifold_gradient_coeffs); + this->computeTargetFunctionalsOnManifold(teamMember, delta, thread_workspace, P_target_row, T, G_inv, manifold_coeffs, manifold_gradient_coeffs); teamMember.team_barrier(); this->applyTargetsToCoefficients(teamMember, t1, t2, Coeffs, w, P_target_row, _NP); @@ -1167,6 +1199,7 @@ void GMLS::operator()(const ComputePrestencilWeights&, const member_type& teamMe const int manifold_NP = this->getNP(_curvature_poly_order, _dimensions-1, ReconstructionSpace::ScalarTaylorPolynomial); const int max_manifold_NP = (manifold_NP > _NP) ? manifold_NP : _NP; const int this_num_cols = _basis_multiplier*max_manifold_NP; + const int max_poly_order = (_poly_order > _curvature_poly_order) ? _poly_order : _curvature_poly_order; const int max_evaluation_sites = (static_cast(_additional_evaluation_indices.extent(1)) > 1) ? static_cast(_additional_evaluation_indices.extent(1)) : 1; @@ -1246,11 +1279,12 @@ void GMLS::operator()(const ComputePrestencilWeights&, const member_type& teamMe } else if (_data_sampling_functional == VaryingManifoldVectorPointSample) { scratch_vector_type delta(teamMember.thread_scratch(_pm.getThreadScratchLevel(1)), manifold_NP); + scratch_vector_type thread_workspace(teamMember.thread_scratch(_pm.getThreadScratchLevel(1)), (max_poly_order+1)*_global_dimensions); Kokkos::parallel_for(Kokkos::TeamThreadRange(teamMember,this->getNNeighbors(target_index)), [&] (const int m) { Kokkos::single(Kokkos::PerThread(teamMember), [&] () { - this->calcGradientPij(teamMember, delta.data(), target_index, m, 0 /*alpha*/, 0 /*partial_direction*/, _dimensions-1, _curvature_poly_order, false /*specific order only*/, &T, ReconstructionSpace::ScalarTaylorPolynomial, PointSample); + this->calcGradientPij(teamMember, delta.data(), thread_workspace.data(), target_index, m, 0 /*alpha*/, 0 /*partial_direction*/, _dimensions-1, _curvature_poly_order, false /*specific order only*/, &T, ReconstructionSpace::ScalarTaylorPolynomial, PointSample); }); // reconstructs gradient at local neighbor index m double grad_xi1 = 0, grad_xi2 = 0; @@ -1268,7 +1302,7 @@ void GMLS::operator()(const ComputePrestencilWeights&, const member_type& teamMe t1(m) = grad_xi1; Kokkos::single(Kokkos::PerThread(teamMember), [&] () { - this->calcGradientPij(teamMember, delta.data(), target_index, m, 0 /*alpha*/, 1 /*partial_direction*/, _dimensions-1, _curvature_poly_order, false /*specific order only*/, &T, ReconstructionSpace::ScalarTaylorPolynomial, PointSample); + this->calcGradientPij(teamMember, delta.data(), thread_workspace.data(), target_index, m, 0 /*alpha*/, 1 /*partial_direction*/, _dimensions-1, _curvature_poly_order, false /*specific order only*/, &T, ReconstructionSpace::ScalarTaylorPolynomial, PointSample); }); Kokkos::parallel_reduce(Kokkos::ThreadVectorRange(teamMember,this->getNNeighbors(target_index)), [=] (const int i, double &t_grad_xi2) { double alpha_ij = 0; diff --git a/packages/compadre/src/Compadre_GMLS.hpp b/packages/compadre/src/Compadre_GMLS.hpp index d0dd171844ae..e1da83d467ba 100644 --- a/packages/compadre/src/Compadre_GMLS.hpp +++ b/packages/compadre/src/Compadre_GMLS.hpp @@ -9,6 +9,8 @@ #include "Compadre_LinearAlgebra_Definitions.hpp" #include "Compadre_ParallelManager.hpp" #include "Compadre_Quadrature.hpp" +#include "Compadre_ScalarTaylorPolynomial.hpp" +#include "Compadre_DivergenceFreePolynomial.hpp" namespace Compadre { @@ -211,6 +213,9 @@ class GMLS { //! this is false, and so the _RHS matrix can not be stored or requested bool _entire_batch_computed_at_once; + //! whether polynomial coefficients were requested to be stored (in a state not yet applied to data) + bool _store_PTWP_inv_PTW; + //! initial index for current batch int _initial_index_for_batch; @@ -279,7 +284,8 @@ class GMLS { ///@{ /*! \brief Evaluates the polynomial basis under a particular sampling function. Generally used to fill a row of P. - \param delta [in/out] - scratch space that is allocated so that each thread has its own copy. Must be at least as large is the _basis_multipler*the dimension of the polynomial basis. + \param delta [in/out] - scratch space that is allocated so that each thread has its own copy. Must be at least as large as the _basis_multipler*the dimension of the polynomial basis. + \param thread_workspace [in/out] - scratch space that is allocated so that each thread has its own copy. Must be at least as large as the _poly_order*the spatial dimension of the polynomial basis. \param target_index [in] - target number \param neighbor_index [in] - index of neighbor for this target with respect to local numbering [0,...,number of neighbors for target] \param alpha [in] - double to determine convex combination of target and neighbor site at which to evaluate polynomials. (1-alpha)*neighbor + alpha*target @@ -292,10 +298,11 @@ class GMLS { \param additional_evaluation_local_index [in] - local index for evaluation sites */ KOKKOS_INLINE_FUNCTION - void calcPij(const member_type& teamMember, double* delta, const int target_index, int neighbor_index, const double alpha, const int dimension, const int poly_order, bool specific_order_only = false, const scratch_matrix_right_type* V = NULL, const ReconstructionSpace reconstruction_space = ReconstructionSpace::ScalarTaylorPolynomial, const SamplingFunctional sampling_strategy = PointSample, const int additional_evaluation_local_index = 0) const; + void calcPij(const member_type& teamMember, double* delta, double* thread_workspace, const int target_index, int neighbor_index, const double alpha, const int dimension, const int poly_order, bool specific_order_only = false, const scratch_matrix_right_type* V = NULL, const ReconstructionSpace reconstruction_space = ReconstructionSpace::ScalarTaylorPolynomial, const SamplingFunctional sampling_strategy = PointSample, const int additional_evaluation_local_index = 0) const; /*! \brief Evaluates the gradient of a polynomial basis under the Dirac Delta (pointwise) sampling function. \param delta [in/out] - scratch space that is allocated so that each thread has its own copy. Must be at least as large is the _basis_multipler*the dimension of the polynomial basis. + \param thread_workspace [in/out] - scratch space that is allocated so that each thread has its own copy. Must be at least as large as the _poly_order*the spatial dimension of the polynomial basis. \param target_index [in] - target number \param neighbor_index [in] - index of neighbor for this target with respect to local numbering [0,...,number of neighbors for target] \param alpha [in] - double to determine convex combination of target and neighbor site at which to evaluate polynomials. (1-alpha)*neighbor + alpha*target @@ -309,11 +316,31 @@ class GMLS { \param additional_evaluation_local_index [in] - local index for evaluation sites */ KOKKOS_INLINE_FUNCTION - void calcGradientPij(const member_type& teamMember, double* delta, const int target_index, const int neighbor_index, const double alpha, const int partial_direction, const int dimension, const int poly_order, bool specific_order_only, const scratch_matrix_right_type* V, const ReconstructionSpace reconstruction_space, const SamplingFunctional sampling_strategy, const int additional_evaluation_local_index = 0) const; + void calcGradientPij(const member_type& teamMember, double* delta, double* thread_workspace, const int target_index, int neighbor_index, const double alpha, const int partial_direction, const int dimension, const int poly_order, bool specific_order_only, const scratch_matrix_right_type* V, const ReconstructionSpace reconstruction_space, const SamplingFunctional sampling_strategy, const int additional_evaluation_local_index = 0) const; + + /*! \brief Evaluates the Hessian of a polynomial basis under the Dirac Delta (pointwise) sampling function. + \param delta [in/out] - scratch space that is allocated so that each thread has its own copy. Must be at least as large is the _basis_multipler*the dimension of the polynomial basis. + \param thread_workspace [in/out] - scratch space that is allocated so that each thread has its own copy. Must be at least as large as the _poly_order*the spatial dimension of the polynomial basis. + \param target_index [in] - target number + \param neighbor_index [in] - index of neighbor for this target with respect to local numbering [0,...,number of neighbors for target] + \param alpha [in] - double to determine convex combination of target and neighbor site at which to evaluate polynomials. (1-alpha)*neighbor + alpha*target + \param partial_direction_1 [in] - first direction that partial is taken with respect to, e.g. 0 is x direction, 1 is y direction + \param partial_direction_2 [in] - second direction that partial is taken with respect to, e.g. 0 is x direction, 1 is y direction + \param dimension [in] - spatial dimension of basis to evaluate. e.g. dimension two basis of order one is 1, x, y, whereas for dimension 3 it is 1, x, y, z + \param poly_order [in] - polynomial basis degree + \param specific_order_only [in] - boolean for only evaluating one degree of polynomial when true + \param V [in] - orthonormal basis matrix size _dimensions * _dimensions whose first _dimensions-1 columns are an approximation of the tangent plane + \param reconstruction_space [in] - space of polynomial that a sampling functional is to evaluate + \param sampling_strategy [in] - sampling functional specification + \param additional_evaluation_local_index [in] - local index for evaluation sites + */ + KOKKOS_INLINE_FUNCTION + void calcHessianPij(const member_type& teamMember, double* delta, double* thread_workspace, const int target_index, int neighbor_index, const double alpha, const int partial_direction_1, const int partial_direction_2, const int dimension, const int poly_order, bool specific_order_only, const scratch_matrix_right_type* V, const ReconstructionSpace reconstruction_space, const SamplingFunctional sampling_strategy, const int additional_evaluation_local_index = 0) const; /*! \brief Fills the _P matrix with either P or P*sqrt(w) \param teamMember [in] - Kokkos::TeamPolicy member type (created by parallel_for) \param delta [in/out] - scratch space that is allocated so that each thread has its own copy. Must be at least as large is the _basis_multipler*the dimension of the polynomial basis. + \param thread_workspace [in/out] - scratch space that is allocated so that each thread has its own copy. Must be at least as large as the _poly_order*the spatial dimension of the polynomial basis. \param P [out] - 2D Kokkos View which will contain evaluation of sampling functional on polynomial basis for each neighbor the target has (stored column major) \param w [out] - 1D Kokkos View which will contain weighting kernel values for the target with each neighbor if weight_p = true \param dimension [in] - spatial dimension of basis to evaluate. e.g. dimension two basis of order one is 1, x, y, whereas for dimension 3 it is 1, x, y, z @@ -324,7 +351,7 @@ class GMLS { \param sampling_strategy [in] - sampling functional specification */ KOKKOS_INLINE_FUNCTION - void createWeightsAndP(const member_type& teamMember, scratch_vector_type delta, scratch_matrix_right_type P, scratch_vector_type w, const int dimension, int polynomial_order, bool weight_p = false, scratch_matrix_right_type* V = NULL, const ReconstructionSpace reconstruction_space = ReconstructionSpace::ScalarTaylorPolynomial, const SamplingFunctional sampling_strategy = PointSample) const; + void createWeightsAndP(const member_type& teamMember, scratch_vector_type delta, scratch_vector_type thread_workspace, scratch_matrix_right_type P, scratch_vector_type w, const int dimension, int polynomial_order, bool weight_p = false, scratch_matrix_right_type* V = NULL, const ReconstructionSpace reconstruction_space = ReconstructionSpace::ScalarTaylorPolynomial, const SamplingFunctional sampling_strategy = PointSample) const; /*! \brief Fills the _P matrix with P*sqrt(w) for use in solving for curvature @@ -332,6 +359,7 @@ class GMLS { \param teamMember [in] - Kokkos::TeamPolicy member type (created by parallel_for) \param delta [in/out] - scratch space that is allocated so that each thread has its own copy. Must be at least as large is the _basis_multipler*the dimension of the polynomial basis. + \param thread_workspace [in/out] - scratch space that is allocated so that each thread has its own copy. Must be at least as large as the _poly_order*the spatial dimension of the polynomial basis. \param P [out] - 2D Kokkos View which will contain evaluation of sampling functional on polynomial basis for each neighbor the target has (stored column major) \param w [out] - 1D Kokkos View which will contain weighting kernel values for the target with each neighbor if weight_p = true \param dimension [in] - spatial dimension of basis to evaluate. e.g. dimension two basis of order one is 1, x, y, whereas for dimension 3 it is 1, x, y, z @@ -339,12 +367,12 @@ class GMLS { \param V [in] - orthonormal basis matrix size _dimensions * _dimensions whose first _dimensions-1 columns are an approximation of the tangent plane */ KOKKOS_INLINE_FUNCTION - void createWeightsAndPForCurvature(const member_type& teamMember, scratch_vector_type delta, scratch_matrix_right_type P, scratch_vector_type w, const int dimension, bool only_specific_order, scratch_matrix_right_type* V = NULL) const; + void createWeightsAndPForCurvature(const member_type& teamMember, scratch_vector_type delta, scratch_vector_type thread_workspace, scratch_matrix_right_type P, scratch_vector_type w, const int dimension, bool only_specific_order, scratch_matrix_right_type* V = NULL) const; /*! \brief Evaluates a polynomial basis with a target functional applied to each member of the basis \param teamMember [in] - Kokkos::TeamPolicy member type (created by parallel_for) - \param t1 [in/out] - scratch space that is allocated so that each team has its own copy. Must be at least as large is the _basis_multipler*the dimension of the polynomial basis. - \param t2 [in/out] - scratch space that is allocated so that each team has its own copy. Must be at least as large is the _basis_multipler*the dimension of the polynomial basis. + \param delta [in/out] - scratch space that is allocated so that each thread has its own copy. Must be at least as large is the _basis_multipler*the dimension of the polynomial basis. + \param thread_workspace [in/out] - scratch space that is allocated so that each team has its own copy. Must be at least as large is the _poly_order*_global_dimensions. \param P_target_row [out] - 1D Kokkos View where the evaluation of the polynomial basis is stored */ KOKKOS_INLINE_FUNCTION @@ -355,8 +383,8 @@ class GMLS { _operations is used by this function which is set through a modifier function \param teamMember [in] - Kokkos::TeamPolicy member type (created by parallel_for) - \param t1 [in/out] - scratch space that is allocated so that each team has its own copy. Must be at least as large is the _basis_multipler*the dimension of the polynomial basis. - \param t2 [in/out] - scratch space that is allocated so that each team has its own copy. Must be at least as large is the _basis_multipler*the dimension of the polynomial basis. + \param delta [in/out] - scratch space that is allocated so that each thread has its own copy. Must be at least as large is the _basis_multipler*the dimension of the polynomial basis. + \param thread_workspace [in/out] - scratch space that is allocated so that each thread has its own copy. Must be at least as large as the _curvature_poly_order*the spatial dimension of the polynomial basis. \param P_target_row [out] - 1D Kokkos View where the evaluation of the polynomial basis is stored \param V [in] - orthonormal basis matrix size _dimensions * _dimensions whose first _dimensions-1 columns are an approximation of the tangent plane */ @@ -368,8 +396,8 @@ class GMLS { _operations is used by this function which is set through a modifier function \param teamMember [in] - Kokkos::TeamPolicy member type (created by parallel_for) - \param t1 [in/out] - scratch space that is allocated so that each team has its own copy. Must be at least as large is the _basis_multipler*the dimension of the polynomial basis. - \param t2 [in/out] - scratch space that is allocated so that each team has its own copy. Must be at least as large is the _basis_multipler*the dimension of the polynomial basis. + \param delta [in/out] - scratch space that is allocated so that each thread has its own copy. Must be at least as large is the _basis_multipler*the dimension of the polynomial basis. + \param thread_workspace [in/out] - scratch space that is allocated so that each thread has its own copy. Must be at least as large as the _curvature_poly_order*the spatial dimension of the polynomial basis. \param P_target_row [out] - 1D Kokkos View where the evaluation of the polynomial basis is stored \param V [in] - orthonormal basis matrix size _dimensions * _dimensions whose first _dimensions-1 columns are an approximation of the tangent plane \param G_inv [in] - (_dimensions-1)*(_dimensions-1) Kokkos View containing inverse of metric tensor @@ -645,6 +673,7 @@ class GMLS { _reference_outward_normal_direction_provided = false; _use_reference_outward_normal_direction_provided_to_orient_surface = false; _entire_batch_computed_at_once = true; + _store_PTWP_inv_PTW = false; _initial_index_for_batch = 0; @@ -781,43 +810,9 @@ class GMLS { KOKKOS_INLINE_FUNCTION static int getNP(const int m, const int dimension = 3, const ReconstructionSpace r_space = ReconstructionSpace::ScalarTaylorPolynomial) { if (r_space != ReconstructionSpace::DivergenceFreeVectorTaylorPolynomial) { - if (dimension == 3) return (m+1)*(m+2)*(m+3)/6; - else if (dimension == 2) return (m+1)*(m+2)/2; - else return m+1; + return ScalarTaylorPolynomialBasis::getSize(m, dimension); } else { - if (dimension == 3) - switch (m) { - case 0: - return 3; - case 1: - return 11; - case 2: - return 26; - case 3: - return 50; - case 4: - return 85; - default: - compadre_kernel_assert_release((false) && "Divergence-free basis only supports up to 4th-order polynomials."); - return 0; // avoids warning about no return - } - if (dimension == 2) - switch (m) { - case 0: - return 2; - case 1: - return 5; - case 2: - return 9; - case 3: - return 14; - case 4: - return 20; - default: - compadre_kernel_assert_release((false) && "Divergence-free basis only supports up to 4th-order polynomials."); - return 0; // avoids warning about no return - } - else return -1; + return DivergenceFreePolynomialBasis::getSize(m, dimension); } } @@ -925,6 +920,8 @@ class GMLS { auto M_by_N = this->getPolynomialCoefficientsDomainRangeSize(); compadre_assert_release(_entire_batch_computed_at_once && "Entire batch not computed at once, so getFullPolynomialCoefficientsBasis() can not be called."); + compadre_assert_release(_store_PTWP_inv_PTW + && "generateAlphas() called with keep_coefficients set to false."); host_managed_local_index_type sizes("sizes", 2); if ((_constraint_type == ConstraintType::NO_CONSTRAINT) && (_dense_solver_type != DenseSolverType::LU)) { int rhsdim = getRHSSquareDim(_dense_solver_type, _constraint_type, _reconstruction_space, _dimensions, M_by_N[1], M_by_N[0]); @@ -1063,6 +1060,8 @@ class GMLS { decltype(_RHS) getFullPolynomialCoefficientsBasis() const { compadre_assert_release(_entire_batch_computed_at_once && "Entire batch not computed at once, so getFullPolynomialCoefficientsBasis() can not be called."); + compadre_assert_release(_store_PTWP_inv_PTW + && "generateAlphas() called with keep_coefficients set to false."); if ((_constraint_type == ConstraintType::NO_CONSTRAINT) && (_dense_solver_type != DenseSolverType::LU)) { return _RHS; } else { @@ -1275,7 +1274,7 @@ class GMLS { _host_neighbor_lists = Kokkos::create_mirror_view(_neighbor_lists); typedef typename view_type::memory_space input_array_memory_space; - if (std::is_same::value) { + if (std::is_same::value) { // check if on the device, then copy directly // if it is, then it doesn't match the internal layout we use // then copy to the host mirror @@ -1331,7 +1330,7 @@ class GMLS { source_coordinates.extent(0), source_coordinates.extent(1)); typedef typename view_type::memory_space input_array_memory_space; - if (std::is_same::value) { + if (std::is_same::value) { // check if on the device, then copy directly // if it is, then it doesn't match the internal layout we use // then copy to the host mirror @@ -1366,7 +1365,7 @@ class GMLS { target_coordinates.extent(0), target_coordinates.extent(1)); typedef typename view_type::memory_space input_array_memory_space; - if (std::is_same::value) { + if (std::is_same::value) { // check if on the device, then copy directly // if it is, then it doesn't match the internal layout we use // then copy to the host mirror @@ -1538,7 +1537,7 @@ class GMLS { evaluation_coordinates.extent(0), evaluation_coordinates.extent(1)); typedef typename view_type::memory_space input_array_memory_space; - if (std::is_same::value) { + if (std::is_same::value) { // check if on the device, then copy directly // if it is, then it doesn't match the internal layout we use // then copy to the host mirror @@ -1578,7 +1577,7 @@ class GMLS { _host_additional_evaluation_indices = Kokkos::create_mirror_view(_additional_evaluation_indices); typedef typename view_type::memory_space input_array_memory_space; - if (std::is_same::value) { + if (std::is_same::value) { // check if on the device, then copy directly // if it is, then it doesn't match the internal layout we use // then copy to the host mirror @@ -1806,15 +1805,17 @@ class GMLS { //! that can later be contracted against data or degrees of freedom to form a //! global linear system. //! \param number_of_batches [in] - how many batches to break up the total workload into (for storage) + //! \param keep_coefficients [in] - whether to store (P^T W P)^-1 * P^T * W */ - void generatePolynomialCoefficients(const int number_of_batches = 1); + void generatePolynomialCoefficients(const int number_of_batches = 1, const bool keep_coefficients = false); /*! \brief Meant to calculate target operations and apply the evaluations to the previously //! constructed polynomial coefficients. But now that is inside of generatePolynomialCoefficients because //! it must be to handle number_of_batches>1. Effectively, this just calls generatePolynomialCoefficients. //! \param number_of_batches [in] - how many batches to break up the total workload into (for storage) + //! \param keep_coefficients [in] - whether to store (P^T W P)^-1 * P^T * W */ - void generateAlphas(const int number_of_batches = 1); + void generateAlphas(const int number_of_batches = 1, const bool keep_coefficients = false); ///@} diff --git a/packages/compadre/src/Compadre_GMLS_Basis.hpp b/packages/compadre/src/Compadre_GMLS_Basis.hpp index b374e3aa20d3..50376c83c061 100644 --- a/packages/compadre/src/Compadre_GMLS_Basis.hpp +++ b/packages/compadre/src/Compadre_GMLS_Basis.hpp @@ -2,12 +2,11 @@ #define _COMPADRE_GMLS_BASIS_HPP_ #include "Compadre_GMLS.hpp" -#include "basis/DivergenceFree3D.hpp" namespace Compadre { KOKKOS_INLINE_FUNCTION -void GMLS::calcPij(const member_type& teamMember, double* delta, const int target_index, int neighbor_index, const double alpha, const int dimension, const int poly_order, bool specific_order_only, const scratch_matrix_right_type* V, const ReconstructionSpace reconstruction_space, const SamplingFunctional polynomial_sampling_functional, const int additional_evaluation_local_index) const { +void GMLS::calcPij(const member_type& teamMember, double* delta, double* thread_workspace, const int target_index, int neighbor_index, const double alpha, const int dimension, const int poly_order, bool specific_order_only, const scratch_matrix_right_type* V, const ReconstructionSpace reconstruction_space, const SamplingFunctional polynomial_sampling_functional, const int additional_evaluation_local_index) const { /* * This class is under two levels of hierarchical parallelism, so we * do not put in any finer grain parallelism in this function @@ -55,39 +54,9 @@ void GMLS::calcPij(const member_type& teamMember, double* delta, const int targe (reconstruction_space == ScalarTaylorPolynomial || reconstruction_space == VectorOfScalarClonesTaylorPolynomial)) { double cutoff_p = _epsilons(target_index); - int alphax, alphay, alphaz; - double alphaf; - int i = 0; const int start_index = specific_order_only ? poly_order : 0; // only compute specified order if requested - for (int n = start_index; n <= poly_order; n++){ - if (dimension == 3) { - for (alphaz = 0; alphaz <= n; alphaz++){ - - int s = n - alphaz; - for (alphay = 0; alphay <= s; alphay++){ - alphax = s - alphay; - alphaf = factorial[alphax]*factorial[alphay]*factorial[alphaz]; - *(delta+i) = std::pow(relative_coord.x/cutoff_p,alphax) - *std::pow(relative_coord.y/cutoff_p,alphay) - *std::pow(relative_coord.z/cutoff_p,alphaz)/alphaf; - i++; - } - } - } else if (dimension == 2) { - for (alphay = 0; alphay <= n; alphay++){ - alphax = n - alphay; - alphaf = factorial[alphax]*factorial[alphay]; - *(delta+i) = std::pow(relative_coord.x/cutoff_p,alphax) - *std::pow(relative_coord.y/cutoff_p,alphay)/alphaf; - i++; - } - } else { // dimension == 1 - alphax = n; - alphaf = factorial[alphax]; - *(delta+i) = std::pow(relative_coord.x/cutoff_p,alphax)/alphaf; - i++; - } - } + + ScalarTaylorPolynomialBasis::evaluate(teamMember, delta, thread_workspace, dimension, poly_order, cutoff_p, relative_coord.x, relative_coord.y, relative_coord.z, start_index); // basis ActualReconstructionSpaceRank is 1 (is a true vector basis) and sampling functional is traditional } else if ((polynomial_sampling_functional == VectorPointSample || @@ -97,42 +66,11 @@ void GMLS::calcPij(const member_type& teamMember, double* delta, const int targe const int dimension_offset = this->getNP(_poly_order, dimension, reconstruction_space); double cutoff_p = _epsilons(target_index); - int alphax, alphay, alphaz; - double alphaf; - int i = 0; + const int start_index = specific_order_only ? poly_order : 0; // only compute specified order if requested for (int d=0; dgetNP(_poly_order, _global_dimensions, reconstruction_space); double cutoff_p = _epsilons(target_index); - double xs = relative_coord.x/cutoff_p; - double ys = relative_coord.y/cutoff_p; - double zs = relative_coord.z/cutoff_p; - XYZ Pn; - - if (dimension == 3) { - for (int n = 0; n < dimension_offset; n++) { - // Obtain the vector for the basis - Pn = calDivFreeBasis(n, xs, ys, zs); - // Then assign it to the input - *(delta + n) = Pn[component]; - } - } - if (dimension == 2) { - for (int n = 0; n < dimension_offset; n++) { - // Obtain the vector for the basis - Pn = calDivFreeBasis(n, xs, ys); - // Then assign it to the input - *(delta + n) = Pn[component]; - } - } + DivergenceFreePolynomialBasis::evaluate(teamMember, delta, thread_workspace, dimension, poly_order, component, cutoff_p, relative_coord.x, relative_coord.y, relative_coord.z); + } else if ((polynomial_sampling_functional == StaggeredEdgeAnalyticGradientIntegralSample) && (reconstruction_space == ScalarTaylorPolynomial)) { + double cutoff_p = _epsilons(target_index); + const int start_index = specific_order_only ? poly_order : 0; // only compute specified order if requested // basis is actually scalar with staggered sampling functional - { - double cutoff_p = _epsilons(target_index); - int alphax, alphay, alphaz; - double alphaf; - int i = 0; - const int start_index = specific_order_only ? poly_order : 0; // only compute specified order if requested - for (int n = start_index; n <= poly_order; n++){ - if (dimension == 3) { - for (alphaz = 0; alphaz <= n; alphaz++){ - - int s = n - alphaz; - for (alphay = 0; alphay <= s; alphay++){ - alphax = s - alphay; - alphaf = factorial[alphax]*factorial[alphay]*factorial[alphaz]; - *(delta+i) = -std::pow(relative_coord.x/cutoff_p,alphax) - *std::pow(relative_coord.y/cutoff_p,alphay) - *std::pow(relative_coord.z/cutoff_p,alphaz)/alphaf; - i++; - } - } - } else if (dimension == 2) { - for (alphay = 0; alphay <= n; alphay++){ - alphax = n - alphay; - alphaf = factorial[alphax]*factorial[alphay]; - *(delta+i) = -std::pow(relative_coord.x/cutoff_p,alphax) - *std::pow(relative_coord.y/cutoff_p,alphay)/alphaf; - i++; + ScalarTaylorPolynomialBasis::evaluate(teamMember, delta, thread_workspace, dimension, poly_order, cutoff_p, relative_coord.x, relative_coord.y, relative_coord.z, start_index, 0.0, -1.0); + relative_coord.x = 0; + relative_coord.y = 0; + relative_coord.z = 0; + ScalarTaylorPolynomialBasis::evaluate(teamMember, delta, thread_workspace, dimension, poly_order, cutoff_p, relative_coord.x, relative_coord.y, relative_coord.z, start_index, 1.0, 1.0); + } else if (polynomial_sampling_functional == StaggeredEdgeIntegralSample) { + Kokkos::single(Kokkos::PerThread(teamMember), [&] () { + if (_problem_type == ProblemType::MANIFOLD) { + double cutoff_p = _epsilons(target_index); + int alphax, alphay; + double alphaf; + const int start_index = specific_order_only ? poly_order : 0; // only compute specified order if requested + + for (int quadrature = 0; quadrature<_qm.getNumberOfQuadraturePoints(); ++quadrature) { + + int i = 0; + + XYZ tangent_quadrature_coord_2d; + XYZ quadrature_coord_2d; + for (int j=0; jgetNNeighbors(target_index); + + int component = 0; + if (neighbor_index >= my_num_neighbors) { + component = neighbor_index / my_num_neighbors; + neighbor_index = neighbor_index % my_num_neighbors; + } else if (neighbor_index < 0) { + // -1 maps to 0 component + // -2 maps to 1 component + // -3 maps to 2 component + component = -(neighbor_index+1); + } // alpha corresponds to the linear combination of target_index and neighbor_index coordinates // coordinate to evaluate = alpha*(target_index's coordinate) + (1-alpha)*(neighbor_index's coordinate) @@ -643,6 +505,7 @@ void GMLS::calcGradientPij(const member_type& teamMember, double* delta, const i } double cutoff_p = _epsilons(target_index); + const int start_index = specific_order_only ? poly_order : 0; // only compute specified order if requested if ((polynomial_sampling_functional == PointSample || polynomial_sampling_functional == VectorPointSample || @@ -650,66 +513,75 @@ void GMLS::calcGradientPij(const member_type& teamMember, double* delta, const i polynomial_sampling_functional == VaryingManifoldVectorPointSample) && (reconstruction_space == ScalarTaylorPolynomial || reconstruction_space == VectorOfScalarClonesTaylorPolynomial)) { - int alphax, alphay, alphaz; - double alphaf; - int i = 0; - const int start_index = specific_order_only ? poly_order : 0; // only compute specified order if requested + ScalarTaylorPolynomialBasis::evaluatePartialDerivative(teamMember, delta, thread_workspace, dimension, poly_order, partial_direction, cutoff_p, relative_coord.x, relative_coord.y, relative_coord.z, start_index); + + } else if ((polynomial_sampling_functional == VectorPointSample) && + (reconstruction_space == DivergenceFreeVectorTaylorPolynomial)) { + // Divergence free vector polynomial basis + double cutoff_p = _epsilons(target_index); + + DivergenceFreePolynomialBasis::evaluatePartialDerivative(teamMember, delta, thread_workspace, dimension, poly_order, component, partial_direction, cutoff_p, relative_coord.x, relative_coord.y, relative_coord.z); - for (int n = start_index; n <= poly_order; n++){ - if (dimension == 3) { - for (alphaz = 0; alphaz <= n; alphaz++){ + } else { + compadre_kernel_assert_release((false) && "Sampling and basis space combination not defined."); + } +} - int s = n - alphaz; - for (alphay = 0; alphay <= s; alphay++){ - alphax = s - alphay; +KOKKOS_INLINE_FUNCTION +void GMLS::calcHessianPij(const member_type& teamMember, double* delta, double* thread_workspace, const int target_index, int neighbor_index, const double alpha, const int partial_direction_1, const int partial_direction_2, const int dimension, const int poly_order, bool specific_order_only, const scratch_matrix_right_type* V, const ReconstructionSpace reconstruction_space, const SamplingFunctional polynomial_sampling_functional, const int additional_evaluation_index) const { +/* + * This class is under two levels of hierarchical parallelism, so we + * do not put in any finer grain parallelism in this function + */ - int x_pow = (partial_direction == 0) ? alphax-1 : alphax; - int y_pow = (partial_direction == 1) ? alphay-1 : alphay; - int z_pow = (partial_direction == 2) ? alphaz-1 : alphaz; + const int my_num_neighbors = this->getNNeighbors(target_index); - if (x_pow<0 || y_pow<0 || z_pow<0) { - *(delta+i) = 0; - } else { - alphaf = factorial[x_pow]*factorial[y_pow]*factorial[z_pow]; - *(delta+i) = 1./cutoff_p - *std::pow(relative_coord.x/cutoff_p,x_pow) - *std::pow(relative_coord.y/cutoff_p,y_pow) - *std::pow(relative_coord.z/cutoff_p,z_pow)/alphaf; - } - i++; - } - } - } else if (dimension == 2) { - for (alphay = 0; alphay <= n; alphay++){ - alphax = n - alphay; - - int x_pow = (partial_direction == 0) ? alphax-1 : alphax; - int y_pow = (partial_direction == 1) ? alphay-1 : alphay; - - if (x_pow<0 || y_pow<0) { - *(delta+i) = 0; - } else { - alphaf = factorial[x_pow]*factorial[y_pow]; - *(delta+i) = 1./cutoff_p - *std::pow(relative_coord.x/cutoff_p,x_pow) - *std::pow(relative_coord.y/cutoff_p,y_pow)/alphaf; - } - i++; - } - } else { // dimension == 1 - alphax = n; - - int x_pow = (partial_direction == 0) ? alphax-1 : alphax; - if (x_pow<0) { - *(delta+i) = 0; - } else { - alphaf = factorial[x_pow]; - *(delta+i) = 1./cutoff_p - *std::pow(relative_coord.x/cutoff_p,x_pow)/alphaf; - } - i++; - } + int component = 0; + if (neighbor_index >= my_num_neighbors) { + component = neighbor_index / my_num_neighbors; + neighbor_index = neighbor_index % my_num_neighbors; + } else if (neighbor_index < 0) { + // -1 maps to 0 component + // -2 maps to 1 component + // -3 maps to 2 component + component = -(neighbor_index+1); + } + + // alpha corresponds to the linear combination of target_index and neighbor_index coordinates + // coordinate to evaluate = alpha*(target_index's coordinate) + (1-alpha)*(neighbor_index's coordinate) + + // partial_direction - 0=x, 1=y, 2=z + XYZ relative_coord; + if (neighbor_index > -1) { + for (int i=0; i 0) { + for (int i=0; iWab(r, _epsilons(target_index), _weighting_type, _weighting_power); - this->calcPij(teamMember, delta.data(), target_index, i + d*my_num_neighbors, 0 /*alpha*/, dimension, polynomial_order, false /*bool on only specific order*/, V, reconstruction_space, polynomial_sampling_functional); + this->calcPij(teamMember, delta.data(), thread_workspace.data(), target_index, i + d*my_num_neighbors, 0 /*alpha*/, dimension, polynomial_order, false /*bool on only specific order*/, V, reconstruction_space, polynomial_sampling_functional); // storage_size needs to change based on the size of the basis int storage_size = this->getNP(polynomial_order, dimension, reconstruction_space); @@ -792,7 +664,7 @@ void GMLS::createWeightsAndP(const member_type& teamMember, scratch_vector_type } KOKKOS_INLINE_FUNCTION -void GMLS::createWeightsAndPForCurvature(const member_type& teamMember, scratch_vector_type delta, scratch_matrix_right_type P, scratch_vector_type w, const int dimension, bool only_specific_order, scratch_matrix_right_type* V) const { +void GMLS::createWeightsAndPForCurvature(const member_type& teamMember, scratch_vector_type delta, scratch_vector_type thread_workspace, scratch_matrix_right_type P, scratch_vector_type w, const int dimension, bool only_specific_order, scratch_matrix_right_type* V) const { /* * This function has two purposes * 1.) Used to calculate specifically for 1st order polynomials, from which we can reconstruct a tangent plane @@ -818,10 +690,10 @@ void GMLS::createWeightsAndPForCurvature(const member_type& teamMember, scratch_ // generate weight vector from distances and window sizes if (only_specific_order) { w(i) = this->Wab(r, _epsilons(target_index), _curvature_weighting_type, _curvature_weighting_power); - this->calcPij(teamMember, delta.data(), target_index, i, 0 /*alpha*/, dimension, 1, true /*bool on only specific order*/); + this->calcPij(teamMember, delta.data(), thread_workspace.data(), target_index, i, 0 /*alpha*/, dimension, 1, true /*bool on only specific order*/); } else { w(i) = this->Wab(r, _epsilons(target_index), _curvature_weighting_type, _curvature_weighting_power); - this->calcPij(teamMember, delta.data(), target_index, i, 0 /*alpha*/, dimension, _curvature_poly_order, false /*bool on only specific order*/, V); + this->calcPij(teamMember, delta.data(), thread_workspace.data(), target_index, i, 0 /*alpha*/, dimension, _curvature_poly_order, false /*bool on only specific order*/, V); } int storage_size = only_specific_order ? this->getNP(1, dimension)-this->getNP(0, dimension) : this->getNP(_curvature_poly_order, dimension); diff --git a/packages/compadre/src/Compadre_GMLS_Targets.hpp b/packages/compadre/src/Compadre_GMLS_Targets.hpp index 575fb1365d84..e354d12247bb 100644 --- a/packages/compadre/src/Compadre_GMLS_Targets.hpp +++ b/packages/compadre/src/Compadre_GMLS_Targets.hpp @@ -3,12 +3,11 @@ #include "Compadre_GMLS.hpp" #include "Compadre_Manifold_Functions.hpp" -#include "basis/DivergenceFree3D.hpp" namespace Compadre { KOKKOS_INLINE_FUNCTION -void GMLS::computeTargetFunctionals(const member_type& teamMember, scratch_vector_type t1, scratch_vector_type t2, scratch_matrix_right_type P_target_row) const { +void GMLS::computeTargetFunctionals(const member_type& teamMember, scratch_vector_type delta, scratch_vector_type thread_workspace, scratch_matrix_right_type P_target_row) const { // check if VectorOfScalarClonesTaylorPolynomial is used with a scalar sampling functional other than PointSample if (_dimensions > 1) { @@ -32,6 +31,8 @@ void GMLS::computeTargetFunctionals(const member_type& teamMember, scratch_vecto P_target_row(j,k) = 0; }); }); + Kokkos::parallel_for(Kokkos::TeamThreadRange(teamMember, delta.extent(0)), [&] (const int j) { delta(j) = 0; }); + Kokkos::parallel_for(Kokkos::TeamThreadRange(teamMember, thread_workspace.extent(0)), [&] (const int j) { thread_workspace(j) = 0; }); teamMember.team_barrier(); const int target_NP = this->getNP(_poly_order, _dimensions, _reconstruction_space); @@ -46,7 +47,7 @@ void GMLS::computeTargetFunctionals(const member_type& teamMember, scratch_vecto // USER defined targets should be added to this file // if the USER defined targets don't catch this operation, then operation_handled will be false - #include "USER_StandardTargetFunctionals.hpp" + #include "Compadre_USER_StandardTargetFunctionals.hpp" // if the user didn't handle the operation, we pass it along to the toolkit's targets if (!operation_handled) { @@ -58,18 +59,16 @@ void GMLS::computeTargetFunctionals(const member_type& teamMember, scratch_vecto */ if (_operations(i) == TargetOperation::ScalarPointEvaluation || (_operations(i) == TargetOperation::VectorPointEvaluation && _dimensions == 1) /* vector is a scalar in 1D */) { - Kokkos::single(Kokkos::PerTeam(teamMember), [&] () { - for (int j=0; jcalcPij(teamMember, t1.data(), target_index, -1 /* target is neighbor */, 1 /*alpha*/, _dimensions, _poly_order, false /*bool on only specific order*/, NULL /*&V*/, ReconstructionSpace::ScalarTaylorPolynomial, PointSample, j); - int offset = getTargetOffsetIndexDevice(i, 0, 0, j); - for (int k=0; kcalcPij(teamMember, delta.data(), thread_workspace.data(), target_index, -1 /* target is neighbor */, 1 /*alpha*/, _dimensions, _poly_order, false /*bool on only specific order*/, NULL /*&V*/, ReconstructionSpace::ScalarTaylorPolynomial, PointSample, j); + int offset = getTargetOffsetIndexDevice(i, 0, 0, j); + for (int k=0; kcalcGradientPij(teamMember, row.data(), target_index, -1 /* target is neighbor */, 1 /*alpha*/, d /*partial_direction*/, _dimensions, _poly_order, false /*specific order only*/, NULL /*&V*/, ReconstructionSpace::ScalarTaylorPolynomial, PointSample, j); - } + Kokkos::parallel_for(Kokkos::TeamThreadRange(teamMember, num_evaluation_sites), [=] (const int j) { + for (int d=0; d<_dimensions; ++d) { + int offset = getTargetOffsetIndexDevice(i, 0, d, j); + auto row = Kokkos::subview(P_target_row, offset, Kokkos::ALL()); + this->calcGradientPij(teamMember, row.data(), thread_workspace.data(), target_index, -1 /* target is neighbor */, 1 /*alpha*/, d /*partial_direction*/, _dimensions, _poly_order, false /*specific order only*/, NULL /*&V*/, ReconstructionSpace::ScalarTaylorPolynomial, PointSample, j); } }); additional_evaluation_sites_handled = true; // additional non-target site evaluations handled } else if (_operations(i) == TargetOperation::PartialXOfScalarPointEvaluation) { - Kokkos::single(Kokkos::PerTeam(teamMember), [&] () { - for (int j=0; jcalcGradientPij(teamMember, row.data(), target_index, -1 /* target is neighbor */, 1 /*alpha*/, 0 /*partial_direction*/, _dimensions, _poly_order, false /*specific order only*/, NULL /*&V*/, ReconstructionSpace::ScalarTaylorPolynomial, PointSample, j); - } + Kokkos::parallel_for(Kokkos::TeamThreadRange(teamMember, num_evaluation_sites), [=] (const int j) { + int offset = getTargetOffsetIndexDevice(i, 0, 0, j); + auto row = Kokkos::subview(P_target_row, offset, Kokkos::ALL()); + this->calcGradientPij(teamMember, row.data(), thread_workspace.data(), target_index, -1 /* target is neighbor */, 1 /*alpha*/, 0 /*partial_direction*/, _dimensions, _poly_order, false /*specific order only*/, NULL /*&V*/, ReconstructionSpace::ScalarTaylorPolynomial, PointSample, j); }); additional_evaluation_sites_handled = true; // additional non-target site evaluations handled } else if (_operations(i) == TargetOperation::PartialYOfScalarPointEvaluation) { compadre_kernel_assert_release(_dimensions>1 && "PartialYOfScalarPointEvaluation requested for dim < 2"); - Kokkos::single(Kokkos::PerTeam(teamMember), [&] () { - for (int j=0; jcalcGradientPij(teamMember, row.data(), target_index, -1 /* target is neighbor */, 1 /*alpha*/, 1 /*partial_direction*/, _dimensions, _poly_order, false /*specific order only*/, NULL /*&V*/, ReconstructionSpace::ScalarTaylorPolynomial, PointSample, j); - } + Kokkos::parallel_for(Kokkos::TeamThreadRange(teamMember, num_evaluation_sites), [=] (const int j) { + int offset = getTargetOffsetIndexDevice(i, 0, 0, j); + auto row = Kokkos::subview(P_target_row, offset, Kokkos::ALL()); + this->calcGradientPij(teamMember, row.data(), thread_workspace.data(), target_index, -1 /* target is neighbor */, 1 /*alpha*/, 1 /*partial_direction*/, _dimensions, _poly_order, false /*specific order only*/, NULL /*&V*/, ReconstructionSpace::ScalarTaylorPolynomial, PointSample, j); }); additional_evaluation_sites_handled = true; // additional non-target site evaluations handled } else if (_operations(i) == TargetOperation::PartialZOfScalarPointEvaluation) { compadre_kernel_assert_release(_dimensions>2 && "PartialZOfScalarPointEvaluation requested for dim < 3"); - Kokkos::single(Kokkos::PerTeam(teamMember), [&] () { - for (int j=0; jcalcGradientPij(teamMember, row.data(), target_index, -1 /* target is neighbor */, 1 /*alpha*/, 2 /*partial_direction*/, _dimensions, _poly_order, false /*specific order only*/, NULL /*&V*/, ReconstructionSpace::ScalarTaylorPolynomial, PointSample, j); - } + Kokkos::parallel_for(Kokkos::TeamThreadRange(teamMember, num_evaluation_sites), [=] (const int j) { + int offset = getTargetOffsetIndexDevice(i, 0, 0, j); + auto row = Kokkos::subview(P_target_row, offset, Kokkos::ALL()); + this->calcGradientPij(teamMember, row.data(), thread_workspace.data(), target_index, -1 /* target is neighbor */, 1 /*alpha*/, 2 /*partial_direction*/, _dimensions, _poly_order, false /*specific order only*/, NULL /*&V*/, ReconstructionSpace::ScalarTaylorPolynomial, PointSample, j); }); additional_evaluation_sites_handled = true; // additional non-target site evaluations handled } @@ -158,7 +149,7 @@ void GMLS::computeTargetFunctionals(const member_type& teamMember, scratch_vecto double triangle_coords[9]; scratch_matrix_right_type triangle_coords_matrix(triangle_coords, 3, 3); - scratch_vector_type midpoint(t1.data(), 3); + scratch_vector_type midpoint(delta.data(), 3); getMidpointFromCellVertices(teamMember, midpoint, _target_extra_data, target_index, 3 /*dim*/); for (int j=0; j<3; ++j) { @@ -239,30 +230,26 @@ void GMLS::computeTargetFunctionals(const member_type& teamMember, scratch_vecto if (_operations(i) == TargetOperation::ScalarPointEvaluation || (_operations(i) == TargetOperation::VectorPointEvaluation && _dimensions == 1) /* vector is a scalar in 1D */) { // copied from ScalarTaylorPolynomial - Kokkos::single(Kokkos::PerTeam(teamMember), [&] () { - for (int j=0; jcalcPij(teamMember, t1.data(), target_index, -1 /* target is neighbor */, 1 /*alpha*/, _dimensions, _poly_order, false /*bool on only specific order*/, NULL /*&V*/, ReconstructionSpace::ScalarTaylorPolynomial, PointSample, j); - int offset = getTargetOffsetIndexDevice(i, 0, 0, j); - for (int k=0; kcalcPij(teamMember, delta.data(), thread_workspace.data(), target_index, -1 /* target is neighbor */, 1 /*alpha*/, _dimensions, _poly_order, false /*bool on only specific order*/, NULL /*&V*/, ReconstructionSpace::ScalarTaylorPolynomial, PointSample, j); + int offset = getTargetOffsetIndexDevice(i, 0, 0, j); + for (int k=0; kcalcPij(teamMember, t1.data(), target_index, -1 /* target is neighbor */, 1 /*alpha*/, _dimensions, _poly_order, false /*bool on only specific order*/, NULL /*&V*/, ReconstructionSpace::ScalarTaylorPolynomial, PointSample, e); - for (int m=0; m<_sampling_multiplier; ++m) { - int output_components = _basis_multiplier; - for (int c=0; c 1, - // this approach relies on c*target_NP being equivalent to P_target_row(offset, j) where offset is - // getTargetOffsetIndexDevice(i, m /*in*/, c /*out*/, e/*additional*/)*_basis_multiplier*target_NP; - for (int j=0; jcalcPij(teamMember, delta.data(), thread_workspace.data(), target_index, -1 /* target is neighbor */, 1 /*alpha*/, _dimensions, _poly_order, false /*bool on only specific order*/, NULL /*&V*/, ReconstructionSpace::ScalarTaylorPolynomial, PointSample, e); + for (int m=0; m<_sampling_multiplier; ++m) { + int output_components = _basis_multiplier; + for (int c=0; c 1, + // this approach relies on c*target_NP being equivalent to P_target_row(offset, j) where offset is + // getTargetOffsetIndexDevice(i, m /*in*/, c /*out*/, e/*additional*/)*_basis_multiplier*target_NP; + for (int j=0; jcalcPij(teamMember, t1.data(), target_index, -1 /* target is neighbor */, 1 /*alpha*/, _dimensions, _poly_order, false /*bool on only specific order*/, NULL /*&V*/, ReconstructionSpace::ScalarTaylorPolynomial, PointSample, e); - for (int m=0; m<_sampling_multiplier; ++m) { - int output_components = _basis_multiplier; - for (int c=0; c 1, - // this approach relies on c*target_NP being equivalent to P_target_row(offset, j) where offset is - // getTargetOffsetIndexDevice(i, m /*in*/, c /*out*/, e/*additional*/)*_basis_multiplier*target_NP; - for (int j=0; jcalcPij(teamMember, delta.data(), thread_workspace.data(), target_index, -1 /* target is neighbor */, 1 /*alpha*/, _dimensions, _poly_order, false /*bool on only specific order*/, NULL /*&V*/, ReconstructionSpace::ScalarTaylorPolynomial, PointSample, e); + for (int m=0; m<_sampling_multiplier; ++m) { + int output_components = _basis_multiplier; + for (int c=0; c 1, + // this approach relies on c*target_NP being equivalent to P_target_row(offset, j) where offset is + // getTargetOffsetIndexDevice(i, m /*in*/, c /*out*/, e/*additional*/)*_basis_multiplier*target_NP; + for (int j=0; jcalcGradientPij(teamMember, t1.data(), target_index, -1 /* target is neighbor */, 1 /*alpha*/, m2 /*partial_direction*/, _dimensions, _poly_order, false /*specific order only*/, NULL /*&V*/, ReconstructionSpace::ScalarTaylorPolynomial, PointSample, e); - for (int j=0; jcalcGradientPij(teamMember, delta.data(), thread_workspace.data(), target_index, -1 /* target is neighbor */, 1 /*alpha*/, m2 /*partial_direction*/, _dimensions, _poly_order, false /*specific order only*/, NULL /*&V*/, ReconstructionSpace::ScalarTaylorPolynomial, PointSample, e); + for (int j=0; jcalcGradientPij(teamMember, t1.data(), target_index, -1 /* target is neighbor */, 1 /*alpha*/, m2 /*partial_direction*/, _dimensions, _poly_order, false /*specific order only*/, NULL /*&V*/, ReconstructionSpace::ScalarTaylorPolynomial, PointSample, e); - for (int j=0; jcalcGradientPij(teamMember, delta.data(), thread_workspace.data(), target_index, -1 /* target is neighbor */, 1 /*alpha*/, m2 /*partial_direction*/, _dimensions, _poly_order, false /*specific order only*/, NULL /*&V*/, ReconstructionSpace::ScalarTaylorPolynomial, PointSample, e); + for (int j=0; jcalcGradientPij(teamMember, t1.data(), target_index, -1 /* target is neighbor */, 1 /*alpha*/, m /*partial_direction*/, _dimensions, _poly_order, false /*specific order only*/, NULL /*&V*/, ReconstructionSpace::ScalarTaylorPolynomial, PointSample, e); - int offset = getTargetOffsetIndexDevice(i, m /*in*/, 0 /*out*/, e/*additional*/); - for (int j=0; jcalcGradientPij(teamMember, delta.data(), thread_workspace.data(), target_index, -1 /* target is neighbor */, 1 /*alpha*/, m /*partial_direction*/, _dimensions, _poly_order, false /*specific order only*/, NULL /*&V*/, ReconstructionSpace::ScalarTaylorPolynomial, PointSample, e); + int offset = getTargetOffsetIndexDevice(i, m /*in*/, 0 /*out*/, e/*additional*/); + for (int j=0; jcalcPij(teamMember, t1.data(), target_index, -1 /* target is neighbor */, 1 /*alpha*/, _dimensions, _poly_order, false /*bool on only specific order*/, NULL /*&V*/, ReconstructionSpace::ScalarTaylorPolynomial, PointSample, j); - int offset = getTargetOffsetIndexDevice(i, 0, 0, j); - for (int k=0; kcalcPij(teamMember, delta.data(), thread_workspace.data(), target_index, -1 /* target is neighbor */, 1 /*alpha*/, _dimensions, _poly_order, false /*bool on only specific order*/, NULL /*&V*/, ReconstructionSpace::ScalarTaylorPolynomial, PointSample, j); + int offset = getTargetOffsetIndexDevice(i, 0, 0, j); + for (int k=0; kcalcPij(teamMember, t1.data(), target_index, -1 /* target is neighbor */, 1 /*alpha*/, _dimensions, _poly_order, false /*bool on only specific order*/, NULL /*&V*/, ReconstructionSpace::ScalarTaylorPolynomial, PointSample, e); - for (int m=0; m<_sampling_multiplier; ++m) { - for (int c=0; c<_data_sampling_multiplier; ++c) { - int offset = getTargetOffsetIndexDevice(i, c /*in*/, c /*out*/, e/*additional*/); - for (int j=0; jcalcPij(teamMember, delta.data(), thread_workspace.data(), target_index, -1 /* target is neighbor */, 1 /*alpha*/, _dimensions, _poly_order, false /*bool on only specific order*/, NULL /*&V*/, ReconstructionSpace::ScalarTaylorPolynomial, PointSample, e); + for (int m=0; m<_sampling_multiplier; ++m) { + for (int c=0; c<_data_sampling_multiplier; ++c) { + int offset = getTargetOffsetIndexDevice(i, c /*in*/, c /*out*/, e/*additional*/); + for (int j=0; jcalcGradientPij(teamMember, row.data(), target_index, -1 /* target is neighbor */, 1 /*alpha*/, d /*partial_direction*/, _dimensions, _poly_order, false /*specific order only*/, NULL /*&V*/, ReconstructionSpace::ScalarTaylorPolynomial, PointSample, j); - } + Kokkos::parallel_for(Kokkos::TeamThreadRange(teamMember, num_evaluation_sites), [=] (const int j) { + for (int d=0; d<_dimensions; ++d) { + int offset = getTargetOffsetIndexDevice(i, 0, d, j); + auto row = Kokkos::subview(P_target_row, offset, Kokkos::ALL()); + this->calcGradientPij(teamMember, row.data(), thread_workspace.data(), target_index, -1 /* target is neighbor */, 1 /*alpha*/, d /*partial_direction*/, _dimensions, _poly_order, false /*specific order only*/, NULL /*&V*/, ReconstructionSpace::ScalarTaylorPolynomial, PointSample, j); } }); additional_evaluation_sites_handled = true; // additional non-target site evaluations handled } else if (_operations(i) == TargetOperation::GradientOfVectorPointEvaluation) { - Kokkos::single(Kokkos::PerTeam(teamMember), [&] () { - for (int j=0; jcalcGradientPij(teamMember, row.data(), target_index, -1 /* target is neighbor */, 1 /*alpha*/, m2 /*partial_direction*/, _dimensions, _poly_order, false /*specific order only*/, NULL /*&V*/, ReconstructionSpace::ScalarTaylorPolynomial, PointSample, j); - } + Kokkos::parallel_for(Kokkos::TeamThreadRange(teamMember, num_evaluation_sites), [=] (const int j) { + for (int m0=0; m0<_dimensions; ++m0) { // input components + for (int m1=0; m1<_dimensions; ++m1) { // output components 1 + for (int m2=0; m2<_dimensions; ++m2) { // output componets 2 + int offset = getTargetOffsetIndexDevice(i, m0 /*in*/, m1*_dimensions+m2 /*out*/, j); + auto row = Kokkos::subview(P_target_row, offset, Kokkos::ALL()); + this->calcGradientPij(teamMember, row.data(), thread_workspace.data(), target_index, -1 /* target is neighbor */, 1 /*alpha*/, m2 /*partial_direction*/, _dimensions, _poly_order, false /*specific order only*/, NULL /*&V*/, ReconstructionSpace::ScalarTaylorPolynomial, PointSample, j); } } } @@ -527,40 +498,34 @@ void GMLS::computeTargetFunctionals(const member_type& teamMember, scratch_vecto additional_evaluation_sites_handled = true; // additional non-target site evaluations handled } else if (_operations(i) == TargetOperation::PartialXOfScalarPointEvaluation) { // copied from ScalarTaylorPolynomial - Kokkos::single(Kokkos::PerTeam(teamMember), [&] () { - for (int j=0; jcalcGradientPij(teamMember, row.data(), target_index, -1 /* target is neighbor */, 1 /*alpha*/, 0 /*partial_direction*/, _dimensions, _poly_order, false /*specific order only*/, NULL /*&V*/, ReconstructionSpace::ScalarTaylorPolynomial, PointSample, j); - } + Kokkos::parallel_for(Kokkos::TeamThreadRange(teamMember, num_evaluation_sites), [=] (const int j) { + int offset = getTargetOffsetIndexDevice(i, 0, 0, j); + auto row = Kokkos::subview(P_target_row, offset, Kokkos::ALL()); + this->calcGradientPij(teamMember, row.data(), thread_workspace.data(), target_index, -1 /* target is neighbor */, 1 /*alpha*/, 0 /*partial_direction*/, _dimensions, _poly_order, false /*specific order only*/, NULL /*&V*/, ReconstructionSpace::ScalarTaylorPolynomial, PointSample, j); }); additional_evaluation_sites_handled = true; // additional non-target site evaluations handled } else if (_operations(i) == TargetOperation::PartialYOfScalarPointEvaluation) { // copied from ScalarTaylorPolynomial if (_dimensions>1) { - Kokkos::single(Kokkos::PerTeam(teamMember), [&] () { - for (int j=0; jcalcGradientPij(teamMember, row.data(), target_index, -1 /* target is neighbor */, 1 /*alpha*/, 1 /*partial_direction*/, _dimensions, _poly_order, false /*specific order only*/, NULL /*&V*/, ReconstructionSpace::ScalarTaylorPolynomial, PointSample, j); - } + Kokkos::parallel_for(Kokkos::TeamThreadRange(teamMember, num_evaluation_sites), [=] (const int j) { + int offset = getTargetOffsetIndexDevice(i, 0, 0, j); + auto row = Kokkos::subview(P_target_row, offset, Kokkos::ALL()); + this->calcGradientPij(teamMember, row.data(), thread_workspace.data(), target_index, -1 /* target is neighbor */, 1 /*alpha*/, 1 /*partial_direction*/, _dimensions, _poly_order, false /*specific order only*/, NULL /*&V*/, ReconstructionSpace::ScalarTaylorPolynomial, PointSample, j); }); additional_evaluation_sites_handled = true; // additional non-target site evaluations handled } } else if (_operations(i) == TargetOperation::PartialZOfScalarPointEvaluation) { // copied from ScalarTaylorPolynomial if (_dimensions>2) { - Kokkos::single(Kokkos::PerTeam(teamMember), [&] () { - for (int j=0; jcalcGradientPij(teamMember, row.data(), target_index, -1 /* target is neighbor */, 1 /*alpha*/, 2 /*partial_direction*/, _dimensions, _poly_order, false /*specific order only*/, NULL /*&V*/, ReconstructionSpace::ScalarTaylorPolynomial, PointSample, j); - } + Kokkos::parallel_for(Kokkos::TeamThreadRange(teamMember, num_evaluation_sites), [=] (const int j) { + int offset = getTargetOffsetIndexDevice(i, 0, 0, j); + auto row = Kokkos::subview(P_target_row, offset, Kokkos::ALL()); + this->calcGradientPij(teamMember, row.data(), thread_workspace.data(), target_index, -1 /* target is neighbor */, 1 /*alpha*/, 2 /*partial_direction*/, _dimensions, _poly_order, false /*specific order only*/, NULL /*&V*/, ReconstructionSpace::ScalarTaylorPolynomial, PointSample, j); }); additional_evaluation_sites_handled = true; // additional non-target site evaluations handled } } else if (_operations(i) == TargetOperation::DivergenceOfVectorPointEvaluation) { - Kokkos::single(Kokkos::PerThread(teamMember), [&] () { + Kokkos::single(Kokkos::PerTeam(teamMember), [&] () { int offset = getTargetOffsetIndexDevice(i, 0, 0, 0); for (int j=0; jcalcPij(teamMember, t1.data(), target_index, -(m1+1) /* target is neighbor, but also which component */, 1 /*alpha*/, _dimensions, _poly_order, false /*bool on only specific order*/, NULL /*&V*/, ReconstructionSpace::DivergenceFreeVectorTaylorPolynomial, VectorPointSample, 0 /* evaluate at target */); + this->calcPij(teamMember, delta.data(), thread_workspace.data(), target_index, -(m1+1) /* target is neighbor, but also which component */, 1 /*alpha*/, _dimensions, _poly_order, false /*bool on only specific order*/, NULL /*&V*/, ReconstructionSpace::DivergenceFreeVectorTaylorPolynomial, VectorPointSample, e /* evaluate at target */); - int offset = getTargetOffsetIndexDevice(i, m0 /*in*/, m1 /*out*/, 0 /*no additional*/); + int offset = getTargetOffsetIndexDevice(i, m0 /*in*/, m1 /*out*/, e /*no additional*/); for (int j=0; jcalcGradientPij(teamMember, delta.data(), thread_workspace.data(), target_index, -(2+1) /* -(component+1) */, 1 /*alpha*/, 1 /*partial_direction*/, _dimensions, _poly_order, false /*specific order only*/, NULL /*&V*/, ReconstructionSpace::DivergenceFreeVectorTaylorPolynomial, VectorPointSample, e); + // u2y + for (int j=0; jcalcGradientPij(teamMember, delta.data(), thread_workspace.data(), target_index, -(1+1) /* -(component+1) */, 1 /*alpha*/, 2 /*partial_direction*/, _dimensions, _poly_order, false /*specific order only*/, NULL /*&V*/, ReconstructionSpace::DivergenceFreeVectorTaylorPolynomial, VectorPointSample, e); + // -u1z + for (int j=0; jcalcGradientPij(teamMember, delta.data(), thread_workspace.data(), target_index, -(2+1) /* -(component+1) */, 1 /*alpha*/, 0 /*partial_direction*/, _dimensions, _poly_order, false /*specific order only*/, NULL /*&V*/, ReconstructionSpace::DivergenceFreeVectorTaylorPolynomial, VectorPointSample, e); + // -u2x + for (int j=0; jcalcGradientPij(teamMember, delta.data(), thread_workspace.data(), target_index, -(0+1) /* -(component+1) */, 1 /*alpha*/, 2 /*partial_direction*/, _dimensions, _poly_order, false /*specific order only*/, NULL /*&V*/, ReconstructionSpace::DivergenceFreeVectorTaylorPolynomial, VectorPointSample, e); + // u0z + for (int j=0; jcalcGradientPij(teamMember, delta.data(), thread_workspace.data(), target_index, -(1+1) /* -(component+1) */, 1 /*alpha*/, 0 /*partial_direction*/, _dimensions, _poly_order, false /*specific order only*/, NULL /*&V*/, ReconstructionSpace::DivergenceFreeVectorTaylorPolynomial, VectorPointSample, e); + // u1x + for (int j=0; jcalcGradientPij(teamMember, delta.data(), thread_workspace.data(), target_index, -(0+1) /* -(component+1) */, 1 /*alpha*/, 1 /*partial_direction*/, _dimensions, _poly_order, false /*specific order only*/, NULL /*&V*/, ReconstructionSpace::DivergenceFreeVectorTaylorPolynomial, VectorPointSample, e); + // -u0y + for (int j=0; jcalcGradientPij(teamMember, delta.data(), thread_workspace.data(), target_index, -(1+1) /* -(component+1) */, 1 /*alpha*/, 0 /*partial_direction*/, _dimensions, _poly_order, false /*specific order only*/, NULL /*&V*/, ReconstructionSpace::DivergenceFreeVectorTaylorPolynomial, VectorPointSample, e); + // u1x + for (int j=0; jcalcGradientPij(teamMember, delta.data(), thread_workspace.data(), target_index, -(0+1) /* -(component+1) */, 1 /*alpha*/, 1 /*partial_direction*/, _dimensions, _poly_order, false /*specific order only*/, NULL /*&V*/, ReconstructionSpace::DivergenceFreeVectorTaylorPolynomial, VectorPointSample, e); + // -u0y + for (int j=0; jcalcHessianPij(teamMember, delta.data(), thread_workspace.data(), target_index, -(1+1) /* -(component+1) */, 1 /*alpha*/, 0 /*partial_direction_1*/, 1 /*partial_direction_2*/, _dimensions, _poly_order, false /*specific order only*/, NULL /*&V*/, ReconstructionSpace::DivergenceFreeVectorTaylorPolynomial, VectorPointSample, e); + // u1xy + for (int j=0; jcalcHessianPij(teamMember, delta.data(), thread_workspace.data(), target_index, -(0+1) /* -(component+1) */, 1 /*alpha*/, 1 /*partial_direction_1*/, 1 /*partial_direction_2*/, _dimensions, _poly_order, false /*specific order only*/, NULL /*&V*/, ReconstructionSpace::DivergenceFreeVectorTaylorPolynomial, VectorPointSample, e); + // -u0yy + for (int j=0; jcalcHessianPij(teamMember, delta.data(), thread_workspace.data(), target_index, -(2+1) /* -(component+1) */, 1 /*alpha*/, 0 /*partial_direction_1*/, 2 /*partial_direction_2*/, _dimensions, _poly_order, false /*specific order only*/, NULL /*&V*/, ReconstructionSpace::DivergenceFreeVectorTaylorPolynomial, VectorPointSample, e); + // u2xz + for (int j=0; jcalcHessianPij(teamMember, delta.data(), thread_workspace.data(), target_index, -(0+1) /* -(component+1) */, 1 /*alpha*/, 2 /*partial_direction_1*/, 2 /*partial_direction_2*/, _dimensions, _poly_order, false /*specific order only*/, NULL /*&V*/, ReconstructionSpace::DivergenceFreeVectorTaylorPolynomial, VectorPointSample, e); + // -u0zz + for (int j=0; jcalcHessianPij(teamMember, delta.data(), thread_workspace.data(), target_index, -(1+1) /* -(component+1) */, 1 /*alpha*/, 0 /*partial_direction_1*/, 0 /*partial_direction_2*/, _dimensions, _poly_order, false /*specific order only*/, NULL /*&V*/, ReconstructionSpace::DivergenceFreeVectorTaylorPolynomial, VectorPointSample, e); + // -u1xx + for (int j=0; jcalcHessianPij(teamMember, delta.data(), thread_workspace.data(), target_index, -(0+1) /* -(component+1) */, 1 /*alpha*/, 1 /*partial_direction_1*/, 0 /*partial_direction_2*/, _dimensions, _poly_order, false /*specific order only*/, NULL /*&V*/, ReconstructionSpace::DivergenceFreeVectorTaylorPolynomial, VectorPointSample, e); + // u0yx + for (int j=0; jcalcHessianPij(teamMember, delta.data(), thread_workspace.data(), target_index, -(2+1) /* -(component+1) */, 1 /*alpha*/, 1 /*partial_direction_1*/, 2 /*partial_direction_2*/, _dimensions, _poly_order, false /*specific order only*/, NULL /*&V*/, ReconstructionSpace::DivergenceFreeVectorTaylorPolynomial, VectorPointSample, e); + // u2yz + for (int j=0; jcalcHessianPij(teamMember, delta.data(), thread_workspace.data(), target_index, -(1+1) /* -(component+1) */, 1 /*alpha*/, 2 /*partial_direction_1*/, 2 /*partial_direction_2*/, _dimensions, _poly_order, false /*specific order only*/, NULL /*&V*/, ReconstructionSpace::DivergenceFreeVectorTaylorPolynomial, VectorPointSample, e); + // -u1zz + for (int j=0; jcalcHessianPij(teamMember, delta.data(), thread_workspace.data(), target_index, -(2+1) /* -(component+1) */, 1 /*alpha*/, 0 /*partial_direction_1*/, 0 /*partial_direction_2*/, _dimensions, _poly_order, false /*specific order only*/, NULL /*&V*/, ReconstructionSpace::DivergenceFreeVectorTaylorPolynomial, VectorPointSample, e); + // -u2xx + for (int j=0; jcalcHessianPij(teamMember, delta.data(), thread_workspace.data(), target_index, -(0+1) /* -(component+1) */, 1 /*alpha*/, 2 /*partial_direction_1*/, 0 /*partial_direction_2*/, _dimensions, _poly_order, false /*specific order only*/, NULL /*&V*/, ReconstructionSpace::DivergenceFreeVectorTaylorPolynomial, VectorPointSample, e); + // u0zx + for (int j=0; jcalcHessianPij(teamMember, delta.data(), thread_workspace.data(), target_index, -(2+1) /* -(component+1) */, 1 /*alpha*/, 1 /*partial_direction_1*/, 1 /*partial_direction_2*/, _dimensions, _poly_order, false /*specific order only*/, NULL /*&V*/, ReconstructionSpace::DivergenceFreeVectorTaylorPolynomial, VectorPointSample, e); + // -u2yy + for (int j=0; jcalcHessianPij(teamMember, delta.data(), thread_workspace.data(), target_index, -(1+1) /* -(component+1) */, 1 /*alpha*/, 2 /*partial_direction_1*/, 1 /*partial_direction_2*/, _dimensions, _poly_order, false /*specific order only*/, NULL /*&V*/, ReconstructionSpace::DivergenceFreeVectorTaylorPolynomial, VectorPointSample, e); + // u1zy + for (int j=0; jcalcHessianPij(teamMember, delta.data(), thread_workspace.data(), target_index, -(0+1) /* -(component+1) */, 1 /*alpha*/, 0 /*partial_direction_1*/, 0 /*partial_direction_2*/, _dimensions, _poly_order, false /*specific order only*/, NULL /*&V*/, ReconstructionSpace::DivergenceFreeVectorTaylorPolynomial, VectorPointSample, e); + // u0xx + for (int j=0; jcalcHessianPij(teamMember, delta.data(), thread_workspace.data(), target_index, -(1+1) /* -(component+1) */, 1 /*alpha*/, 1 /*partial_direction_1*/, 0 /*partial_direction_2*/, _dimensions, _poly_order, false /*specific order only*/, NULL /*&V*/, ReconstructionSpace::DivergenceFreeVectorTaylorPolynomial, VectorPointSample, e); + // u1yx + for (int j=0; jcalcHessianPij(teamMember, delta.data(), thread_workspace.data(), target_index, -(0+1) /* -(component+1) */, 1 /*alpha*/, 0 /*partial_direction_1*/, 0 /*partial_direction_2*/, _dimensions, _poly_order, false /*specific order only*/, NULL /*&V*/, ReconstructionSpace::DivergenceFreeVectorTaylorPolynomial, VectorPointSample, e); + // -u0xx + for (int j=0; jcalcHessianPij(teamMember, delta.data(), thread_workspace.data(), target_index, -(0+1) /* -(component+1) */, 1 /*alpha*/, 1 /*partial_direction_1*/, 1 /*partial_direction_2*/, _dimensions, _poly_order, false /*specific order only*/, NULL /*&V*/, ReconstructionSpace::DivergenceFreeVectorTaylorPolynomial, VectorPointSample, e); + // -u0yy + for (int j=0; jcalcHessianPij(teamMember, delta.data(), thread_workspace.data(), target_index, -(0+1) /* -(component+1) */, 1 /*alpha*/, 0 /*partial_direction_1*/, 1 /*partial_direction_2*/, _dimensions, _poly_order, false /*specific order only*/, NULL /*&V*/, ReconstructionSpace::DivergenceFreeVectorTaylorPolynomial, VectorPointSample, e); + // u0xy + for (int j=0; jcalcHessianPij(teamMember, delta.data(), thread_workspace.data(), target_index, -(1+1) /* -(component+1) */, 1 /*alpha*/, 1 /*partial_direction_1*/, 1 /*partial_direction_2*/, _dimensions, _poly_order, false /*specific order only*/, NULL /*&V*/, ReconstructionSpace::DivergenceFreeVectorTaylorPolynomial, VectorPointSample, e); + // u1yy + for (int j=0; jcalcHessianPij(teamMember, delta.data(), thread_workspace.data(), target_index, -(1+1) /* -(component+1) */, 1 /*alpha*/, 0 /*partial_direction_1*/, 0 /*partial_direction_2*/, _dimensions, _poly_order, false /*specific order only*/, NULL /*&V*/, ReconstructionSpace::DivergenceFreeVectorTaylorPolynomial, VectorPointSample, e); + // -u1xx + for (int j=0; jcalcHessianPij(teamMember, delta.data(), thread_workspace.data(), target_index, -(1+1) /* -(component+1) */, 1 /*alpha*/, 1 /*partial_direction_1*/, 1 /*partial_direction_2*/, _dimensions, _poly_order, false /*specific order only*/, NULL /*&V*/, ReconstructionSpace::DivergenceFreeVectorTaylorPolynomial, VectorPointSample, e); + // -u1yy + for (int j=0; jcalcGradientPij(teamMember, delta.data(), thread_workspace.data(), target_index, -(m1+1) /* target is neighbor */, 1 /*alpha*/, m2 /*partial_direction*/, _dimensions, _poly_order, false /*specific order only*/, NULL /*&V*/, ReconstructionSpace::DivergenceFreeVectorTaylorPolynomial, VectorPointSample, e); + for (int j=0; j=(_curvature_poly_order+1)*_local_dimensions) && "Workspace thread_workspace not large enough."); const int target_index = _initial_index_for_batch + teamMember.league_rank(); @@ -927,32 +961,34 @@ void GMLS::computeCurvatureFunctionals(const member_type& teamMember, scratch_ve P_target_row(j,k) = 0; }); }); + Kokkos::parallel_for(Kokkos::TeamThreadRange(teamMember, delta.extent(0)), [&] (const int j) { delta(j) = 0; }); + Kokkos::parallel_for(Kokkos::TeamThreadRange(teamMember, thread_workspace.extent(0)), [&] (const int j) { thread_workspace(j) = 0; }); teamMember.team_barrier(); const int manifold_NP = this->getNP(_curvature_poly_order, _dimensions-1, ReconstructionSpace::ScalarTaylorPolynomial); for (size_t i=0; i<_curvature_support_operations.size(); ++i) { if (_curvature_support_operations(i) == TargetOperation::ScalarPointEvaluation) { - Kokkos::single(Kokkos::PerThread(teamMember), [&] () { + Kokkos::single(Kokkos::PerTeam(teamMember), [&] () { int offset = getTargetOffsetIndexDevice(i, 0, 0, 0); - this->calcPij(teamMember, t1.data(), target_index, local_neighbor_index, 0 /*alpha*/, _dimensions-1, _curvature_poly_order, false /*bool on only specific order*/, V, ReconstructionSpace::ScalarTaylorPolynomial, PointSample); + this->calcPij(teamMember, delta.data(), thread_workspace.data(), target_index, local_neighbor_index, 0 /*alpha*/, _dimensions-1, _curvature_poly_order, false /*bool on only specific order*/, V, ReconstructionSpace::ScalarTaylorPolynomial, PointSample); for (int j=0; jcalcGradientPij(teamMember, t1.data(), target_index, local_neighbor_index, 0 /*alpha*/, 0 /*partial_direction*/, _dimensions-1, _curvature_poly_order, false /*specific order only*/, V, ReconstructionSpace::ScalarTaylorPolynomial, PointSample); + this->calcGradientPij(teamMember, delta.data(), thread_workspace.data(), target_index, local_neighbor_index, 0 /*alpha*/, 0 /*partial_direction*/, _dimensions-1, _curvature_poly_order, false /*specific order only*/, V, ReconstructionSpace::ScalarTaylorPolynomial, PointSample); for (int j=0; j2) { // _dimensions-1 > 1 //offset = (i+1)*manifold_NP; offset = getTargetOffsetIndexDevice(i, 0, 1, 0); - this->calcGradientPij(teamMember, t1.data(), target_index, local_neighbor_index, 0 /*alpha*/, 1 /*partial_direction*/, _dimensions-1, _curvature_poly_order, false /*specific order only*/, V, ReconstructionSpace::ScalarTaylorPolynomial, PointSample); + this->calcGradientPij(teamMember, delta.data(), thread_workspace.data(), target_index, local_neighbor_index, 0 /*alpha*/, 1 /*partial_direction*/, _dimensions-1, _curvature_poly_order, false /*specific order only*/, V, ReconstructionSpace::ScalarTaylorPolynomial, PointSample); for (int j=0; j=(_poly_order+1)*_local_dimensions) && "Workspace thread_workspace not large enough."); // only designed for 2D manifold embedded in 3D space const int target_index = _initial_index_for_batch + teamMember.league_rank(); @@ -975,6 +1013,8 @@ void GMLS::computeTargetFunctionalsOnManifold(const member_type& teamMember, scr P_target_row(j,k) = 0; }); }); + Kokkos::parallel_for(Kokkos::TeamThreadRange(teamMember, delta.extent(0)), [&] (const int j) { delta(j) = 0; }); + Kokkos::parallel_for(Kokkos::TeamThreadRange(teamMember, thread_workspace.extent(0)), [&] (const int j) { thread_workspace(j) = 0; }); teamMember.team_barrier(); // determine if additional evaluation sites are requested by user and handled by target operations @@ -992,85 +1032,79 @@ void GMLS::computeTargetFunctionalsOnManifold(const member_type& teamMember, scr // USER defined targets on the manifold should be added to this file // if the USER defined targets don't catch this operation, then operation_handled will be false - #include "USER_ManifoldTargetFunctionals.hpp" + #include "Compadre_USER_ManifoldTargetFunctionals.hpp" // if the user didn't handle the operation, we pass it along to the toolkit's targets if (!operation_handled) { if (_dimensions>2) { if (_operations(i) == TargetOperation::ScalarPointEvaluation) { - Kokkos::single(Kokkos::PerTeam(teamMember), [&] () { - for (int j=0; jcalcPij(teamMember, t1.data(), target_index, -1 /* target is neighbor */, 1 /*alpha*/, _dimensions-1, _poly_order, false /*bool on only specific order*/, &V, ReconstructionSpace::ScalarTaylorPolynomial, PointSample, j); - int offset = getTargetOffsetIndexDevice(i, 0, 0, j); - for (int k=0; kcalcPij(teamMember, delta.data(), thread_workspace.data(), target_index, -1 /* target is neighbor */, 1 /*alpha*/, _dimensions-1, _poly_order, false /*bool on only specific order*/, &V, ReconstructionSpace::ScalarTaylorPolynomial, PointSample, j); + int offset = getTargetOffsetIndexDevice(i, 0, 0, j); + for (int k=0; kcalcPij(teamMember, t1.data(), target_index, -1 /* target is neighbor */, 1 /*alpha*/, _dimensions-1, _poly_order, false /*bool on only specific order*/, &V, ReconstructionSpace::ScalarTaylorPolynomial, PointSample, k); - int offset = getTargetOffsetIndexDevice(i, 0, 0, k); - for (int j=0; jcalcPij(teamMember, delta.data(), thread_workspace.data(), target_index, -1 /* target is neighbor */, 1 /*alpha*/, _dimensions-1, _poly_order, false /*bool on only specific order*/, &V, ReconstructionSpace::ScalarTaylorPolynomial, PointSample, k); + int offset = getTargetOffsetIndexDevice(i, 0, 0, k); + for (int j=0; jcalcPij(teamMember, t1.data(), target_index, -1 /* target is neighbor */, 1 /*alpha*/, _dimensions-1, _poly_order, false /*bool on only specific order*/, &V, ReconstructionSpace::ScalarTaylorPolynomial, PointSample, k); - int offset = getTargetOffsetIndexDevice(i, 0, 0, k); - for (int j=0; jcalcPij(teamMember, delta.data(), thread_workspace.data(), target_index, -1 /* target is neighbor */, 1 /*alpha*/, _dimensions-1, _poly_order, false /*bool on only specific order*/, &V, ReconstructionSpace::ScalarTaylorPolynomial, PointSample, k); + int offset = getTargetOffsetIndexDevice(i, 0, 0, k); + for (int j=0; j 0 && _curvature_poly_order > 1) { - t1(1) = (-a1*((h*h+a2*a2)*a3 - 2*a1*a2*a4+(h*h+a1*a1)*a5))/den/den/(h*h); - t1(2) = (-a2*((h*h+a2*a2)*a3 - 2*a1*a2*a4+(h*h+a1*a1)*a5))/den/den/(h*h); + delta(1) = (-a1*((h*h+a2*a2)*a3 - 2*a1*a2*a4+(h*h+a1*a1)*a5))/den/den/(h*h); + delta(2) = (-a2*((h*h+a2*a2)*a3 - 2*a1*a2*a4+(h*h+a1*a1)*a5))/den/den/(h*h); } if (_poly_order > 1 && _curvature_poly_order > 0) { - t1(3) = (h*h+a2*a2)/den/(h*h); - t1(4) = -2*a1*a2/den/(h*h); - t1(5) = (h*h+a1*a1)/den/(h*h); + delta(3) = (h*h+a2*a2)/den/(h*h); + delta(4) = -2*a1*a2/den/(h*h); + delta(5) = (h*h+a1*a1)/den/(h*h); } // output component 0 int offset = getTargetOffsetIndexDevice(i, 0, 0, 0); for (int j=0; j 0 && _curvature_poly_order > 1) { - t1(1) = (-a1*((h*h+a2*a2)*a3 - 2*a1*a2*a4+(h*h+a1*a1)*a5))/den/den/(h*h); - t1(2) = (-a2*((h*h+a2*a2)*a3 - 2*a1*a2*a4+(h*h+a1*a1)*a5))/den/den/(h*h); + delta(1) = (-a1*((h*h+a2*a2)*a3 - 2*a1*a2*a4+(h*h+a1*a1)*a5))/den/den/(h*h); + delta(2) = (-a2*((h*h+a2*a2)*a3 - 2*a1*a2*a4+(h*h+a1*a1)*a5))/den/den/(h*h); } if (_poly_order > 1 && _curvature_poly_order > 0) { - t1(3) = (h*h+a2*a2)/den/(h*h); - t1(4) = -2*a1*a2/den/(h*h); - t1(5) = (h*h+a1*a1)/den/(h*h); + delta(3) = (h*h+a2*a2)/den/(h*h); + delta(4) = -2*a1*a2/den/(h*h); + delta(5) = (h*h+a1*a1)/den/(h*h); } // output component 0 int offset = getTargetOffsetIndexDevice(i, 0, 0, 0); for (int j=0; j 0) { - for (int d=0; d<_dimensions-1; ++d) { - relative_coord[d] = getTargetAuxiliaryCoordinate(target_index, k, d, &V); - relative_coord[d] -= getTargetCoordinate(target_index, d, &V); - } - } else { - for (int i=0; i<3; ++i) relative_coord[i] = 0; - } - - int offset = getTargetOffsetIndexDevice(i, 0, 0, k); - P_target_row(offset, 0) = GaussianCurvature(curvature_coefficients, h, relative_coord.x, relative_coord.y); + Kokkos::parallel_for(Kokkos::TeamThreadRange(teamMember, num_evaluation_sites), [=] (const int k) { + XYZ relative_coord; + if (k > 0) { + for (int d=0; d<_dimensions-1; ++d) { + relative_coord[d] = getTargetAuxiliaryCoordinate(target_index, k, d, &V); + relative_coord[d] -= getTargetCoordinate(target_index, d, &V); + } + } else { + for (int i=0; i<3; ++i) relative_coord[i] = 0; } + + int offset = getTargetOffsetIndexDevice(i, 0, 0, k); + P_target_row(offset, 0) = GaussianCurvature(curvature_coefficients, h, relative_coord.x, relative_coord.y); }); additional_evaluation_sites_handled = true; // additional non-target site evaluations handled } else if (_operations(i) == TargetOperation::CurlOfVectorPointEvaluation) { double h = _epsilons(target_index); - int alphax, alphay; - Kokkos::single(Kokkos::PerThread(teamMember), [&] () { - for (int k=0; k 0) { - for (int d=0; d<_dimensions-1; ++d) { - relative_coord[d] = getTargetAuxiliaryCoordinate(target_index, k, d, &V); - relative_coord[d] -= getTargetCoordinate(target_index, d, &V); - } - } else { - for (int i=0; i<3; ++i) relative_coord[i] = 0; - } + Kokkos::parallel_for(Kokkos::TeamThreadRange(teamMember, num_evaluation_sites), [=] (const int k) { + int alphax, alphay; + XYZ relative_coord; + if (k > 0) { + for (int d=0; d<_dimensions-1; ++d) { + relative_coord[d] = getTargetAuxiliaryCoordinate(target_index, k, d, &V); + relative_coord[d] -= getTargetCoordinate(target_index, d, &V); + } + } else { + for (int i=0; i<3; ++i) relative_coord[i] = 0; + } - int offset = getTargetOffsetIndexDevice(i, 0, 0, k); - int index = 0; - for (int n = 0; n <= _poly_order; n++){ - for (alphay = 0; alphay <= n; alphay++){ - alphax = n - alphay; - P_target_row(offset, index) = SurfaceCurlOfScalar(curvature_coefficients, h, relative_coord.x, relative_coord.y, alphax, alphay, 0); - index++; - } + int offset = getTargetOffsetIndexDevice(i, 0, 0, k); + int index = 0; + for (int n = 0; n <= _poly_order; n++){ + for (alphay = 0; alphay <= n; alphay++){ + alphax = n - alphay; + P_target_row(offset, index) = SurfaceCurlOfScalar(curvature_coefficients, h, relative_coord.x, relative_coord.y, alphax, alphay, 0); + index++; } + } - offset = getTargetOffsetIndexDevice(i, 0, 1, k); - index = 0; - for (int n = 0; n <= _poly_order; n++){ - for (alphay = 0; alphay <= n; alphay++){ - alphax = n - alphay; - P_target_row(offset, index) = SurfaceCurlOfScalar(curvature_coefficients, h, relative_coord.x, relative_coord.y, alphax, alphay, 1); - index++; - } + offset = getTargetOffsetIndexDevice(i, 0, 1, k); + index = 0; + for (int n = 0; n <= _poly_order; n++){ + for (alphay = 0; alphay <= n; alphay++){ + alphax = n - alphay; + P_target_row(offset, index) = SurfaceCurlOfScalar(curvature_coefficients, h, relative_coord.x, relative_coord.y, alphax, alphay, 1); + index++; } } }); @@ -1564,7 +1594,7 @@ void GMLS::computeTargetFunctionalsOnManifold(const member_type& teamMember, scr // 3 is for # vertices in sub-triangle scratch_matrix_right_type triangle_coords_matrix(triangle_coords, _global_dimensions, 3); - scratch_vector_type midpoint(t1.data(), _global_dimensions); + scratch_vector_type midpoint(delta.data(), _global_dimensions); getMidpointFromCellVertices(teamMember, midpoint, _target_extra_data, target_index, _global_dimensions /*dim*/); for (int j=0; j<_global_dimensions; ++j) { triangle_coords_matrix(j, 0) = midpoint(j); @@ -1644,14 +1674,14 @@ void GMLS::computeTargetFunctionalsOnManifold(const member_type& teamMember, scr } } else if (_dimensions==2) { // 1D manifold in 2D problem if (_operations(i) == TargetOperation::GradientOfScalarPointEvaluation) { - Kokkos::single(Kokkos::PerThread(teamMember), [&] () { + Kokkos::single(Kokkos::PerTeam(teamMember), [&] () { int offset = getTargetOffsetIndexDevice(i, 0, 0, 0); for (int j=0; j(0,num_matrices), KOKKOS_LAMBDA(const int i) { + for (int i=0; i +#include "nanoflann.hpp" #include #include @@ -152,8 +152,8 @@ class PointCloudSearch { : _src_pts_view(src_pts_view), _dim((dimension < 0) ? src_pts_view.extent(1) : dimension), _max_leaf((max_leaf < 0) ? 10 : max_leaf) { - compadre_assert_release((std::is_same::value) && - "Views passed to PointCloudSearch at construction should reside on the host."); + compadre_assert_release((Kokkos::SpaceAccessibility::accessible==1) + && "Views passed to PointCloudSearch at construction should be accessible from the host."); }; ~PointCloudSearch() {}; @@ -208,15 +208,15 @@ class PointCloudSearch { // function does not populate epsilons, they must be prepopulated - compadre_assert_release((std::is_same::value) && - "Target coordinates view passed to generateNeighborListsFromRadiusSearch should reside on the host."); + compadre_assert_release((Kokkos::SpaceAccessibility::accessible==1) && + "Target coordinates view passed to generateNeighborListsFromRadiusSearch should be accessible from the host."); compadre_assert_release((((int)trg_pts_view.extent(1))>=_dim) && "Target coordinates view passed to generateNeighborListsFromRadiusSearch must have \ second dimension as large as _dim."); - compadre_assert_release((std::is_same::value) && - "Views passed to generateNeighborListsFromKNNSearch should reside on the host."); - compadre_assert_release((std::is_same::value) && - "Views passed to generateNeighborListsFromKNNSearch should reside on the host."); + compadre_assert_release((Kokkos::SpaceAccessibility::accessible==1) && + "Views passed to generateNeighborListsFromKNNSearch should be accessible from the host."); + compadre_assert_release((Kokkos::SpaceAccessibility::accessible==1) && + "Views passed to generateNeighborListsFromKNNSearch should be accessible from the host."); // loop size const int num_target_sites = trg_pts_view.extent(0); @@ -330,15 +330,15 @@ class PointCloudSearch { // First, do a knn search (removes need for guessing initial search radius) - compadre_assert_release((std::is_same::value) && - "Target coordinates view passed to generateNeighborListsFromKNNSearch should reside on the host."); + compadre_assert_release((Kokkos::SpaceAccessibility::accessible==1) && + "Target coordinates view passed to generateNeighborListsFromKNNSearch should be accessible from the host."); compadre_assert_release((((int)trg_pts_view.extent(1))>=_dim) && "Target coordinates view passed to generateNeighborListsFromRadiusSearch must have \ second dimension as large as _dim."); - compadre_assert_release((std::is_same::value) && - "Views passed to generateNeighborListsFromKNNSearch should reside on the host."); - compadre_assert_release((std::is_same::value) && - "Views passed to generateNeighborListsFromKNNSearch should reside on the host."); + compadre_assert_release((Kokkos::SpaceAccessibility::accessible==1) && + "Views passed to generateNeighborListsFromKNNSearch should be accessible from the host."); + compadre_assert_release((Kokkos::SpaceAccessibility::accessible==1) && + "Views passed to generateNeighborListsFromKNNSearch should be accessible from the host."); // loop size const int num_target_sites = trg_pts_view.extent(0); diff --git a/packages/compadre/src/Compadre_Typedefs.hpp b/packages/compadre/src/Compadre_Typedefs.hpp index f10a77b483fd..3e1328871b48 100644 --- a/packages/compadre/src/Compadre_Typedefs.hpp +++ b/packages/compadre/src/Compadre_Typedefs.hpp @@ -33,15 +33,15 @@ typedef std::size_t global_index_type; // execution spaces typedef Kokkos::DefaultHostExecutionSpace host_execution_space; -#ifdef COMPADRE_USE_CUDA - typedef Kokkos::DefaultExecutionSpace device_execution_space; -#else - typedef Kokkos::DefaultHostExecutionSpace device_execution_space; -#endif +typedef Kokkos::DefaultExecutionSpace device_execution_space; // memory spaces typedef typename host_execution_space::memory_space host_memory_space; -typedef typename device_execution_space::memory_space device_memory_space; +#ifdef COMPADRE_USE_CUDA + typedef typename Kokkos::CudaSpace device_memory_space; +#else + typedef typename device_execution_space::memory_space device_memory_space; +#endif // team policies typedef typename Kokkos::TeamPolicy team_policy; @@ -75,13 +75,13 @@ typedef Kokkos::View +typedef Kokkos::View device_managed_matrix_right_type; -typedef Kokkos::View +typedef Kokkos::View device_managed_matrix_left_type; -typedef Kokkos::View +typedef Kokkos::View device_managed_vector_type; -typedef Kokkos::View +typedef Kokkos::View device_managed_local_index_type; // managed host data views diff --git a/packages/compadre/src/USER_ManifoldTargetFunctionals.hpp b/packages/compadre/src/Compadre_USER_ManifoldTargetFunctionals.hpp similarity index 100% rename from packages/compadre/src/USER_ManifoldTargetFunctionals.hpp rename to packages/compadre/src/Compadre_USER_ManifoldTargetFunctionals.hpp diff --git a/packages/compadre/src/USER_StandardTargetFunctionals.hpp b/packages/compadre/src/Compadre_USER_StandardTargetFunctionals.hpp similarity index 100% rename from packages/compadre/src/USER_StandardTargetFunctionals.hpp rename to packages/compadre/src/Compadre_USER_StandardTargetFunctionals.hpp diff --git a/packages/compadre/src/Compadre_Utilities.hpp b/packages/compadre/src/Compadre_Utilities.hpp index 346025770bf8..707dde1155e3 100644 --- a/packages/compadre/src/Compadre_Utilities.hpp +++ b/packages/compadre/src/Compadre_Utilities.hpp @@ -171,7 +171,7 @@ struct Extract { // // // Make view on the device (does nothing if already on the device) // auto input_data_device = Kokkos::create_mirror_view( -// device_execution_space::memory_space(), input_data_host_or_device); +// device_memory_space(), input_data_host_or_device); // Kokkos::deep_copy(input_data_device, input_data_host_or_device); // Kokkos::fence(); // diff --git a/packages/compadre/src/basis/Compadre_DivergenceFreePolynomial.hpp b/packages/compadre/src/basis/Compadre_DivergenceFreePolynomial.hpp new file mode 100644 index 000000000000..ab1fbb43c113 --- /dev/null +++ b/packages/compadre/src/basis/Compadre_DivergenceFreePolynomial.hpp @@ -0,0 +1,1251 @@ +#ifndef _COMPADRE_GMLS_DIVFREE_BASIS_HPP_ +#define _COMPADRE_GMLS_DIVFREE_BASIS_HPP_ + +#include "Compadre_GMLS.hpp" +#include "Compadre_ScalarTaylorPolynomial.hpp" + +namespace Compadre { +/*! \brief Definition of the divergence-free polynomial basis + * + Let \f$NB_d=\f$ the number of basis components in the scalar Taylor polynomial basis, for the same dimension \f$d\f$ and up to the same degree of polynomial. + Let \f$NB_{(d-1)/v}=\f$ the number of basis components in the scalar Taylor polynomial basis, for one dimension lower \f$(d-1)\f$ that does not use same contain the direction v. + \li in 1D) No definition. + \li in 2D) The first \f$NB_d\f$ elements are \f[\begin{bmatrix}b_i\\ -\int \frac{\partial}{\partial x}(b_i)\; dy\end{bmatrix},\f] where \f$i\f$ is the basis element number for the divergence-free polynomial basis.\newline + The next \f$NB_{(d-1)/y}\f$ elements are \f[\begin{bmatrix}0\\b_j\end{bmatrix},\f] where \f$j\f$ is the basis element number for the divergence-free polynomial basis of one dimension lower using only the variable \f$x\f$. + \li in 3D) The first \f$NB_d\f$ elements are \f[\begin{bmatrix}b_i\\ 0 \\-\int \frac{\partial}{\partial x}(b_i)\; dz\end{bmatrix},\f] where \f$i\f$ is the basis element number for the divergence-free polynomial basis.\newline + The next \f$NB_d\f$ elements are \f[\begin{bmatrix}0\\ b_i \\-\int \frac{\partial}{\partial y}(b_i)\; dz\end{bmatrix},\f] where \f$i\f$ is the basis element number for the divergence-free polynomial basis.\newline + The next \f$NB_{(d-1)/z}\f$ elements are \f[\begin{bmatrix}0\\0\\b_j\end{bmatrix},\f] where \f$j\f$ is the basis element number for the divergence-free polynomial basis of one dimension lower using only the variables \f$x\f$ and \f$y\f$. + +*/ +namespace DivergenceFreePolynomialBasis { + + /*! \brief Returns size of basis + \param degree [in] - highest degree of polynomial + \param dimension [in] - spatial dimension to evaluate + */ + KOKKOS_INLINE_FUNCTION + int getSize(const int degree, const int dimension) { + return (dimension-1)*ScalarTaylorPolynomialBasis::getSize(degree, dimension) + + ScalarTaylorPolynomialBasis::getSize(degree, dimension-1); + } + + /*! \brief Evaluates the divergence-free polynomial basis + * delta[j] = weight_of_original_value * delta[j] + weight_of_new_value * (calculation of this function) + \param delta [in/out] - scratch space that is allocated so that each thread has its own copy. Must be at least as large as the _basis_multipler*the dimension of the polynomial basis. + \param workspace [in/out] - scratch space that is allocated so that each thread has its own copy. Must be at least as large as the _poly_order*the spatial dimension of the polynomial basis. + \param dimension [in] - spatial dimension to evaluate + \param max_degree [in] - highest degree of polynomial + \param h [in] - epsilon/window size + \param x [in] - x coordinate (already shifted by target) + \param y [in] - y coordinate (already shifted by target) + \param z [in] - z coordinate (already shifted by target) + \param starting_order [in] - polynomial order to start with (default=0) + \param weight_of_original_value [in] - weighting to assign to original value in delta (default=0, replace, 1-increment current value) + \param weight_of_new_value [in] - weighting to assign to new contribution (default=1, add to/replace) + */ + KOKKOS_INLINE_FUNCTION + void evaluate(const member_type& teamMember, double* delta, double* workspace, const int dimension, const int max_degree, const int component, const double h, const double x, const double y, const double z, const int starting_order = 0, const double weight_of_original_value = 0.0, const double weight_of_new_value = 1.0) { + Kokkos::single(Kokkos::PerThread(teamMember), [&] () { + const double factorial[] = {1, 1, 2, 6, 24, 120, 720, 5040, 40320, 362880, 3628800, 39916800, 479001600, 6227020800, 87178291200}; + if (dimension==3) { + scratch_vector_type x_over_h_to_i(workspace, max_degree+1); + scratch_vector_type y_over_h_to_i(workspace+1*(max_degree+1), max_degree+1); + scratch_vector_type z_over_h_to_i(workspace+2*(max_degree+1), max_degree+1); + x_over_h_to_i[0] = 1; + y_over_h_to_i[0] = 1; + z_over_h_to_i[0] = 1; + for (int i=1; i<=max_degree; ++i) { + x_over_h_to_i[i] = x_over_h_to_i[i-1]*(x/h); + y_over_h_to_i[i] = y_over_h_to_i[i-1]*(y/h); + z_over_h_to_i[i] = z_over_h_to_i[i-1]*(z/h); + } + int i=0; + for (int d=0; dPrint(os); + return; + } + + if (MyPID==0) { + os << "[FECrsMatrix] Nonlocal rows:\n"; + os.width(8); + os << " Processor "; + os.width(10); + os << " Row Index "; + os.width(10); + os << " Col Index "; + os.width(20); + os << " Value "; + os << std::endl; + } + for (int iproc=0; iproc < NumProc; iproc++) { + if (MyPID==iproc) { + if(RowMap().GlobalIndicesInt()) { + const int nnr = nonlocalRows_int_.size(); + for (int i=0; iGraph(); Epetra_CrsGraph& nonconst_graph = const_cast(graph); nonconst_graph.SetIndicesAreGlobal(true); - } - } - //Now we need to call FillComplete on our temp matrix. We need to - //pass a DomainMap and RangeMap, which are not the same as the RowMap - //and ColMap that we constructed the matrix with. - EPETRA_CHK_ERR(tempMat_->FillComplete(domain_map, range_map)); + } + } - if (exporter_ == NULL) - exporter_ = new Epetra_Export(tempMat_->RowMap(), RowMap()); + //Now we need to call FillComplete on our temp matrix. We need to + //pass a DomainMap and RangeMap, which are not the same as the RowMap + //and ColMap that we constructed the matrix with. + EPETRA_CHK_ERR(tempMat_->FillComplete(domain_map, range_map)); - EPETRA_CHK_ERR(Export(*tempMat_, *exporter_, combineMode)); + if (exporter_ == NULL) + exporter_ = new Epetra_Export(tempMat_->RowMap(), RowMap()); - if(callFillComplete) { - EPETRA_CHK_ERR(FillComplete(domain_map, range_map)); - } + EPETRA_CHK_ERR(Export(*tempMat_, *exporter_, combineMode)); - //now reset the values in our nonlocal data - if (!useNonlocalMatrix_) { - for(size_t i=0; iPutScalar(0.0); + } else { + for(size_t i=0; i subcellParamViewType; + private: /** \brief Generates default HGrad basis based on cell topology @@ -250,7 +252,6 @@ namespace Intrepid2 { /** \struct Intrepid2::CellTools::SubcellParamData \brief Parametrization coefficients of edges and faces of reference cells */ - typedef Kokkos::DynRankView subcellParamViewType; struct SubcellParamData { subcellParamViewType dummy; subcellParamViewType lineEdges; // edge maps for 2d non-standard cells; shell line and beam @@ -265,6 +266,24 @@ namespace Intrepid2 { static bool isSubcellParametrizationSet_; + + /** \brief Sets orientation-preserving parametrizations of reference edges and faces of cell + topologies with reference cells. Used to populate Intrepid2::CellTools::SubcellParamData. + + See Intrepid2::CellTools::setSubcellParametrization and Section \ref sec_cell_topology_subcell_map + more information about parametrization maps. + + \param subcellParam [out] - array with the coefficients of the parametrization map + \param subcellDim [in] - dimension of the subcells being parametrized (1 or 2) + \param parentCell [in] - topology of the parent cell owning the subcells. + */ + static void + setSubcellParametrization( subcellParamViewType &subcellParam, + const ordinal_type subcellDim, + const shards::CellTopology parentCell ); + + public: + /** \brief Defines orientation-preserving parametrizations of reference edges and faces of cell topologies with reference cells. @@ -301,23 +320,6 @@ namespace Intrepid2 { */ static void setSubcellParametrization(); - /** \brief Sets orientation-preserving parametrizations of reference edges and faces of cell - topologies with reference cells. Used to populate Intrepid2::CellTools::SubcellParamData. - - See Intrepid2::CellTools::setSubcellParametrization and Section \ref sec_cell_topology_subcell_map - more information about parametrization maps. - - \param subcellParametrization [out] - array with the coefficients of the parametrization map - \param subcellDim [in] - dimension of the subcells being parametrized (1 or 2) - \param parentCell [in] - topology of the parent cell owning the subcells. - */ - static void - setSubcellParametrization( subcellParamViewType &subcellParam, - const ordinal_type subcellDim, - const shards::CellTopology parentCell ); - - public: - /** \brief Default constructor. */ CellTools() = default; @@ -1141,6 +1143,28 @@ namespace Intrepid2 { const shards::CellTopology parentCell ); + /** + \brief Overload of mapToReferenceSubcell that runs on device. + + \param refSubcellPoints [out] - rank-2 (P,D1) array with images of parameter space points + \param paramPoints [in] - rank-2 (P,D2) array with points in 1D or 2D parameter domain + \param subcellMap [in] - array with the coefficients of the subcell parametrization map + \param subcellDim [in] - dimension of the subcell where points are mapped to + \param subcellOrd [in] - subcell ordinal + \param parentCellDim [in] - dimension of the parent cell. + */ + template + static void + KOKKOS_INLINE_FUNCTION + mapToReferenceSubcell( Kokkos::DynRankView refSubcellPoints, + const Kokkos::DynRankView paramPoints, + const subcellParamViewType subcellMap, + const ordinal_type subcellDim, + const ordinal_type subcellOrd, + const ordinal_type parentCellDim); + + //============================================================================================// // // // Physical-to-reference frame mapping and its inverse // diff --git a/packages/intrepid2/src/Cell/Intrepid2_CellToolsDefParametrization.hpp b/packages/intrepid2/src/Cell/Intrepid2_CellToolsDefParametrization.hpp index 8329186f2ab8..97a01eaa40de 100644 --- a/packages/intrepid2/src/Cell/Intrepid2_CellToolsDefParametrization.hpp +++ b/packages/intrepid2/src/Cell/Intrepid2_CellToolsDefParametrization.hpp @@ -67,6 +67,9 @@ namespace Intrepid2 { void CellTools:: setSubcellParametrization() { + if(isSubcellParametrizationSet_) + return; + { const auto tet = shards::CellTopology(shards::getCellTopologyData >()); setSubcellParametrization( subcellParamData_.tetFaces, 2, tet ); @@ -119,7 +122,7 @@ namespace Intrepid2 { subcellParamData_.wedgeFaces = subcellParamViewType(); }); - isReferenceNodeDataSet_ = true; + isSubcellParametrizationSet_= true; } // template diff --git a/packages/intrepid2/src/Cell/Intrepid2_CellToolsDefRefToPhys.hpp b/packages/intrepid2/src/Cell/Intrepid2_CellToolsDefRefToPhys.hpp index 40754d9ff059..9765446620f5 100644 --- a/packages/intrepid2/src/Cell/Intrepid2_CellToolsDefRefToPhys.hpp +++ b/packages/intrepid2/src/Cell/Intrepid2_CellToolsDefRefToPhys.hpp @@ -223,20 +223,39 @@ namespace Intrepid2 { ">>> ERROR (Intrepid2::CellTools::mapToReferenceSubcell): refSubcellPoints dimension (0) does not match to paramPoints dimension(0)."); #endif + if(!isSubcellParametrizationSet_) + setSubcellParametrization(); - const ordinal_type cellDim = parentCell.getDimension(); - const ordinal_type numPts = paramPoints.extent(0); + INTREPID2_TEST_FOR_EXCEPTION( subcellDim != 1 && + subcellDim != 2, std::invalid_argument, + ">>> ERROR (Intrepid2::CellTools::mapToReferenceSubcell): method defined only for 1 and 2-subcells"); - // Get the subcell map, i.e., the coefficients of the parametrization function for the subcell - // can i get this map from devices ? + // Get the subcell map, i.e., the coefficients of the parametrization function for the subcell subcellParamViewType subcellMap; getSubcellParametrization( subcellMap, subcellDim, parentCell ); - // subcell parameterization should be small computation (numPts is small) and it should be decorated with - // kokkos inline... let's not do this yet + // Apply the parametrization map to every point in parameter domain + mapToReferenceSubcell( refSubcellPoints, paramPoints, subcellMap, subcellDim, subcellOrd, parentCell.getDimension()); + } + + + template + template + void + KOKKOS_INLINE_FUNCTION + CellTools:: + mapToReferenceSubcell( Kokkos::DynRankView refSubcellPoints, + const Kokkos::DynRankView paramPoints, + const subcellParamViewType subcellMap, + const ordinal_type subcellDim, + const ordinal_type subcellOrd, + const ordinal_type parentCellDim ) { + + const ordinal_type numPts = paramPoints.extent(0); // Apply the parametrization map to every point in parameter domain switch (subcellDim) { @@ -246,7 +265,7 @@ namespace Intrepid2 { const auto v = paramPoints(pt, 1); // map_dim(u,v) = c_0(dim) + c_1(dim)*u + c_2(dim)*v because both Quad and Tri ref faces are affine! - for (ordinal_type i=0;i>> ERROR (Intrepid2::CellTools::mapToReferenceSubcell): method defined only for 1 and 2-subcells"); - } + default: {} } } } diff --git a/packages/intrepid2/src/Discretization/Basis/Intrepid2_DerivedBasis_HCURL_HEX.hpp b/packages/intrepid2/src/Discretization/Basis/Intrepid2_DerivedBasis_HCURL_HEX.hpp index d014ee3d49a9..a43cd9ba706d 100644 --- a/packages/intrepid2/src/Discretization/Basis/Intrepid2_DerivedBasis_HCURL_HEX.hpp +++ b/packages/intrepid2/src/Discretization/Basis/Intrepid2_DerivedBasis_HCURL_HEX.hpp @@ -424,7 +424,7 @@ namespace Intrepid2 /** \brief True if orientation is required */ virtual bool requireOrientation() const { - return true; + return (this->getDofCount(1,0) > 0); //if it has edge DOFs, than it needs orientations } }; } // end namespace Intrepid2 diff --git a/packages/intrepid2/src/Discretization/Basis/Intrepid2_DerivedBasis_HCURL_QUAD.hpp b/packages/intrepid2/src/Discretization/Basis/Intrepid2_DerivedBasis_HCURL_QUAD.hpp index 1c987643c513..c4baef109b8e 100644 --- a/packages/intrepid2/src/Discretization/Basis/Intrepid2_DerivedBasis_HCURL_QUAD.hpp +++ b/packages/intrepid2/src/Discretization/Basis/Intrepid2_DerivedBasis_HCURL_QUAD.hpp @@ -257,7 +257,7 @@ namespace Intrepid2 /** \brief True if orientation is required */ virtual bool requireOrientation() const { - return true; + return (this->getDofCount(1,0) > 0); //if it has edge DOFs, than it needs orientations } }; diff --git a/packages/intrepid2/src/Discretization/Basis/Intrepid2_DerivedBasis_HDIV_HEX.hpp b/packages/intrepid2/src/Discretization/Basis/Intrepid2_DerivedBasis_HDIV_HEX.hpp index f2c9d6dad54f..91720bf11dab 100644 --- a/packages/intrepid2/src/Discretization/Basis/Intrepid2_DerivedBasis_HDIV_HEX.hpp +++ b/packages/intrepid2/src/Discretization/Basis/Intrepid2_DerivedBasis_HDIV_HEX.hpp @@ -290,7 +290,7 @@ namespace Intrepid2 op3 = Intrepid2::OPERATOR_VALUE; // family 3 goes in the z component; 0 in the x and y components - auto outputValuesComponent_xy = Kokkos::subview(outputValues,Kokkos::ALL(),Kokkos::ALL(),std::make_pair(0,1)); + auto outputValuesComponent_xy = Kokkos::subview(outputValues,Kokkos::ALL(),Kokkos::ALL(),std::make_pair(0,2)); auto outputValuesComponent_z = Kokkos::subview(outputValues,Kokkos::ALL(),Kokkos::ALL(),2); // 0 in x and y components @@ -388,7 +388,7 @@ namespace Intrepid2 /** \brief True if orientation is required */ virtual bool requireOrientation() const { - return true; + return (this->getDofCount(2,0) > 0); //if it has side DOFs, than it needs orientations } }; } // end namespace Intrepid2 diff --git a/packages/intrepid2/src/Discretization/Basis/Intrepid2_DerivedBasis_HDIV_QUAD.hpp b/packages/intrepid2/src/Discretization/Basis/Intrepid2_DerivedBasis_HDIV_QUAD.hpp index f1c26926f363..571c36b940ed 100644 --- a/packages/intrepid2/src/Discretization/Basis/Intrepid2_DerivedBasis_HDIV_QUAD.hpp +++ b/packages/intrepid2/src/Discretization/Basis/Intrepid2_DerivedBasis_HDIV_QUAD.hpp @@ -251,7 +251,7 @@ namespace Intrepid2 /** \brief True if orientation is required */ virtual bool requireOrientation() const { - return true; + return (this->getDofCount(1,0) > 0); //if it has side DOFs, than it needs orientations } }; } // end namespace Intrepid2 diff --git a/packages/intrepid2/src/Discretization/Basis/Intrepid2_DerivedBasis_HGRAD_HEX.hpp b/packages/intrepid2/src/Discretization/Basis/Intrepid2_DerivedBasis_HGRAD_HEX.hpp index b8027656fa83..601ac5f17b4e 100644 --- a/packages/intrepid2/src/Discretization/Basis/Intrepid2_DerivedBasis_HGRAD_HEX.hpp +++ b/packages/intrepid2/src/Discretization/Basis/Intrepid2_DerivedBasis_HGRAD_HEX.hpp @@ -113,7 +113,7 @@ namespace Intrepid2 /** \brief True if orientation is required */ virtual bool requireOrientation() const override { - return (this->getDegree() > 2); + return (this->getDofCount(1,0) > 1); //if it has more than 1 DOF per edge, than it needs orientations } using Basis::getValues; diff --git a/packages/intrepid2/src/Discretization/Basis/Intrepid2_DerivedBasis_HGRAD_QUAD.hpp b/packages/intrepid2/src/Discretization/Basis/Intrepid2_DerivedBasis_HGRAD_QUAD.hpp index c79f66bcb88e..0ed945b8a2aa 100644 --- a/packages/intrepid2/src/Discretization/Basis/Intrepid2_DerivedBasis_HGRAD_QUAD.hpp +++ b/packages/intrepid2/src/Discretization/Basis/Intrepid2_DerivedBasis_HGRAD_QUAD.hpp @@ -101,7 +101,7 @@ namespace Intrepid2 /** \brief True if orientation is required */ virtual bool requireOrientation() const override { - return (this->getDegree() > 2); + return (this->getDofCount(1,0) > 1); //if it has more than 1 DOF per edge, than it needs orientations } using Basis::getValues; diff --git a/packages/intrepid2/src/Discretization/Basis/Intrepid2_DerivedBasis_HVOL_HEX.hpp b/packages/intrepid2/src/Discretization/Basis/Intrepid2_DerivedBasis_HVOL_HEX.hpp index ec9224f91782..4cab3668f837 100644 --- a/packages/intrepid2/src/Discretization/Basis/Intrepid2_DerivedBasis_HVOL_HEX.hpp +++ b/packages/intrepid2/src/Discretization/Basis/Intrepid2_DerivedBasis_HVOL_HEX.hpp @@ -70,6 +70,10 @@ namespace Intrepid2 // TODO: make this a subclass of TensorBasis3 instead, following what we've done for H(curl) and H(div) { public: + using ExecutionSpace = typename HVOL_LINE::ExecutionSpace; + using OutputValueType = typename HVOL_LINE::OutputValueType; + using PointValueType = typename HVOL_LINE::PointValueType; + using OutputViewType = typename HVOL_LINE::OutputViewType; using PointViewType = typename HVOL_LINE::PointViewType ; using ScalarViewType = typename HVOL_LINE::ScalarViewType; @@ -77,7 +81,7 @@ namespace Intrepid2 using LineBasis = HVOL_LINE; using QuadBasis = Intrepid2::Basis_Derived_HVOL_QUAD; using TensorBasis = Basis_TensorBasis; - public: + /** \brief Constructor. \param [in] polyOrder_x - the polynomial order in the x dimension. \param [in] polyOrder_y - the polynomial order in the y dimension. @@ -96,6 +100,22 @@ namespace Intrepid2 */ Basis_Derived_HVOL_HEX(int polyOrder) : Basis_Derived_HVOL_HEX(polyOrder, polyOrder, polyOrder) {} + /** \brief Returns basis name + + \return the name of the basis + */ + virtual + const char* + getName() const { + return "Intrepid2_DerivedBasis_HVOL_HEX"; + } + + /** \brief True if orientation is required + */ + virtual bool requireOrientation() const { + return false; + } + using TensorBasis::getValues; /** \brief multi-component getValues() method (required/called by TensorBasis) diff --git a/packages/intrepid2/src/Discretization/Basis/Intrepid2_DerivedBasis_HVOL_QUAD.hpp b/packages/intrepid2/src/Discretization/Basis/Intrepid2_DerivedBasis_HVOL_QUAD.hpp index d5af42d33ee5..4d3752b7e9d7 100644 --- a/packages/intrepid2/src/Discretization/Basis/Intrepid2_DerivedBasis_HVOL_QUAD.hpp +++ b/packages/intrepid2/src/Discretization/Basis/Intrepid2_DerivedBasis_HVOL_QUAD.hpp @@ -66,13 +66,19 @@ namespace Intrepid2 : public Basis_TensorBasis { + using LineBasis = HVOL_LINE; + using TensorBasis = Basis_TensorBasis; + + public: + + using ExecutionSpace = typename HVOL_LINE::ExecutionSpace; + using OutputValueType = typename HVOL_LINE::OutputValueType; + using PointValueType = typename HVOL_LINE::PointValueType; + using OutputViewType = typename HVOL_LINE::OutputViewType; using PointViewType = typename HVOL_LINE::PointViewType ; using ScalarViewType = typename HVOL_LINE::ScalarViewType; - using LineBasis = HVOL_LINE; - using TensorBasis = Basis_TensorBasis; - public: /** \brief Constructor. \param [in] polyOrder_x - the polynomial order in the x dimension. \param [in] polyOrder_y - the polynomial order in the y dimension. @@ -90,6 +96,22 @@ namespace Intrepid2 */ Basis_Derived_HVOL_QUAD(int polyOrder) : Basis_Derived_HVOL_QUAD(polyOrder,polyOrder) {} + /** \brief Returns basis name + + \return the name of the basis + */ + virtual + const char* + getName() const { + return "Intrepid2_DerivedBasis_HVOL_QUAD"; + } + + /** \brief True if orientation is required + */ + virtual bool requireOrientation() const { + return false; + } + using TensorBasis::getValues; /** \brief multi-component getValues() method (required/called by TensorBasis) diff --git a/packages/intrepid2/src/Discretization/Basis/Intrepid2_IntegratedLegendreBasis_HGRAD_LINE.hpp b/packages/intrepid2/src/Discretization/Basis/Intrepid2_IntegratedLegendreBasis_HGRAD_LINE.hpp index 2e9f68f4304f..0f89c0359a05 100644 --- a/packages/intrepid2/src/Discretization/Basis/Intrepid2_IntegratedLegendreBasis_HGRAD_LINE.hpp +++ b/packages/intrepid2/src/Discretization/Basis/Intrepid2_IntegratedLegendreBasis_HGRAD_LINE.hpp @@ -338,6 +338,20 @@ namespace Intrepid2 } } + /** \brief Returns basis name + + \return the name of the basis + */ + const char* getName() const override { + return "Intrepid2_IntegratedLegendreBasis_HGRAD_LINE"; + } + + /** \brief True if orientation is required + */ + virtual bool requireOrientation() const override { + return false; + } + // since the getValues() below only overrides the FEM variant, we specify that // we use the base class's getValues(), which implements the FVD variant by throwing an exception. // (It's an error to use the FVD variant on this basis.) diff --git a/packages/intrepid2/src/Discretization/Basis/Intrepid2_IntegratedLegendreBasis_HGRAD_TET.hpp b/packages/intrepid2/src/Discretization/Basis/Intrepid2_IntegratedLegendreBasis_HGRAD_TET.hpp index 255c587ada40..5a0cb823815b 100644 --- a/packages/intrepid2/src/Discretization/Basis/Intrepid2_IntegratedLegendreBasis_HGRAD_TET.hpp +++ b/packages/intrepid2/src/Discretization/Basis/Intrepid2_IntegratedLegendreBasis_HGRAD_TET.hpp @@ -68,13 +68,13 @@ namespace Intrepid2 class OutputFieldType, class InputPointsType> struct Hierarchical_HGRAD_TET_Functor { - using ScratchSpace = Kokkos::DefaultExecutionSpace::scratch_memory_space; + using ScratchSpace = typename ExecutionSpace::scratch_memory_space; using OutputScratchView = Kokkos::View>; using OutputScratchView2D = Kokkos::View>; using PointScratchView = Kokkos::View>; - using TeamPolicy = Kokkos::TeamPolicy<>; - using TeamMember = TeamPolicy::member_type; + using TeamPolicy = Kokkos::TeamPolicy; + using TeamMember = typename TeamPolicy::member_type; EOperator opType_; @@ -810,6 +810,12 @@ namespace Intrepid2 return "Intrepid2_IntegratedLegendreBasis_HGRAD_TET"; } + /** \brief True if orientation is required + */ + virtual bool requireOrientation() const override { + return (this->getDegree() > 2); + } + // since the getValues() below only overrides the FEM variant, we specify that // we use the base class's getValues(), which implements the FVD variant by throwing an exception. // (It's an error to use the FVD variant on this basis.) diff --git a/packages/intrepid2/src/Discretization/Basis/Intrepid2_IntegratedLegendreBasis_HGRAD_TRI.hpp b/packages/intrepid2/src/Discretization/Basis/Intrepid2_IntegratedLegendreBasis_HGRAD_TRI.hpp index a6923ce624d7..1f6aee61f4d2 100644 --- a/packages/intrepid2/src/Discretization/Basis/Intrepid2_IntegratedLegendreBasis_HGRAD_TRI.hpp +++ b/packages/intrepid2/src/Discretization/Basis/Intrepid2_IntegratedLegendreBasis_HGRAD_TRI.hpp @@ -68,12 +68,12 @@ namespace Intrepid2 class OutputFieldType, class InputPointsType> struct Hierarchical_HGRAD_TRI_Functor { - using ScratchSpace = Kokkos::DefaultExecutionSpace::scratch_memory_space; + using ScratchSpace = typename ExecutionSpace::scratch_memory_space; using OutputScratchView = Kokkos::View>; using PointScratchView = Kokkos::View>; - using TeamPolicy = Kokkos::TeamPolicy<>; - using TeamMember = TeamPolicy::member_type; + using TeamPolicy = Kokkos::TeamPolicy; + using TeamMember = typename TeamPolicy::member_type; EOperator opType_; @@ -522,6 +522,12 @@ namespace Intrepid2 return "Intrepid2_IntegratedLegendreBasis_HGRAD_TRI"; } + /** \brief True if orientation is required + */ + virtual bool requireOrientation() const override { + return (this->getDegree() > 2); + } + // since the getValues() below only overrides the FEM variant, we specify that // we use the base class's getValues(), which implements the FVD variant by throwing an exception. // (It's an error to use the FVD variant on this basis.) diff --git a/packages/intrepid2/src/Discretization/Basis/Intrepid2_NodalBasisFamily.hpp b/packages/intrepid2/src/Discretization/Basis/Intrepid2_NodalBasisFamily.hpp index d12ce335641a..780e29ca8afa 100644 --- a/packages/intrepid2/src/Discretization/Basis/Intrepid2_NodalBasisFamily.hpp +++ b/packages/intrepid2/src/Discretization/Basis/Intrepid2_NodalBasisFamily.hpp @@ -42,7 +42,7 @@ // @HEADER /** \file Intrepid2_NodalBasisFamily.hpp - \brief Stateless class that acts as a factory for two families of nodal bases (hypercube topologies only at this point). DerivedNodalBasisFamilyModified should match existing high-order bases in Intrepid2, while NodalBasisFamily is templated on H(vol) and H(grad) bases in a way that is more consistent with the literature and the hierarchical basis family in Intrepid2. Once we support all standard topologies, we expect to replace the existing high-order nodal basis implementations in Intrepid2 with those from DerivedNodalBasisFamily. + \brief Stateless class that acts as a factory for a family of nodal bases (hypercube topologies only at this point). NodalBasisFamily is templated on H(vol) and H(grad) bases in a way that is more consistent with the literature and the hierarchical basis family in Intrepid2. Once we support all standard topologies, we expect to replace the existing high-order nodal basis implementations in Intrepid2 with those from DerivedNodalBasisFamily. \author Created by N.V. Roberts. */ @@ -141,49 +141,6 @@ namespace Intrepid2 { using HVOL_TET = Basis_HVOL_TET_Cn_FEM; }; - - /** \class Intrepid2::DerivedBasisFamilyModified - \brief A family of nodal basis functions that should match, modulo basis numbering, the Lagrangian basis family that Intrepid2 has historically supported. - - For compatibility with the bases in NodalBasisFamily, in this basis H(div) and H(curl) are defined in terms of HGRAD(n) x HGRAD(n-1), etc., instead of HGRAD x HVOL. - - These bases should match those in NodalBasisFamily, modulo basis numbering (which should be resolvable via getDofCoords()). - - At present, only hypercube topologies (line, quadrilateral, hexahedron) are supported, but other topologies will be supported in the future. - */ - template - class DerivedBasisFamilyModified - { - public: - using ExecutionSpace = typename LineBasisHGRAD::ExecutionSpace; - using OutputValueType = typename LineBasisHGRAD::OutputValueType; - using PointValueType = typename LineBasisHGRAD::PointValueType; - - using BasisType = Basis; - using BasisPtr = Teuchos::RCP; - - // line bases - using HGRAD_LINE = LineBasisHGRAD; - using HVOL_LINE = LineBasisHVOL; - - // quadrilateral bases - using HGRAD_QUAD = Basis_Derived_HGRAD_QUAD; - using HCURL_QUAD = Basis_Derived_HCURL_QUAD; - using HDIV_QUAD = Basis_Derived_HDIV_QUAD ; - using HVOL_QUAD = Basis_Derived_HVOL_QUAD ; - - // hexahedron bases - using HGRAD_HEX = Basis_Derived_HGRAD_HEX; - using HCURL_HEX = Basis_Derived_HCURL_HEX; - using HDIV_HEX = Basis_Derived_HDIV_HEX ; - using HVOL_HEX = Basis_Derived_HVOL_HEX ; - }; - - template - using DerivedNodalBasisFamilyModified = DerivedBasisFamilyModified< Basis_HGRAD_LINE_Cn_FEM, - Basis_HVOL_LINE_Cn_FEM >; } #endif /* Intrepid2_NodalBasisFamily_h */ diff --git a/packages/intrepid2/src/Discretization/Basis/Intrepid2_TensorBasis.hpp b/packages/intrepid2/src/Discretization/Basis/Intrepid2_TensorBasis.hpp index f19c03ceacc8..beeed4b6b5a6 100644 --- a/packages/intrepid2/src/Discretization/Basis/Intrepid2_TensorBasis.hpp +++ b/packages/intrepid2/src/Discretization/Basis/Intrepid2_TensorBasis.hpp @@ -929,7 +929,7 @@ namespace Intrepid2 if (!tensorPoints_) { - if ((input1_.rank() == 2) && (input2_.rank() == 2)) + if ((input1_.rank() == 2) && (input2_.rank() == 2) && (input3_.rank() == 2)) { Kokkos::parallel_for(Kokkos::TeamThreadRange(teamMember,0,numFields2_), [&] (const int& fieldOrdinal2) { for (int fieldOrdinal3=0; fieldOrdinal3 < numFields3_; fieldOrdinal3++) @@ -970,7 +970,7 @@ namespace Intrepid2 { for (int d=0; d::HGRAD_QUAD*>(basis)) { typename NodalBasisFamily::HGRAD_QUAD hostBasis(order); init_HGRAD_QUAD(matData, &hostBasis); - } else if(dynamic_cast::HGRAD_QUAD*>(basis)) { - typename DerivedNodalBasisFamilyModified::HGRAD_QUAD hostBasis(order); + } else if(dynamic_cast::HGRAD_QUAD*>(basis)) { + typename DerivedNodalBasisFamily::HGRAD_QUAD hostBasis(order); init_HGRAD_QUAD(matData, &hostBasis); } else if(dynamic_cast::HGRAD_QUAD*>(basis)) { typename HierarchicalBasisFamily::HGRAD_QUAD hostBasis(order); @@ -116,8 +116,8 @@ namespace Intrepid2 { if(dynamic_cast::HGRAD_HEX*>(basis)) { typename NodalBasisFamily::HGRAD_HEX hostBasis(order); init_HGRAD_HEX(matData, &hostBasis); - } else if(dynamic_cast::HGRAD_HEX*>(basis)) { - typename DerivedNodalBasisFamilyModified::HGRAD_HEX hostBasis(order); + } else if(dynamic_cast::HGRAD_HEX*>(basis)) { + typename DerivedNodalBasisFamily::HGRAD_HEX hostBasis(order); init_HGRAD_HEX(matData, &hostBasis); } else if(dynamic_cast::HGRAD_HEX*>(basis)) { typename HierarchicalBasisFamily::HGRAD_HEX hostBasis(order); @@ -180,8 +180,8 @@ namespace Intrepid2 { } else if(dynamic_cast::HCURL_QUAD*>(basis)) { typename NodalBasisFamily::HCURL_QUAD hostBasis(order); init_HCURL_QUAD(matData, &hostBasis); - } else if(dynamic_cast::HCURL_QUAD*>(basis)) { - typename DerivedNodalBasisFamilyModified::HCURL_QUAD hostBasis(order); + } else if(dynamic_cast::HCURL_QUAD*>(basis)) { + typename DerivedNodalBasisFamily::HCURL_QUAD hostBasis(order); init_HCURL_QUAD(matData, &hostBasis); } else if(dynamic_cast::HCURL_QUAD*>(basis)) { typename HierarchicalBasisFamily::HCURL_QUAD hostBasis(order); @@ -204,8 +204,8 @@ namespace Intrepid2 { } else if(dynamic_cast::HCURL_HEX*>(basis)) { typename NodalBasisFamily::HCURL_HEX hostBasis(order); init_HCURL_HEX(matData, &hostBasis); - } else if(dynamic_cast::HCURL_HEX*>(basis)) { - typename DerivedNodalBasisFamilyModified::HCURL_HEX hostBasis(order); + } else if(dynamic_cast::HCURL_HEX*>(basis)) { + typename DerivedNodalBasisFamily::HCURL_HEX hostBasis(order); init_HCURL_HEX(matData, &hostBasis); } else if(dynamic_cast::HCURL_HEX*>(basis)) { typename HierarchicalBasisFamily::HCURL_HEX hostBasis(order); @@ -267,8 +267,8 @@ namespace Intrepid2 { } else if(dynamic_cast::HDIV_QUAD*>(basis)) { typename NodalBasisFamily::HDIV_QUAD hostBasis(order); init_HDIV_QUAD(matData, &hostBasis); - } else if(dynamic_cast::HDIV_QUAD*>(basis)) { - typename DerivedNodalBasisFamilyModified::HDIV_QUAD hostBasis(order); + } else if(dynamic_cast::HDIV_QUAD*>(basis)) { + typename DerivedNodalBasisFamily::HDIV_QUAD hostBasis(order); init_HDIV_QUAD(matData, &hostBasis); } else if(dynamic_cast::HDIV_QUAD*>(basis)) { typename HierarchicalBasisFamily::HDIV_QUAD hostBasis(order); @@ -290,8 +290,8 @@ namespace Intrepid2 { } else if(dynamic_cast::HDIV_HEX*>(basis)) { typename NodalBasisFamily::HDIV_HEX hostBasis(order); init_HDIV_HEX(matData, &hostBasis); - } else if(dynamic_cast::HDIV_HEX*>(basis)) { - typename DerivedNodalBasisFamilyModified::HDIV_HEX hostBasis(order); + } else if(dynamic_cast::HDIV_HEX*>(basis)) { + typename DerivedNodalBasisFamily::HDIV_HEX hostBasis(order); init_HDIV_HEX(matData, &hostBasis); } else if(dynamic_cast::HDIV_HEX*>(basis)) { typename HierarchicalBasisFamily::HDIV_HEX hostBasis(order); diff --git a/packages/intrepid2/src/Projection/Intrepid2_LagrangianInterpolationDef.hpp b/packages/intrepid2/src/Projection/Intrepid2_LagrangianInterpolationDef.hpp index df0387ac8467..7c9c7f903cef 100644 --- a/packages/intrepid2/src/Projection/Intrepid2_LagrangianInterpolationDef.hpp +++ b/packages/intrepid2/src/Projection/Intrepid2_LagrangianInterpolationDef.hpp @@ -345,8 +345,7 @@ LagrangianInterpolation::getDofCoordsAndCoeffs( "method not implemented for this basis function"); } - auto tagToOrdinal = Kokkos::create_mirror_view(typename SpT::memory_space(), basis->getAllDofOrdinal()); - Kokkos::deep_copy(tagToOrdinal, basis->getAllDofOrdinal()); + auto tagToOrdinal = Kokkos::create_mirror_view_and_copy(typename SpT::memory_space(), basis->getAllDofOrdinal()); const ordinal_type dim = topo.getDimension(); diff --git a/packages/intrepid2/src/Projection/Intrepid2_ProjectionStruct.hpp b/packages/intrepid2/src/Projection/Intrepid2_ProjectionStruct.hpp index c49dbbaa9772..9f2991007d2e 100644 --- a/packages/intrepid2/src/Projection/Intrepid2_ProjectionStruct.hpp +++ b/packages/intrepid2/src/Projection/Intrepid2_ProjectionStruct.hpp @@ -76,16 +76,30 @@ namespace Experimental { The created class is then used with the Projection Tools. See ProjectionTools class for more info. */ + +ordinal_type +KOKKOS_INLINE_FUNCTION +range_size(const Kokkos::pair& range) { + return range.second - range.first; +} + template class ProjectionStruct { public: + enum EvalPointsType {BASIS, TARGET}; + typedef Kokkos::pair range_type; typedef typename Kokkos::Impl::is_space::host_mirror_space::execution_space host_space_type; typedef Kokkos::DynRankView view_type; - typedef std::array,4> range_tag; - typedef std::array,4> view_tag; - typedef std::array,4> key_tag; + typedef Kokkos::View range_tag; + static constexpr int numberSubCellDims = 4; //{0 for vertex, 1 for edges, 2 for faces, 3 for volumes} + //max of numVertices, numEdges, numFaces for a reference cell. + //12 is the number of edges in a Hexahderon. + //We'll need to change this if we consider generic polyhedra + static constexpr int maxSubCellsCount = 12; + typedef std::array, numberSubCellDims> view_tag; + typedef Kokkos::View key_tag; /** \brief Returns number of basis evaluation points */ @@ -111,44 +125,30 @@ class ProjectionStruct { return numTargetDerivEvalPoints; } - /** \brief Returns number of basis evaluation points on a subcell - \param subCellDim [in] - dimension of the subcell - \param subCellId [in] - ordinal of the subcell defined by cell topology - - \return the number of basis evaluation points on the selected subcell - */ - ordinal_type getNumBasisEvalPoints(const ordinal_type subCellDim, const ordinal_type subCellId) { - return basisCubPoints[subCellDim][subCellId].extent(0); - } - - /** \brief Returns number of evaluation points for basis derivatives on a subcell - \param subCellDim [in] - dimension of the subcell - \param subCellId [in] - ordinal of the subcell defined by cell topology - - \return the number of basis derivatives evaluation points on the selected subcell - */ - ordinal_type getNumBasisDerivEvalPoints(const ordinal_type subCellDim, const ordinal_type subCellId) { - return basisDerivCubPoints[subCellDim][subCellId].extent(0); - } + /** \brief Returns the maximum number of derivative evaluation points across all the subcells + \param evalPointType [in] - enum selecting whether the points should be computed for the basis + functions or for the target function - /** \brief Returns number of points where to evaluate the target function on a subcell - \param subCellDim [in] - dimension of the subcell - \param subCellId [in] - ordinal of the subcell defined by cell topology - - \return the number of target evaluation points on the selected subcell + \return the maximum number of the derivative evaluation points across all the subcells */ - ordinal_type getNumTargetEvalPoints(const ordinal_type subCellDim, const ordinal_type subCellId) { - return targetCubPoints[subCellDim][subCellId].extent(0); + ordinal_type getMaxNumDerivPoints(const EvalPointsType type) const { + if(type == BASIS) + return maxNumBasisDerivEvalPoints; + else + return maxNumTargetDerivEvalPoints; } - /** \brief Returns number of points where to evaluate the derivatives of the target function on a subcell - \param subCellDim [in] - dimension of the subcell - \param subCellId [in] - ordinal of the subcell defined by cell topology + /** \brief Returns the maximum number of evaluation points across all the subcells + \param evalPointType [in] - enum selecting whether the points should be computed for the basis + functions or for the target function - \return the number of target derivatives evaluation points on the selected subcell + \return the maximum number of the evaluation points across all the subcells */ - ordinal_type getNumTargetDerivEvalPoints(const ordinal_type subCellDim, const ordinal_type subCellId) { - return targetDerivCubPoints[subCellDim][subCellId].extent(0); + ordinal_type getMaxNumEvalPoints(const EvalPointsType type) const { + if(type == BASIS) + return maxNumBasisEvalPoints; + else + return maxNumTargetEvalPoints; } /** \brief Returns the basis evaluation points on a subcell @@ -167,6 +167,7 @@ class ProjectionStruct { return basisCubPoints[subCellDim][subCellId]; } + /** \brief Returns the evaluation points for basis derivatives on a subcell \code @@ -174,8 +175,8 @@ class ProjectionStruct { D - spatial dimension \endcode - \param subCellDim [in] - dimension of the subcell - \param subCellId [in] - ordinal of the subcell defined by cell topology + \param subCellDim [in] - dimension of the subcell + \param subCellId [in] - ordinal of the subcell defined by cell topology \return a rank-2 view (P,D) containing the basis derivatives evaluation points on the selected subcell */ @@ -183,6 +184,7 @@ class ProjectionStruct { return basisDerivCubPoints[subCellDim][subCellId]; } + /** \brief Returns the points where to evaluate the target function on a subcell \code @@ -199,6 +201,7 @@ class ProjectionStruct { return targetCubPoints[subCellDim][subCellId]; } + /** \brief Returns the points where to evaluate the derivatives of the target function on a subcell \code @@ -215,6 +218,51 @@ class ProjectionStruct { return targetDerivCubPoints[subCellDim][subCellId]; } + + /** \brief Returns the basis/target evaluation points on a subcell + + \code + P - num. evaluation points + D - spatial dimension + \endcode + + \param subCellDim [in] - dimension of the subcell + \param subCellId [in] - ordinal of the subcell defined by cell topology + \param evalPointType [in] - enum selecting whether the points should be computed for the basis + functions or for the target function + + \return a rank-2 view (P,D) containing the basis/target function evaluation points on the selected subcell + */ + view_type getEvalPoints(const ordinal_type subCellDim, const ordinal_type subCellId, EvalPointsType type) const{ + if(type == BASIS) + return basisCubPoints[subCellDim][subCellId]; + else + return targetCubPoints[subCellDim][subCellId]; + } + + /** \brief Returns the evaluation points for basis/target derivatives on a subcell + + \code + P - num. evaluation points + D - spatial dimension + \endcode + + \param subCellDim [in] - dimension of the subcell + \param subCellId [in] - ordinal of the subcell defined by cell topology + \param evalPointType [in] - enum selecting whether the points should be computed for the basis + functions or for the target function + + \return a rank-2 view (P,D) containing the basis/target derivatives evaluation points on the selected subcell + */ + view_type getDerivEvalPoints(const ordinal_type subCellDim, const ordinal_type subCellId, EvalPointsType type) const{ + if(type == BASIS) + return basisDerivCubPoints[subCellDim][subCellId]; + else + return targetDerivCubPoints[subCellDim][subCellId]; + } + + + /** \brief Returns the basis evaluation weights on a subcell \code @@ -230,6 +278,7 @@ class ProjectionStruct { return basisCubWeights[subCellDim][subCellId]; } + /** \brief Returns the basis derivatives evaluation weights on a subcell \code @@ -245,6 +294,7 @@ class ProjectionStruct { return basisDerivCubWeights[subCellDim][subCellId]; } + /** \brief Returns the function evaluation weights on a subcell \code @@ -260,6 +310,7 @@ class ProjectionStruct { return targetCubWeights[subCellDim][subCellId]; } + /** \brief Returns the function derivatives evaluation weights on a subcell \code @@ -275,56 +326,79 @@ class ProjectionStruct { return targetDerivCubWeights[subCellDim][subCellId]; } - /** \brief Returns the range of the basis evaluation points corresponding to a subcell - \param subCellDim [in] - dimension of the subcell - \param subCellId [in] - ordinal of the subcell defined by cell topology - \return the range of the basis evaluation points corresponding to the selected subcell + /** \brief Returns the range tag of the basis evaluation points subcells + + \return the range tag of the basis evaluation points on subcells */ - range_type getBasisPointsRange(const ordinal_type subCellDim, const ordinal_type subCellId) { - return basisPointsRange[subCellDim][subCellId]; + const range_tag getBasisPointsRange() const { + return basisPointsRange; } - /** \brief Returns the range of the basis derivative evaluation points corresponding to a subcell - \param subCellDim [in] - dimension of the subcell - \param subCellId [in] - ordinal of the subcell defined by cell topology - \return the range of the basis derivative evaluation points corresponding to the selected subcell + /** \brief Returns the range tag of the basis/target evaluation points in subcells + \param evalPointType [in] - enum selecting whether the points should be computed for the basis + functions or for the target function + \return the range tag of the basis/target evaluation points on subcells */ - range_type getBasisDerivPointsRange(const ordinal_type subCellDim, const ordinal_type subCellId) { - return basisDerivPointsRange[subCellDim][subCellId]; + const range_tag getPointsRange(const EvalPointsType type) const { + if(type == BASIS) + return basisPointsRange; + else + return targetPointsRange; } - /** \brief Returns the range of the target function evaluation points corresponding to a subcell - \param subCellDim [in] - dimension of the subcell - \param subCellId [in] - ordinal of the subcell defined by cell topology - \return the range of the target function evaluation points corresponding to the selected subcell + /** \brief Returns the range tag of the derivative evaluation points on subcell + + \return the range tag of the basis derivative evaluation points corresponding on subcell */ - range_type getTargetPointsRange(const ordinal_type subCellDim, const ordinal_type subCellId) { - return targetPointsRange[subCellDim][subCellId]; + const range_tag getBasisDerivPointsRange() const { + return basisDerivPointsRange; } - /** \brief Returns the range of the target function derivative evaluation points corresponding to a subcell - \param subCellDim [in] - dimension of the subcell - \param subCellId [in] - ordinal of the subcell defined by cell topology + /** \brief Returns the range tag of the basis/target derivative evaluation points on subcells + \param evalPointType [in] - enum selecting whether the points should be computed for the basis + functions or for the target function - \return the range of the target function derivative evaluation points corresponding to the selected subcell + \return the range tag of the basis/target derivative evaluation points on subcells */ - range_type getTargetDerivPointsRange(const ordinal_type subCellDim, const ordinal_type subCellId) { - return targetDerivPointsRange[subCellDim][subCellId]; + const range_tag getDerivPointsRange(const EvalPointsType type) const { + if(type == BASIS) + return basisDerivPointsRange; + else + return targetDerivPointsRange; + } + + + /** \brief Returns the range of the target function evaluation points on subcells + + \return the range of the target function evaluation points corresponding on subcells + */ + const range_tag getTargetPointsRange() const { + return targetPointsRange; } - /** \brief Returns the key of a subcell topology - \param subCellDim [in] - dimension of the subcell - \param subCellId [in] - ordinal of the subcell defined by cell topology - \return the key of the selected subcell + /** \brief Returns the range tag of the target function derivative evaluation points on subcells + + \return the range of the target function derivative evaluation points corresponding on subcells */ - unsigned getTopologyKey(const ordinal_type subCellDim, const ordinal_type subCellId) { - return subCellTopologyKey[subCellDim][subCellId]; + const range_tag getTargetDerivPointsRange() const { + return targetDerivPointsRange; } + /** \brief Returns the key tag for subcells + + \return the key tag of the selected subcells + */ + const key_tag getTopologyKey() const { + return subCellTopologyKey; + } + + + + /** \brief Initialize the ProjectionStruct for L2 projections \param cellBasis [in] - basis functions for the projection \param targetCubDegree [in] - degree of the cubature needed to integrate the target function @@ -333,6 +407,7 @@ class ProjectionStruct { void createL2ProjectionStruct(const BasisPtrType cellBasis, const ordinal_type targetCubDegree); + /** \brief Initialize the ProjectionStruct for HGRAD projections \param cellBasis [in] - HGRAD basis functions for the projection \param targetCubDegree [in] - degree of the cubature needed to integrate the target function @@ -343,6 +418,7 @@ class ProjectionStruct { const ordinal_type targetCubDegree, const ordinal_type targetGradCubDegre); + /** \brief Initialize the ProjectionStruct for HCURL projections \param cellBasis [in] - HCURL basis functions for the projection \param targetCubDegree [in] - degree of the cubature needed to integrate the target function @@ -353,6 +429,7 @@ class ProjectionStruct { const ordinal_type targetCubDegree, const ordinal_type targetCurlCubDegre); + /** \brief Initialize the ProjectionStruct for HDIV projections \param cellBasis [in] - HDIV basis functions for the projection \param targetCubDegree [in] - degree of the cubature needed to integrate the target function @@ -388,6 +465,10 @@ class ProjectionStruct { ordinal_type numBasisDerivEvalPoints; ordinal_type numTargetEvalPoints; ordinal_type numTargetDerivEvalPoints; + ordinal_type maxNumBasisEvalPoints; + ordinal_type maxNumTargetEvalPoints; + ordinal_type maxNumBasisDerivEvalPoints; + ordinal_type maxNumTargetDerivEvalPoints; }; } diff --git a/packages/intrepid2/src/Projection/Intrepid2_ProjectionStructDef.hpp b/packages/intrepid2/src/Projection/Intrepid2_ProjectionStructDef.hpp index a2e751e00bb8..25dba9696671 100644 --- a/packages/intrepid2/src/Projection/Intrepid2_ProjectionStructDef.hpp +++ b/packages/intrepid2/src/Projection/Intrepid2_ProjectionStructDef.hpp @@ -83,18 +83,32 @@ void ProjectionStruct::createL2ProjectionStruct(const BasisPtrTyp ordinal_type numFaces = (cellBasis->getDofCount(2, 0) > 0) ? cellTopo.getFaceCount() : 0; ordinal_type numEdges = (cellBasis->getDofCount(1, 0) > 0) ? cellTopo.getEdgeCount() : 0; + ordinal_type hasCellDofs = (cellBasis->getDofCount(dim, 0) > 0); + + INTREPID2_TEST_FOR_ABORT( (numVertices > maxSubCellsCount) || (numFaces > maxSubCellsCount) || (numEdges > maxSubCellsCount), + ">>> ERROR (Intrepid2::ProjectionStruct:createHDivProjectionStruct, Projections do not support a cell topology with this cub cells count"); + + numBasisEvalPoints += numVertices; numTargetEvalPoints += numVertices; - view_type dofCoords("dofCoords", cellBasis->getCardinality(), dim); + view_type coord("vertex_coord", dim); + + basisPointsRange = range_tag("basisPointsRange", 4,maxSubCellsCount); + targetPointsRange = range_tag("targetPointsRange", 4,maxSubCellsCount); + basisDerivPointsRange = range_tag("basisDerivPointsRange", 4,maxSubCellsCount); + targetDerivPointsRange = range_tag("targetDerivPointsRange", numberSubCellDims,maxSubCellsCount); + subCellTopologyKey = key_tag("subCellTopologyKey",numberSubCellDims,maxSubCellsCount); + + maxNumBasisEvalPoints = numVertices; maxNumTargetEvalPoints = numVertices; for(ordinal_type iv=0; ivgetDofOrdinal(0, iv, 0); + CellTools::getReferenceVertex(coord, cellTopo, iv); for(ordinal_type d=0; d::createL2ProjectionStruct(const BasisPtrTyp DefaultCubatureFactory cub_factory; for(ordinal_type ie=0; iegetBaseCellTopology().getKey(edgeDim, ie); + subCellTopologyKey(edgeDim,ie) = cellBasis->getBaseCellTopology().getKey(edgeDim, ie); auto edgeBasisCub = cub_factory.create(cellBasis->getBaseCellTopology().getKey(edgeDim, ie), cub_degree); - basisPointsRange[edgeDim][ie] = range_type(numBasisEvalPoints, numBasisEvalPoints+edgeBasisCub->getNumPoints()); + basisPointsRange(edgeDim,ie) = range_type(numBasisEvalPoints, numBasisEvalPoints+edgeBasisCub->getNumPoints()); numBasisEvalPoints += edgeBasisCub->getNumPoints(); + maxNumBasisEvalPoints = std::max(maxNumBasisEvalPoints, edgeBasisCub->getNumPoints()); basisCubPoints[edgeDim][ie] = view_type("basisCubPoints",edgeBasisCub->getNumPoints(),edgeDim); basisCubWeights[edgeDim][ie] = view_type("basisCubWeights",edgeBasisCub->getNumPoints()); edgeBasisCub->getCubature(basisCubPoints[edgeDim][ie], basisCubWeights[edgeDim][ie]); cub_degree = edgeBasisCubDegree + targetCubDegree; auto edgeTargetCub = cub_factory.create(cellBasis->getBaseCellTopology().getKey(edgeDim, ie), cub_degree); - targetPointsRange[edgeDim][ie] = range_type(numTargetEvalPoints, numTargetEvalPoints+edgeTargetCub->getNumPoints()); + targetPointsRange(edgeDim,ie) = range_type(numTargetEvalPoints, numTargetEvalPoints+edgeTargetCub->getNumPoints()); numTargetEvalPoints += edgeTargetCub->getNumPoints(); + maxNumTargetEvalPoints = std::max(maxNumTargetEvalPoints, edgeTargetCub->getNumPoints()); targetCubPoints[edgeDim][ie] = view_type("targetCubPoints",edgeTargetCub->getNumPoints(),edgeDim); targetCubWeights[edgeDim][ie] = view_type("targetCubWeights",edgeTargetCub->getNumPoints()); edgeTargetCub->getCubature(targetCubPoints[edgeDim][ie], targetCubWeights[edgeDim][ie]); @@ -135,36 +151,40 @@ void ProjectionStruct::createL2ProjectionStruct(const BasisPtrTyp for(ordinal_type iface=0; ifacegetBaseCellTopology().getKey(faceDim, iface); - auto faceBasisCub = cub_factory.create(subCellTopologyKey[faceDim][iface], cub_degree); - basisPointsRange[faceDim][iface] = range_type(numBasisEvalPoints, numBasisEvalPoints+faceBasisCub->getNumPoints()); + subCellTopologyKey(faceDim,iface) = cellBasis->getBaseCellTopology().getKey(faceDim, iface); + auto faceBasisCub = cub_factory.create(subCellTopologyKey(faceDim,iface), cub_degree); + basisPointsRange(faceDim,iface) = range_type(numBasisEvalPoints, numBasisEvalPoints+faceBasisCub->getNumPoints()); numBasisEvalPoints += faceBasisCub->getNumPoints(); + maxNumBasisEvalPoints = std::max(maxNumBasisEvalPoints, faceBasisCub->getNumPoints()); basisCubPoints[faceDim][iface] = view_type("basisCubPoints",faceBasisCub->getNumPoints(),faceDim); basisCubWeights[faceDim][iface] = view_type("basisCubWeights",faceBasisCub->getNumPoints()); faceBasisCub->getCubature(basisCubPoints[faceDim][iface], basisCubWeights[faceDim][iface]); cub_degree = faceBasisCubDegree + targetCubDegree; - auto faceTargetCub = cub_factory.create(subCellTopologyKey[faceDim][iface], cub_degree); - targetPointsRange[faceDim][iface] = range_type(numTargetEvalPoints, numTargetEvalPoints+faceTargetCub->getNumPoints()); + auto faceTargetCub = cub_factory.create(subCellTopologyKey(faceDim,iface), cub_degree); + targetPointsRange(faceDim,iface) = range_type(numTargetEvalPoints, numTargetEvalPoints+faceTargetCub->getNumPoints()); numTargetEvalPoints += faceTargetCub->getNumPoints(); + maxNumTargetEvalPoints = std::max(maxNumTargetEvalPoints, faceTargetCub->getNumPoints()); targetCubPoints[faceDim][iface] = view_type("targetCubPoints",faceTargetCub->getNumPoints(),faceDim); targetCubWeights[faceDim][iface] = view_type("targetCubWeights",faceTargetCub->getNumPoints()); faceTargetCub->getCubature(targetCubPoints[faceDim][iface], targetCubWeights[faceDim][iface]); } - subCellTopologyKey[dim][0] = cellBasis->getBaseCellTopology().getBaseKey(); - if(cellBasis->getDofCount(dim,0)>0) { + subCellTopologyKey(dim,0) = cellBasis->getBaseCellTopology().getBaseKey(); + if(hasCellDofs) { ordinal_type cub_degree = 2*basisCubDegree; - auto elemBasisCub = cub_factory.create(subCellTopologyKey[dim][0], cub_degree); - basisPointsRange[dim][0] = range_type(numBasisEvalPoints, numBasisEvalPoints+elemBasisCub->getNumPoints()); + auto elemBasisCub = cub_factory.create(subCellTopologyKey(dim,0), cub_degree); + basisPointsRange(dim,0) = range_type(numBasisEvalPoints, numBasisEvalPoints+elemBasisCub->getNumPoints()); numBasisEvalPoints += elemBasisCub->getNumPoints(); + maxNumBasisEvalPoints = std::max(maxNumBasisEvalPoints, elemBasisCub->getNumPoints()); basisCubPoints[dim][0] = view_type("basisCubPoints",elemBasisCub->getNumPoints(),dim); basisCubWeights[dim][0] = view_type("basisCubWeights",elemBasisCub->getNumPoints()); elemBasisCub->getCubature(basisCubPoints[dim][0], basisCubWeights[dim][0]); cub_degree = basisCubDegree + targetCubDegree; - auto elemTargetCub = cub_factory.create(subCellTopologyKey[dim][0], cub_degree); - targetPointsRange[dim][0] = range_type(numTargetEvalPoints, numTargetEvalPoints+elemTargetCub->getNumPoints()); + auto elemTargetCub = cub_factory.create(subCellTopologyKey(dim,0), cub_degree); + targetPointsRange(dim,0) = range_type(numTargetEvalPoints, numTargetEvalPoints+elemTargetCub->getNumPoints()); numTargetEvalPoints += elemTargetCub->getNumPoints(); + maxNumTargetEvalPoints = std::max(maxNumTargetEvalPoints, elemTargetCub->getNumPoints()); targetCubPoints[dim][0] = view_type("targetCubPoints",elemTargetCub->getNumPoints(),dim); targetCubWeights[dim][0] = view_type("targetCubWeights",elemTargetCub->getNumPoints()); elemTargetCub->getCubature(targetCubPoints[dim][0], targetCubWeights[dim][0]); @@ -194,36 +214,53 @@ void ProjectionStruct::createHGradProjectionStruct(const BasisPtr ordinal_type numFaces = (cellBasis->getDofCount(2, 0) > 0) ? cellTopo.getFaceCount(): 0; ordinal_type numEdges = (cellBasis->getDofCount(1, 0) > 0) ? cellTopo.getEdgeCount() : 0; + INTREPID2_TEST_FOR_ABORT( (numFaces > maxSubCellsCount) || (numEdges > maxSubCellsCount), + ">>> ERROR (Intrepid2::ProjectionStruct:createHDivProjectionStruct, Projections do not support a cell topology with this cub cells count"); + + + ordinal_type hasCellDofs = (cellBasis->getDofCount(dim, 0) > 0); + + maxNumBasisEvalPoints = numVertices; maxNumTargetEvalPoints = numVertices; + maxNumBasisDerivEvalPoints = 0; maxNumTargetDerivEvalPoints = 0; + + basisPointsRange = range_tag("basisPointsRange", numberSubCellDims,maxSubCellsCount); + targetPointsRange = range_tag("targetPointsRange", numberSubCellDims,maxSubCellsCount); + basisDerivPointsRange = range_tag("basisDerivPointsRange", numberSubCellDims,maxSubCellsCount); + targetDerivPointsRange = range_tag("targetDerivPointsRange", numberSubCellDims,maxSubCellsCount); + subCellTopologyKey = key_tag("subCellTopologyKey",numberSubCellDims,maxSubCellsCount); + numBasisEvalPoints += numVertices; numTargetEvalPoints += numVertices; - view_type dofCoords("dofCoords", cellBasis->getCardinality(), dim); + view_type coord("vertex_coord", dim); for(ordinal_type iv=0; ivgetDofOrdinal(0, iv, 0); + CellTools::getReferenceVertex(coord, cellTopo, iv); for(ordinal_type d=0; dgetBaseCellTopology().getKey(edgeDim, ie); + subCellTopologyKey(edgeDim,ie) = cellBasis->getBaseCellTopology().getKey(edgeDim, ie); auto edgeBasisCub = cub_factory.create(cellBasis->getBaseCellTopology().getKey(edgeDim, ie), cub_degree); - basisDerivPointsRange[edgeDim][ie] = range_type(numBasisDerivEvalPoints, numBasisDerivEvalPoints+edgeBasisCub->getNumPoints()); + basisDerivPointsRange(edgeDim,ie) = range_type(numBasisDerivEvalPoints, numBasisDerivEvalPoints+edgeBasisCub->getNumPoints()); numBasisDerivEvalPoints += edgeBasisCub->getNumPoints(); + maxNumBasisDerivEvalPoints = std::max(maxNumBasisDerivEvalPoints, edgeBasisCub->getNumPoints()); basisDerivCubPoints[edgeDim][ie] = view_type("basisDerivCubPoints",edgeBasisCub->getNumPoints(),edgeDim); basisDerivCubWeights[edgeDim][ie] = view_type("basisDerivCubWeights",edgeBasisCub->getNumPoints()); edgeBasisCub->getCubature(basisDerivCubPoints[edgeDim][ie], basisDerivCubWeights[edgeDim][ie]); cub_degree = edgeBasisCubDegree + targetGradCubDegree; auto edgeTargetCub = cub_factory.create(cellBasis->getBaseCellTopology().getKey(edgeDim, ie), cub_degree); - targetDerivPointsRange[edgeDim][ie] = range_type(numTargetDerivEvalPoints, numTargetDerivEvalPoints+edgeTargetCub->getNumPoints()); + targetDerivPointsRange(edgeDim,ie) = range_type(numTargetDerivEvalPoints, numTargetDerivEvalPoints+edgeTargetCub->getNumPoints()); numTargetDerivEvalPoints += edgeTargetCub->getNumPoints(); + maxNumTargetDerivEvalPoints = std::max(maxNumTargetDerivEvalPoints, edgeTargetCub->getNumPoints()); targetDerivCubPoints[edgeDim][ie] = view_type("targetDerivCubPoints",edgeTargetCub->getNumPoints(),edgeDim); targetDerivCubWeights[edgeDim][ie] = view_type("targetDerivCubWeights",edgeTargetCub->getNumPoints()); edgeTargetCub->getCubature(targetDerivCubPoints[edgeDim][ie], targetDerivCubWeights[edgeDim][ie]); @@ -231,36 +268,40 @@ void ProjectionStruct::createHGradProjectionStruct(const BasisPtr for(ordinal_type iface=0; ifacegetBaseCellTopology().getKey(faceDim, iface); - auto faceBasisGradCub = cub_factory.create(subCellTopologyKey[faceDim][iface], cub_degree); - basisDerivPointsRange[faceDim][iface] = range_type(numBasisDerivEvalPoints, numBasisDerivEvalPoints+faceBasisGradCub->getNumPoints()); + subCellTopologyKey(faceDim,iface) = cellBasis->getBaseCellTopology().getKey(faceDim, iface); + auto faceBasisGradCub = cub_factory.create(subCellTopologyKey(faceDim,iface), cub_degree); + basisDerivPointsRange(faceDim,iface) = range_type(numBasisDerivEvalPoints, numBasisDerivEvalPoints+faceBasisGradCub->getNumPoints()); numBasisDerivEvalPoints += faceBasisGradCub->getNumPoints(); + maxNumBasisDerivEvalPoints = std::max(maxNumBasisDerivEvalPoints, faceBasisGradCub->getNumPoints()); basisDerivCubPoints[faceDim][iface] = view_type("basisDerivCubPoints",faceBasisGradCub->getNumPoints(),faceDim); basisDerivCubWeights[faceDim][iface] = view_type("basisDerivCubWeights",faceBasisGradCub->getNumPoints()); faceBasisGradCub->getCubature(basisDerivCubPoints[faceDim][iface], basisDerivCubWeights[faceDim][iface]); cub_degree = faceBasisCubDegree + targetGradCubDegree; - auto faceTargetDerivCub = cub_factory.create(subCellTopologyKey[faceDim][iface], cub_degree); - targetDerivPointsRange[faceDim][iface] = range_type(numTargetDerivEvalPoints, numTargetDerivEvalPoints+faceTargetDerivCub->getNumPoints()); + auto faceTargetDerivCub = cub_factory.create(subCellTopologyKey(faceDim,iface), cub_degree); + targetDerivPointsRange(faceDim,iface) = range_type(numTargetDerivEvalPoints, numTargetDerivEvalPoints+faceTargetDerivCub->getNumPoints()); numTargetDerivEvalPoints += faceTargetDerivCub->getNumPoints(); + maxNumTargetDerivEvalPoints = std::max(maxNumTargetDerivEvalPoints, faceTargetDerivCub->getNumPoints()); targetDerivCubPoints[faceDim][iface] = view_type("targetDerivCubPoints",faceTargetDerivCub->getNumPoints(),faceDim); targetDerivCubWeights[faceDim][iface] = view_type("targetDerivCubWeights",faceTargetDerivCub->getNumPoints()); faceTargetDerivCub->getCubature(targetDerivCubPoints[faceDim][iface], targetDerivCubWeights[faceDim][iface]); } - subCellTopologyKey[dim][0] = cellBasis->getBaseCellTopology().getBaseKey(); - if(cellBasis->getDofCount(dim,0)>0) { + subCellTopologyKey(dim,0) = cellBasis->getBaseCellTopology().getBaseKey(); + if(hasCellDofs) { ordinal_type cub_degree = 2*basisCubDegree; - auto elemBasisGradCub = cub_factory.create(subCellTopologyKey[dim][0], cub_degree); - basisDerivPointsRange[dim][0] = range_type(numBasisDerivEvalPoints, numBasisDerivEvalPoints+elemBasisGradCub->getNumPoints()); + auto elemBasisGradCub = cub_factory.create(subCellTopologyKey(dim,0), cub_degree); + basisDerivPointsRange(dim,0) = range_type(numBasisDerivEvalPoints, numBasisDerivEvalPoints+elemBasisGradCub->getNumPoints()); numBasisDerivEvalPoints += elemBasisGradCub->getNumPoints(); + maxNumBasisDerivEvalPoints = std::max(maxNumBasisDerivEvalPoints, elemBasisGradCub->getNumPoints()); basisDerivCubPoints[dim][0] = view_type("basisDerivCubPoints",elemBasisGradCub->getNumPoints(),dim); basisDerivCubWeights[dim][0] = view_type("basisDerivCubWeights",elemBasisGradCub->getNumPoints()); elemBasisGradCub->getCubature(basisDerivCubPoints[dim][0], basisDerivCubWeights[dim][0]); cub_degree = basisCubDegree + targetGradCubDegree; - auto elemTargetGradCub = cub_factory.create(subCellTopologyKey[dim][0], cub_degree); - targetDerivPointsRange[dim][0] = range_type(numTargetDerivEvalPoints, numTargetDerivEvalPoints+elemTargetGradCub->getNumPoints()); + auto elemTargetGradCub = cub_factory.create(subCellTopologyKey(dim,0), cub_degree); + targetDerivPointsRange(dim,0) = range_type(numTargetDerivEvalPoints, numTargetDerivEvalPoints+elemTargetGradCub->getNumPoints()); numTargetDerivEvalPoints += elemTargetGradCub->getNumPoints(); + maxNumTargetDerivEvalPoints = std::max(maxNumTargetDerivEvalPoints, elemTargetGradCub->getNumPoints()); targetDerivCubPoints[dim][0] = view_type("targetDerivCubPoints",elemTargetGradCub->getNumPoints(),dim); targetDerivCubWeights[dim][0] = view_type("targetDerivCubWeights",elemTargetGradCub->getNumPoints()); elemTargetGradCub->getCubature(targetDerivCubPoints[dim][0], targetDerivCubWeights[dim][0]); @@ -287,22 +328,34 @@ void ProjectionStruct::createHCurlProjectionStruct(const BasisPtr ordinal_type faceBasisCubDegree = basisCubDegree; ordinal_type numFaces = (cellBasis->getDofCount(2, 0) > 0) ? cellTopo.getFaceCount() : 0; ordinal_type numEdges = (cellBasis->getDofCount(1, 0) > 0) ? cellTopo.getEdgeCount() : 0; + ordinal_type hasCellDofs = (cellBasis->getDofCount(dim, 0) > 0); + + maxNumBasisEvalPoints = 0; maxNumTargetEvalPoints = 0; + maxNumBasisDerivEvalPoints = 0; maxNumTargetDerivEvalPoints = 0; + + basisPointsRange = range_tag("basisPointsRange", numberSubCellDims,maxSubCellsCount); + targetPointsRange = range_tag("targetPointsRange", numberSubCellDims,maxSubCellsCount); + basisDerivPointsRange = range_tag("basisDerivPointsRange", numberSubCellDims,maxSubCellsCount); + targetDerivPointsRange = range_tag("targetDerivPointsRange", numberSubCellDims,maxSubCellsCount); + subCellTopologyKey = key_tag("subCellTopologyKey",numberSubCellDims,maxSubCellsCount); DefaultCubatureFactory cub_factory; for(ordinal_type ie=0; iegetBaseCellTopology().getKey(edgeDim, ie); - auto edgeBasisCub = cub_factory.create(subCellTopologyKey[edgeDim][ie], cub_degree); - basisPointsRange[edgeDim][ie] = range_type(numBasisEvalPoints, numBasisEvalPoints+edgeBasisCub->getNumPoints()); + subCellTopologyKey(edgeDim,ie) = cellBasis->getBaseCellTopology().getKey(edgeDim, ie); + auto edgeBasisCub = cub_factory.create(subCellTopologyKey(edgeDim,ie), cub_degree); + basisPointsRange(edgeDim,ie) = range_type(numBasisEvalPoints, numBasisEvalPoints+edgeBasisCub->getNumPoints()); numBasisEvalPoints += edgeBasisCub->getNumPoints(); + maxNumBasisEvalPoints = std::max(maxNumBasisEvalPoints, edgeBasisCub->getNumPoints()); basisCubPoints[edgeDim][ie] = view_type("basisCubPoints",edgeBasisCub->getNumPoints(),edgeDim); basisCubWeights[edgeDim][ie] = view_type("basisCubWeights",edgeBasisCub->getNumPoints()); edgeBasisCub->getCubature(basisCubPoints[edgeDim][ie], basisCubWeights[edgeDim][ie]); cub_degree = edgeBasisCubDegree + targetCubDegree; - auto edgeTargetCub = cub_factory.create(subCellTopologyKey[edgeDim][ie], cub_degree); - targetPointsRange[edgeDim][ie] = range_type(numTargetEvalPoints, numTargetEvalPoints+edgeTargetCub->getNumPoints()); + auto edgeTargetCub = cub_factory.create(subCellTopologyKey(edgeDim,ie), cub_degree); + targetPointsRange(edgeDim,ie) = range_type(numTargetEvalPoints, numTargetEvalPoints+edgeTargetCub->getNumPoints()); numTargetEvalPoints += edgeTargetCub->getNumPoints(); + maxNumTargetEvalPoints = std::max(maxNumTargetEvalPoints, edgeTargetCub->getNumPoints()); targetCubPoints[edgeDim][ie] = view_type("targetCubPoints",edgeTargetCub->getNumPoints(),edgeDim); targetCubWeights[edgeDim][ie] = view_type("targetCubWeights",edgeTargetCub->getNumPoints()); edgeTargetCub->getCubature(targetCubPoints[edgeDim][ie], targetCubWeights[edgeDim][ie]); @@ -310,70 +363,78 @@ void ProjectionStruct::createHCurlProjectionStruct(const BasisPtr for(ordinal_type iface=0; ifacegetBaseCellTopology().getKey(faceDim, iface); - auto faceBasisCub = cub_factory.create(subCellTopologyKey[faceDim][iface], cub_degree); - basisPointsRange[faceDim][iface] = range_type(numBasisEvalPoints, numBasisEvalPoints+faceBasisCub->getNumPoints()); + subCellTopologyKey(faceDim,iface) = cellBasis->getBaseCellTopology().getKey(faceDim, iface); + auto faceBasisCub = cub_factory.create(subCellTopologyKey(faceDim,iface), cub_degree); + basisPointsRange(faceDim,iface) = range_type(numBasisEvalPoints, numBasisEvalPoints+faceBasisCub->getNumPoints()); numBasisEvalPoints += faceBasisCub->getNumPoints(); + maxNumBasisEvalPoints = std::max(maxNumBasisEvalPoints, faceBasisCub->getNumPoints()); basisCubPoints[faceDim][iface] = view_type("basisCubPoints",faceBasisCub->getNumPoints(),faceDim); basisCubWeights[faceDim][iface] = view_type("basisCubWeights",faceBasisCub->getNumPoints()); faceBasisCub->getCubature(basisCubPoints[faceDim][iface], basisCubWeights[faceDim][iface]); - basisDerivPointsRange[faceDim][iface] = range_type(numBasisDerivEvalPoints, numBasisDerivEvalPoints+faceBasisCub->getNumPoints()); + auto faceBasisDerivCub = cub_factory.create(subCellTopologyKey(faceDim,iface), cub_degree); + basisDerivPointsRange(faceDim,iface) = range_type(numBasisDerivEvalPoints, numBasisDerivEvalPoints+faceBasisCub->getNumPoints()); numBasisDerivEvalPoints += faceBasisCub->getNumPoints(); + maxNumBasisDerivEvalPoints = std::max(maxNumBasisDerivEvalPoints, faceBasisCub->getNumPoints()); basisDerivCubPoints[faceDim][iface] = view_type("basisDerivCubPoints",faceBasisCub->getNumPoints(),faceDim); basisDerivCubWeights[faceDim][iface] = view_type("basisDerivCubWeights",faceBasisCub->getNumPoints()); faceBasisCub->getCubature(basisDerivCubPoints[faceDim][iface], basisDerivCubWeights[faceDim][iface]); cub_degree = faceBasisCubDegree + targetCubDegree; - auto faceTargetCub = cub_factory.create(subCellTopologyKey[faceDim][iface], cub_degree); - targetPointsRange[faceDim][iface] = range_type(numTargetEvalPoints, numTargetEvalPoints+faceTargetCub->getNumPoints()); + auto faceTargetCub = cub_factory.create(subCellTopologyKey(faceDim,iface), cub_degree); + targetPointsRange(faceDim,iface) = range_type(numTargetEvalPoints, numTargetEvalPoints+faceTargetCub->getNumPoints()); numTargetEvalPoints += faceTargetCub->getNumPoints(); + maxNumTargetEvalPoints = std::max(maxNumTargetEvalPoints, faceTargetCub->getNumPoints()); targetCubPoints[faceDim][iface] = view_type("targetCubPoints",faceTargetCub->getNumPoints(),faceDim); targetCubWeights[faceDim][iface] = view_type("targetCubWeights",faceTargetCub->getNumPoints()); faceTargetCub->getCubature(targetCubPoints[faceDim][iface], targetCubWeights[faceDim][iface]); cub_degree = faceBasisCubDegree + targetCurlCubDegre; - auto faceTargetDerivCub = cub_factory.create(subCellTopologyKey[faceDim][iface], cub_degree); - targetDerivPointsRange[faceDim][iface] = range_type(numTargetDerivEvalPoints, numTargetDerivEvalPoints+faceTargetDerivCub->getNumPoints()); + auto faceTargetDerivCub = cub_factory.create(subCellTopologyKey(faceDim,iface), cub_degree); + targetDerivPointsRange(faceDim,iface) = range_type(numTargetDerivEvalPoints, numTargetDerivEvalPoints+faceTargetDerivCub->getNumPoints()); numTargetDerivEvalPoints += faceTargetDerivCub->getNumPoints(); + maxNumTargetDerivEvalPoints = std::max(maxNumTargetDerivEvalPoints, faceTargetDerivCub->getNumPoints()); targetDerivCubPoints[faceDim][iface] = view_type("targetDerivCubPoints",faceTargetDerivCub->getNumPoints(),faceDim); targetDerivCubWeights[faceDim][iface] = view_type("targetDerivCubWeights",faceTargetDerivCub->getNumPoints()); faceTargetDerivCub->getCubature(targetDerivCubPoints[faceDim][iface], targetDerivCubWeights[faceDim][iface]); } - subCellTopologyKey[dim][0] = cellBasis->getBaseCellTopology().getBaseKey(); - if(cellBasis->getDofCount(dim,0)>0) { + subCellTopologyKey(dim,0) = cellBasis->getBaseCellTopology().getBaseKey(); + if(hasCellDofs) { ordinal_type cub_degree = 2*basisCubDegree; - auto elemBasisCub = cub_factory.create(subCellTopologyKey[dim][0], cub_degree); - basisPointsRange[dim][0] = range_type(numBasisEvalPoints, numBasisEvalPoints+elemBasisCub->getNumPoints()); + auto elemBasisCub = cub_factory.create(subCellTopologyKey(dim,0), cub_degree); + basisPointsRange(dim,0) = range_type(numBasisEvalPoints, numBasisEvalPoints+elemBasisCub->getNumPoints()); numBasisEvalPoints += elemBasisCub->getNumPoints(); + maxNumBasisEvalPoints = std::max(maxNumBasisEvalPoints, elemBasisCub->getNumPoints()); basisCubPoints[dim][0] = view_type("basisCubPoints",elemBasisCub->getNumPoints(),dim); basisCubWeights[dim][0] = view_type("basisCubWeights",elemBasisCub->getNumPoints()); elemBasisCub->getCubature(basisCubPoints[dim][0], basisCubWeights[dim][0]); - basisDerivPointsRange[dim][0] = range_type(numBasisDerivEvalPoints, numBasisDerivEvalPoints+elemBasisCub->getNumPoints()); + basisDerivPointsRange(dim,0) = range_type(numBasisDerivEvalPoints, numBasisDerivEvalPoints+elemBasisCub->getNumPoints()); numBasisDerivEvalPoints += elemBasisCub->getNumPoints(); + maxNumBasisDerivEvalPoints = std::max(maxNumBasisDerivEvalPoints, elemBasisCub->getNumPoints()); basisDerivCubPoints[dim][0] = view_type("basisDerivCubPoints",elemBasisCub->getNumPoints(),dim); basisDerivCubWeights[dim][0] = view_type("basisDerivCubWeights",elemBasisCub->getNumPoints()); elemBasisCub->getCubature(basisDerivCubPoints[dim][0], basisDerivCubWeights[dim][0]); cub_degree = basisCubDegree + targetCubDegree; - auto elemTargetCub = cub_factory.create(subCellTopologyKey[dim][0], cub_degree); - targetPointsRange[dim][0] = range_type(numTargetEvalPoints, numTargetEvalPoints+elemTargetCub->getNumPoints()); + auto elemTargetCub = cub_factory.create(subCellTopologyKey(dim,0), cub_degree); + targetPointsRange(dim,0) = range_type(numTargetEvalPoints, numTargetEvalPoints+elemTargetCub->getNumPoints()); numTargetEvalPoints += elemTargetCub->getNumPoints(); + maxNumTargetEvalPoints = std::max(maxNumTargetEvalPoints, elemTargetCub->getNumPoints()); targetCubPoints[dim][0] = view_type("targetCubPoints",elemTargetCub->getNumPoints(),dim); targetCubWeights[dim][0] = view_type("targetCubWeights",elemTargetCub->getNumPoints()); elemTargetCub->getCubature(targetCubPoints[dim][0], targetCubWeights[dim][0]); cub_degree = basisCubDegree + targetCurlCubDegre; - auto elemTargetCurlCub = cub_factory.create(subCellTopologyKey[dim][0], cub_degree); - targetDerivPointsRange[dim][0] = range_type(numTargetDerivEvalPoints, numTargetDerivEvalPoints+elemTargetCurlCub->getNumPoints()); + auto elemTargetCurlCub = cub_factory.create(subCellTopologyKey(dim,0), cub_degree); + targetDerivPointsRange(dim,0) = range_type(numTargetDerivEvalPoints, numTargetDerivEvalPoints+elemTargetCurlCub->getNumPoints()); numTargetDerivEvalPoints += elemTargetCurlCub->getNumPoints(); + maxNumTargetDerivEvalPoints = std::max(maxNumTargetDerivEvalPoints, elemTargetCurlCub->getNumPoints()); targetDerivCubPoints[dim][0] = view_type("targetDerivCubPoints",elemTargetCurlCub->getNumPoints(),dim); targetDerivCubWeights[dim][0] = view_type("targetDerivCubWeights",elemTargetCurlCub->getNumPoints()); elemTargetCurlCub->getCubature(targetDerivCubPoints[dim][0], targetDerivCubWeights[dim][0]); } - } template @@ -393,15 +454,28 @@ void ProjectionStruct::createHDivProjectionStruct(const BasisPtrT ordinal_type basisCubDegree = cellBasis->getDegree(); ordinal_type sideBasisCubDegree = basisCubDegree - 1; ordinal_type numSides = cellTopo.getSideCount()*ordinal_type(cellBasis->getDofCount(sideDim, 0) > 0); + ordinal_type hasCellDofs = (cellBasis->getDofCount(dim, 0) > 0); + + INTREPID2_TEST_FOR_ABORT( numSides > maxSubCellsCount, + ">>> ERROR (Intrepid2::ProjectionStruct:createHDivProjectionStruct, Projections do not support a cell topology with so many sides"); + + maxNumBasisEvalPoints = 0; maxNumTargetEvalPoints = 0; + maxNumBasisDerivEvalPoints = 0; maxNumTargetDerivEvalPoints = 0; + + basisPointsRange = range_tag("basisPointsRange", numberSubCellDims,maxSubCellsCount); + targetPointsRange = range_tag("targetPointsRange", numberSubCellDims,maxSubCellsCount); + basisDerivPointsRange = range_tag("basisDerivPointsRange", numberSubCellDims,maxSubCellsCount); + targetDerivPointsRange = range_tag("targetDerivPointsRange", numberSubCellDims,maxSubCellsCount); + subCellTopologyKey = key_tag("subCellTopologyKey",numberSubCellDims,maxSubCellsCount); Basis *hcurlBasis = NULL; - if(name.find("HEX")!=std::string::npos) + if(cellTopo.getKey() == shards::getCellTopologyData >()->key) hcurlBasis = new Basis_HCURL_HEX_In_FEM(cellBasis->getDegree()); - else if(name.find("TET")!=std::string::npos) + else if(cellTopo.getKey() == shards::getCellTopologyData >()->key) hcurlBasis = new Basis_HCURL_TET_In_FEM(cellBasis->getDegree()); - else if(name.find("QUAD")!=std::string::npos) + else if(cellTopo.getKey() == shards::getCellTopologyData >()->key) hcurlBasis = new Basis_HGRAD_QUAD_Cn_FEM(cellBasis->getDegree()); - else if(name.find("TRI")!=std::string::npos) + else if(cellTopo.getKey() == shards::getCellTopologyData >()->key) hcurlBasis = new Basis_HGRAD_TRI_Cn_FEM(cellBasis->getDegree()); else { std::stringstream ss; @@ -417,58 +491,64 @@ void ProjectionStruct::createHDivProjectionStruct(const BasisPtrT for(ordinal_type is=0; isgetBaseCellTopology().getKey(sideDim, is); - auto sideBasisCub = cub_factory.create(subCellTopologyKey[sideDim][is], cub_degree); - basisPointsRange[sideDim][is] = range_type(numBasisEvalPoints, numBasisEvalPoints+sideBasisCub->getNumPoints()); + subCellTopologyKey(sideDim,is) = cellBasis->getBaseCellTopology().getKey(sideDim, is); + auto sideBasisCub = cub_factory.create(subCellTopologyKey(sideDim,is), cub_degree); + basisPointsRange(sideDim,is) = range_type(numBasisEvalPoints, numBasisEvalPoints+sideBasisCub->getNumPoints()); numBasisEvalPoints += sideBasisCub->getNumPoints(); basisCubPoints[sideDim][is] = view_type("basisCubPoints",sideBasisCub->getNumPoints(),sideDim); basisCubWeights[sideDim][is] = view_type("basisCubWeights",sideBasisCub->getNumPoints()); sideBasisCub->getCubature(basisCubPoints[sideDim][is], basisCubWeights[sideDim][is]); + maxNumBasisEvalPoints = std::max(maxNumBasisEvalPoints, sideBasisCub->getNumPoints()); cub_degree = sideBasisCubDegree + targetCubDegree; - auto sideTargetCub = cub_factory.create(subCellTopologyKey[sideDim][is], cub_degree); - targetPointsRange[sideDim][is] = range_type(numTargetEvalPoints, numTargetEvalPoints+sideTargetCub->getNumPoints()); + auto sideTargetCub = cub_factory.create(subCellTopologyKey(sideDim,is), cub_degree); + targetPointsRange(sideDim,is) = range_type(numTargetEvalPoints, numTargetEvalPoints+sideTargetCub->getNumPoints()); numTargetEvalPoints += sideTargetCub->getNumPoints(); targetCubPoints[sideDim][is] = view_type("targetCubPoints",sideTargetCub->getNumPoints(),sideDim); targetCubWeights[sideDim][is] = view_type("targetCubWeights",sideTargetCub->getNumPoints()); sideTargetCub->getCubature(targetCubPoints[sideDim][is], targetCubWeights[sideDim][is]); + maxNumTargetEvalPoints = std::max(maxNumTargetEvalPoints, sideTargetCub->getNumPoints()); } - subCellTopologyKey[dim][0] = cellBasis->getBaseCellTopology().getBaseKey(); - if(cellBasis->getDofCount(dim,0)>0) { + subCellTopologyKey(dim,0) = cellBasis->getBaseCellTopology().getBaseKey(); + if(hasCellDofs) { ordinal_type cub_degree = 2*basisCubDegree - 1; - auto elemBasisDivCub = cub_factory.create(subCellTopologyKey[dim][0], cub_degree); - basisDerivPointsRange[dim][0] = range_type(numBasisDerivEvalPoints, numBasisDerivEvalPoints+elemBasisDivCub->getNumPoints()); + auto elemBasisDivCub = cub_factory.create(subCellTopologyKey(dim,0), cub_degree); + basisDerivPointsRange(dim,0) = range_type(numBasisDerivEvalPoints, numBasisDerivEvalPoints+elemBasisDivCub->getNumPoints()); numBasisDerivEvalPoints += elemBasisDivCub->getNumPoints(); basisDerivCubPoints[dim][0] = view_type("basisDerivCubPoints",elemBasisDivCub->getNumPoints(),dim); basisDerivCubWeights[dim][0] = view_type("basisDerivCubWeights",elemBasisDivCub->getNumPoints()); elemBasisDivCub->getCubature(basisDerivCubPoints[dim][0], basisDerivCubWeights[dim][0]); + maxNumBasisDerivEvalPoints = std::max(maxNumBasisDerivEvalPoints, elemBasisDivCub->getNumPoints()); cub_degree = basisCubDegree - 1 + targetDivCubDegre; - auto elemTargetDivCub = cub_factory.create(subCellTopologyKey[dim][0], cub_degree); - targetDerivPointsRange[dim][0] = range_type(numTargetDerivEvalPoints, numTargetDerivEvalPoints+elemTargetDivCub->getNumPoints()); + auto elemTargetDivCub = cub_factory.create(subCellTopologyKey(dim,0), cub_degree); + targetDerivPointsRange(dim,0) = range_type(numTargetDerivEvalPoints, numTargetDerivEvalPoints+elemTargetDivCub->getNumPoints()); numTargetDerivEvalPoints += elemTargetDivCub->getNumPoints(); targetDerivCubPoints[dim][0] = view_type("targetDerivCubPoints",elemTargetDivCub->getNumPoints(),dim); targetDerivCubWeights[dim][0] = view_type("targetDerivCubWeights",elemTargetDivCub->getNumPoints()); elemTargetDivCub->getCubature(targetDerivCubPoints[dim][0], targetDerivCubWeights[dim][0]); + maxNumTargetDerivEvalPoints = std::max(maxNumTargetDerivEvalPoints, elemTargetDivCub->getNumPoints()); if(haveHCurlConstraint) { cub_degree = 2*basisCubDegree; - auto elemBasisCub = cub_factory.create(subCellTopologyKey[dim][0], cub_degree); - basisPointsRange[dim][0] = range_type(numBasisEvalPoints, numBasisEvalPoints + elemBasisCub->getNumPoints()); + auto elemBasisCub = cub_factory.create(subCellTopologyKey(dim,0), cub_degree); + basisPointsRange(dim,0) = range_type(numBasisEvalPoints, numBasisEvalPoints + elemBasisCub->getNumPoints()); numBasisEvalPoints += elemBasisCub->getNumPoints(); basisCubPoints[dim][0] = view_type("basisCubPoints",elemBasisCub->getNumPoints(),dim); basisCubWeights[dim][0] = view_type("basisCubWeights",elemBasisCub->getNumPoints()); elemBasisCub->getCubature(basisCubPoints[dim][0], basisCubWeights[dim][0]); + maxNumBasisEvalPoints = std::max(maxNumBasisEvalPoints, elemBasisCub->getNumPoints()); cub_degree = basisCubDegree + targetCubDegree; - auto elemTargetCub = cub_factory.create(subCellTopologyKey[dim][0], cub_degree); - targetPointsRange[dim][0] = range_type(numTargetEvalPoints, numTargetEvalPoints + elemTargetCub->getNumPoints()); + auto elemTargetCub = cub_factory.create(subCellTopologyKey(dim,0), cub_degree); + targetPointsRange(dim,0) = range_type(numTargetEvalPoints, numTargetEvalPoints + elemTargetCub->getNumPoints()); numTargetEvalPoints += elemTargetCub->getNumPoints(); targetCubPoints[dim][0] = view_type("targetCubPoints",elemTargetCub->getNumPoints(),dim); targetCubWeights[dim][0] = view_type("targetCubWeights",elemTargetCub->getNumPoints()); elemTargetCub->getCubature(targetCubPoints[dim][0], targetCubWeights[dim][0]); + maxNumTargetEvalPoints = std::max(maxNumTargetEvalPoints, elemTargetCub->getNumPoints()); } } } @@ -484,23 +564,33 @@ void ProjectionStruct::createHVolProjectionStruct(const BasisPtrT numTargetEvalPoints = 0; numTargetDerivEvalPoints = 0; + basisPointsRange = range_tag("basisPointsRange", 4,maxSubCellsCount); + targetPointsRange = range_tag("targetPointsRange", 4,maxSubCellsCount); + basisDerivPointsRange = range_tag("basisDerivPointsRange", 4,maxSubCellsCount); + targetDerivPointsRange = range_tag("targetDerivPointsRange", 4,maxSubCellsCount); + subCellTopologyKey = key_tag("subCellTopologyKey",4,maxSubCellsCount); + ordinal_type basisCubDegree = cellBasis->getDegree(); DefaultCubatureFactory cub_factory; - subCellTopologyKey[dim][0] = cellBasis->getBaseCellTopology().getBaseKey(); + subCellTopologyKey(dim,0) = cellBasis->getBaseCellTopology().getBaseKey(); + + maxNumBasisEvalPoints = 0; maxNumTargetEvalPoints =0; if(cellBasis->getDofCount(dim,0)>0) { ordinal_type cub_degree = 2*basisCubDegree; auto elemBasisCub = cub_factory.create(cellTopo.getBaseKey(), cub_degree); - basisPointsRange[dim][0] = range_type(0, elemBasisCub->getNumPoints()); + basisPointsRange(dim,0) = range_type(0, elemBasisCub->getNumPoints()); numBasisEvalPoints += elemBasisCub->getNumPoints(); + maxNumBasisEvalPoints = elemBasisCub->getNumPoints(); basisCubPoints[dim][0] = view_type("basisCubPoints",elemBasisCub->getNumPoints(),dim); basisCubWeights[dim][0] = view_type("basisCubWeights",elemBasisCub->getNumPoints()); elemBasisCub->getCubature(basisCubPoints[dim][0], basisCubWeights[dim][0]); cub_degree = basisCubDegree + targetCubDegree; auto elemTargetCub = cub_factory.create(cellTopo.getBaseKey(), cub_degree); - targetPointsRange[dim][0] = range_type(0, elemTargetCub->getNumPoints()); + targetPointsRange(dim,0) = range_type(0, elemTargetCub->getNumPoints()); numTargetEvalPoints += elemTargetCub->getNumPoints(); + maxNumTargetEvalPoints = elemTargetCub->getNumPoints(); targetCubPoints[dim][0] = view_type("targetCubPoints",elemTargetCub->getNumPoints(),dim); targetCubWeights[dim][0] = view_type("targetCubWeights",elemTargetCub->getNumPoints()); elemTargetCub->getCubature(targetCubPoints[dim][0], targetCubWeights[dim][0]); diff --git a/packages/intrepid2/src/Projection/Intrepid2_ProjectionTools.hpp b/packages/intrepid2/src/Projection/Intrepid2_ProjectionTools.hpp index f4aa3831db40..426fbd53e582 100644 --- a/packages/intrepid2/src/Projection/Intrepid2_ProjectionTools.hpp +++ b/packages/intrepid2/src/Projection/Intrepid2_ProjectionTools.hpp @@ -102,7 +102,12 @@ #include "Intrepid2_ProjectionStruct.hpp" - +#ifdef HAVE_INTREPID2_KOKKOSKERNELS +#include "KokkosBatched_QR_Serial_Internal.hpp" +#include "KokkosBatched_ApplyQ_Serial_Internal.hpp" +#include "KokkosBatched_Trsv_Serial_Internal.hpp" +#include "KokkosBatched_Util.hpp" +#endif namespace Intrepid2 { @@ -162,14 +167,23 @@ namespace Experimental { performed on the \f$H^1\f$ seminorm and the \f$L^2\f$ norm respectively, instead of on the \f$L^2\f$ and \f$H^{-1}\f$ and norms. This requires more regularity of the target function. - \todo The implementation is mostly serial and needs to be improved for performance portability + \todo There is room for significant improvement. + One could separate the computation of the basis function values and derivatives from the functions getXXXBasisCoeffs, + so that they can be stored and reused for projecting other target functions. + Similarly one could store all the QR factorizations and reuse them for other target functions. + For internal evaluation points (that are not affected by orientation) one could compute the QR factorization on the reference cell + and then use on all the cells. + + Note: Other algorithmic improvements could be enabled by accessing the implementation of the orientation tools, + however, we preferred the projections to work with any orientation, and assuming only that internal basis functions are not affected by + the orientation. */ template class ProjectionTools { public: - enum EvalPointsType {BASIS, TARGET}; + using EvalPointsType = typename ProjectionStruct::EvalPointsType; /** \brief Computes evaluation points for L2 projection @@ -195,7 +209,7 @@ class ProjectionTools { const Kokkos::DynRankView cellOrientations, const BasisType* cellBasis, ProjectionStruct * projStruct, - const EvalPointsType evalPointType = TARGET + const EvalPointsType evalPointType = EvalPointsType::TARGET ); /** \brief Computes the basis coefficients of the L2 projection of the target function @@ -257,7 +271,7 @@ class ProjectionTools { const Kokkos::DynRankView cellOrientations, const BasisType* cellBasis, ProjectionStruct * projStruct, - const EvalPointsType evalPointType = TARGET + const EvalPointsType evalPointType = EvalPointsType::TARGET ); /** \brief Computes the basis coefficients of the HGrad projection of the target function @@ -325,7 +339,7 @@ class ProjectionTools { const Kokkos::DynRankView cellOrientations, const BasisType* cellBasis, ProjectionStruct * projStruct, - const EvalPointsType evalPointType = TARGET + const EvalPointsType evalPointType = EvalPointsType::TARGET ); /** \brief Computes the basis coefficients of the HCurl projection of the target function @@ -395,7 +409,7 @@ class ProjectionTools { const Kokkos::DynRankView cellOrientations, const BasisType* cellBasis, ProjectionStruct * projStruct, - const EvalPointsType evalPointType = TARGET + const EvalPointsType evalPointType = EvalPointsType::TARGET ); /** \brief Computes the basis coefficients of the HDiv projection of the target function @@ -458,7 +472,7 @@ class ProjectionTools { const Kokkos::DynRankView cellOrientations, const BasisType* cellBasis, ProjectionStruct * projStruct, - const EvalPointsType evalPointType = TARGET + const EvalPointsType evalPointType = EvalPointsType::TARGET ); /** \brief Computes the basis coefficients of the HVol projection of the target function @@ -492,10 +506,277 @@ class ProjectionTools { ProjectionStruct * projStruct); + /** \brief Class to solve a square system A x = b on each cell + A is expected to be saddle a point (KKT) matrix of the form [C B; B^T 0], + where C has size nxn and B nxm, with n>0, m>=0. + B^T is copied from B, so one does not have to define the B^T portion of A. + b will contain the solution x. + The first n-entries of x are copied into the provided basis coefficients using the provided indexing. + The system is solved either with a QR factorization implemented in KokkosKernels or + with Lapack GELS function. + */ + struct ElemSystem { + + + std::string systemName_; + bool matrixIndependentOfCell_; + + /** \brief Functor constructor + \param systemName [in] - string containing the name of the system (passed to parallel for) + \param matrixIndependentOfCell [in] - bool: whether the local cell matrix of the system changes from cell to cell + if true, the matrix factorization is preformed only on the first cell + and reused on other cells. + */ + + ElemSystem (std::string systemName, bool matrixIndependentOfCell) : + systemName_(systemName), matrixIndependentOfCell_(matrixIndependentOfCell){}; + + + + /** \brief Solve the system and returns the basis coefficients + solve the system either using Kokkos Kernel QR or Lapack GELS + depending on whether Kokkos Kernel is enabled. + + \code + C - num. cells + P - num. evaluation points + \endcode + + + \param basisCoeffs [out] - rank-2 view (C,F) containing the basis coefficients + \param elemMat [in/out] - rank-3 view (C,P,P) containing the element matrix of size + numCells x (n+m)x(n+m) on each cell + it will be overwritten. + \param elemRhs [in/out] - rank-2 view (C,P) containing the element rhs on each cell + of size numCells x (n+m) + it will contain the solution of the system on output + \param tau [out] - rank-2 view (C,P) used to store the QR factorization + size: numCells x (n+m) + \param w [out] - rank-2 view (C,P) used has a workspace + Layout Right, size: numCells x (n+m) + \param elemDof [in] - rank-1 view having dimension n, containing the basis numbering + \param n [in] - ordinal_type, basis cardinality + \param m [in] - ordinal_type, dimension of the constraint of the KKT system + */ + template + void solve(ViewType1 basisCoeffs, ViewType2 elemMat, ViewType2 elemRhs, ViewType2 tau, + ViewType3 w,const ViewType4 elemDof, ordinal_type n, ordinal_type m=0) { +#ifdef HAVE_INTREPID2_KOKKOSKERNELS + solveParallel(basisCoeffs, elemMat, elemRhs, tau, + w, elemDof, n, m); +#else + solveSerial(basisCoeffs, elemMat, elemRhs, tau, + w, elemDof, n, m); +#endif + + } + + /** \brief Parallel implementation of solve, using Kokkos Kernels QR factoriation + */ +#ifdef HAVE_INTREPID2_KOKKOSKERNELS + template + void solveParallel(ViewType1 basisCoeffs, ViewType2 elemMat, ViewType2 elemRhs, ViewType2 taul, + ViewType3 work,const ViewType4 elemDof, ordinal_type n, ordinal_type m) { + + ordinal_type numCells = basisCoeffs.extent(0); + + if(matrixIndependentOfCell_) { + auto A0 = Kokkos::subview(elemMat, 0, Kokkos::ALL(), Kokkos::ALL()); + auto tau0 = Kokkos::subview(taul, 0, Kokkos::ALL()); + + auto A0_host = Kokkos::create_mirror_view_and_copy(typename ExecSpaceType::memory_space(), A0); + auto tau0_host = Kokkos::create_mirror_view(typename ExecSpaceType::memory_space(), tau0); + + + for(ordinal_type i=n; i (0, numCells), + KOKKOS_LAMBDA (const size_t ic) { + auto w = Kokkos::subview(work, ic, Kokkos::ALL()); + + auto b = Kokkos::subview(elemRhs, ic, Kokkos::ALL()); + + //b'*Q0 -> b + KokkosBatched::SerialApplyQ_RightNoTransForwardInternal::invoke( + 1, A0.extent(0), A0.extent(1), + A0.data(), A0.stride_0(), A0.stride_1(), + tau0.data(), tau0.stride_0(), + b.data(), 1, b.stride_0(), + w.data()); + + // R0^{-1} b -> b + KokkosBatched::SerialTrsvInternalUpper::invoke(false, + A0.extent(0), + 1.0, + A0.data(), A0.stride_0(), A0.stride_1(), + b.data(), b.stride_0()); + + //scattering b into the basis coefficients + for(ordinal_type i=0; i (0, numCells), + KOKKOS_LAMBDA (const size_t ic) { + + auto A = Kokkos::subview(elemMat, ic, Kokkos::ALL(), Kokkos::ALL()); + auto tau = Kokkos::subview(taul, ic, Kokkos::ALL()); + auto w = Kokkos::subview(work, ic, Kokkos::ALL()); + + for(ordinal_type i=n; i b + KokkosBatched::SerialApplyQ_RightNoTransForwardInternal::invoke( + 1, A.extent(0), A.extent(1), + A.data(), A.stride_0(), A.stride_1(), + tau.data(), tau.stride_0(), + b.data(), 1, b.stride_0(), + w.data()); + + // R^{-1} b -> b + KokkosBatched::SerialTrsvInternalUpper::invoke(false, + A.extent(0), + 1.0, + A.data(), A.stride_0(), A.stride_1(), + b.data(), b.stride_0()); + + //scattering b into the basis coefficients + for(ordinal_type i=0; i + void solveSerial(ViewType1 basisCoeffs, ViewType2 elemMat, ViewType2 elemRhs, ViewType2 , + ViewType3, const ViewType4 elemDof, ordinal_type n, ordinal_type m) { + using valueType = typename ViewType2::value_type; + using host_space_type = typename Kokkos::Impl::is_space::host_mirror_space::execution_space; + Kokkos::View + serialElemMat("serialElemMat", n+m, n+m); + Teuchos::LAPACK lapack_; + ordinal_type numCells = basisCoeffs.extent(0); + + if(matrixIndependentOfCell_) { + ViewType2 elemRhsTrans("transRhs", elemRhs.extent(1), elemRhs.extent(0)); + Kokkos::View + pivVec("pivVec", m+n + std::max(m+n, numCells), 1); + + Kokkos::View serialElemRhs("serialElemRhs", n+m, numCells); + + auto A = Kokkos::create_mirror_view_and_copy(typename ExecSpaceType::memory_space(), + Kokkos::subview(elemMat, 0, Kokkos::ALL(), Kokkos::ALL())); + auto b = Kokkos::create_mirror_view_and_copy(typename ExecSpaceType::memory_space(), elemRhs); + + auto serialBasisCoeffs = Kokkos::create_mirror_view_and_copy( + typename ExecSpaceType::memory_space(), basisCoeffs); + + for(ordinal_type i=0; i pivVec("pivVec", 2*(m+n), 1); + Kokkos::View serialElemRhs("serialElemRhs", n+m, 1 ); + for (ordinal_type ic = 0; ic < numCells; ic++) { + auto A = Kokkos::create_mirror_view_and_copy(typename ExecSpaceType::memory_space(), + Kokkos::subview(elemMat, ic, Kokkos::ALL(), Kokkos::ALL())); + auto b = Kokkos::create_mirror_view_and_copy(typename ExecSpaceType::memory_space(), + Kokkos::subview(elemRhs, ic, Kokkos::ALL())); + auto basisCoeffs_ = Kokkos::subview(basisCoeffs, ic, Kokkos::ALL()); + auto serialBasisCoeffs = Kokkos::create_mirror_view_and_copy(typename ExecSpaceType::memory_space(), + basisCoeffs_); + + Kokkos::deep_copy(serialElemMat,valueType(0)); //LAPACK might overwrite the matrix + + for(ordinal_type i=0; i>> ERROR (Intrepid::ProjectionTools::getBasisCoeffs): " + << "LAPACK return with error code: " + << info; + INTREPID2_TEST_FOR_EXCEPTION( true, std::runtime_error, ss.str().c_str() ); + } + + for(ordinal_type i=0; i +struct ComputeBasisCoeffsOnEdges_HCurl { + const ViewType1 basisTanAtBasisEPoints_; + const ViewType1 basisAtBasisEPoints_; + const ViewType2 basisEWeights_; + const ViewType1 wTanBasisAtBasisEPoints_; + const ViewType2 targetEWeights_; + const ViewType1 basisAtTargetEPoints_; + const ViewType1 wTanBasisAtTargetEPoints_; + const ViewType3 tagToOrdinal_; + const ViewType4 targetAtTargetEPoints_; + const ViewType1 targetTanAtTargetEPoints_; + const ViewType1 refEdgesTangent_; + ordinal_type edgeCardinality_; + ordinal_type offsetBasis_; + ordinal_type offsetTarget_; + ordinal_type edgeDim_; + ordinal_type dim_; + ordinal_type iedge_; + + ComputeBasisCoeffsOnEdges_HCurl(const ViewType1 basisTanAtBasisEPoints, + const ViewType1 basisAtBasisEPoints, const ViewType2 basisEWeights, const ViewType1 wTanBasisAtBasisEPoints, const ViewType2 targetEWeights, + const ViewType1 basisAtTargetEPoints, const ViewType1 wTanBasisAtTargetEPoints, const ViewType3 tagToOrdinal, + const ViewType4 targetAtTargetEPoints, const ViewType1 targetTanAtTargetEPoints, + const ViewType1 refEdgesTangent, ordinal_type edgeCardinality, ordinal_type offsetBasis, + ordinal_type offsetTarget, ordinal_type edgeDim, + ordinal_type dim, ordinal_type iedge) : + basisTanAtBasisEPoints_(basisTanAtBasisEPoints), + basisAtBasisEPoints_(basisAtBasisEPoints), basisEWeights_(basisEWeights), wTanBasisAtBasisEPoints_(wTanBasisAtBasisEPoints), targetEWeights_(targetEWeights), + basisAtTargetEPoints_(basisAtTargetEPoints), wTanBasisAtTargetEPoints_(wTanBasisAtTargetEPoints), + tagToOrdinal_(tagToOrdinal), targetAtTargetEPoints_(targetAtTargetEPoints), + targetTanAtTargetEPoints_(targetTanAtTargetEPoints), + refEdgesTangent_(refEdgesTangent), edgeCardinality_(edgeCardinality), offsetBasis_(offsetBasis), + offsetTarget_(offsetTarget), edgeDim_(edgeDim), dim_(dim), iedge_(iedge) + {} + + void + KOKKOS_INLINE_FUNCTION + operator()(const ordinal_type ic) const { + + ordinal_type numBasisEPoints = basisEWeights_.extent(0); + ordinal_type numTargetEPoints = targetEWeights_.extent(0); + for(ordinal_type j=0; j +struct ComputeBasisCoeffsOnFaces_HCurl { + const ViewType1 basisCoeffs_; + const ViewType2 orts_; + const ViewType3 negPartialProjTan_; + const ViewType3 negPartialProjCurlNormal_; + const ViewType3 hgradBasisGradAtBasisEPoints_; + const ViewType3 wHgradBasisGradAtBasisEPoints_; + const ViewType3 basisCurlAtBasisCurlEPoints_; + const ViewType3 basisCurlNormalAtBasisCurlEPoints_; + const ViewType3 basisAtBasisEPoints_; + const ViewType3 normalTargetCurlAtTargetEPoints_; + const ViewType3 basisTanAtBasisEPoints_; + const ViewType3 hgradBasisGradAtTargetEPoints_; + const ViewType3 wHgradBasisGradAtTargetEPoints_; + const ViewType3 wNormalBasisCurlAtBasisCurlEPoints_; + const ViewType3 basisCurlAtTargetCurlEPoints_; + const ViewType3 wNormalBasisCurlBasisAtTargetCurlEPoints_; + const ViewType4 targetAtTargetEPoints_; + const ViewType3 targetTanAtTargetEPoints_; + const ViewType4 targetCurlAtTargetCurlEPoints_; + const ViewType5 basisEWeights_; + const ViewType5 targetEWeights_; + const ViewType5 basisCurlEWeights_; + const ViewType5 targetCurlEWeights_; + const ViewType6 tagToOrdinal_; + const ViewType6 hGradTagToOrdinal_; + const ViewType7 refTopologyKey_; + const ViewType3 refFacesNormal_; + const ViewType3 refFacesTangents_; + const ViewType8 computedDofs_; + ordinal_type offsetBasis_; + ordinal_type offsetBasisCurl_; + ordinal_type offsetTarget_; + ordinal_type offsetTargetCurl_; + ordinal_type iface_; + ordinal_type hgradCardinality_; + ordinal_type numFaces_; + ordinal_type numFaceDofs_; + ordinal_type numEdgeDofs_; + ordinal_type faceDim_; + ordinal_type dim_; + + + + + ComputeBasisCoeffsOnFaces_HCurl(const ViewType1 basisCoeffs, + const ViewType2 orts, const ViewType3 negPartialProjTan, const ViewType3 negPartialProjCurlNormal, + const ViewType3 hgradBasisGradAtBasisEPoints, const ViewType3 wHgradBasisGradAtBasisEPoints, + const ViewType3 basisCurlAtBasisCurlEPoints, const ViewType3 basisCurlNormalAtBasisCurlEPoints, + const ViewType3 basisAtBasisEPoints, + const ViewType3 normalTargetCurlAtTargetEPoints, + const ViewType3 basisTanAtBasisEPoints, + const ViewType3 hgradBasisGradAtTargetEPoints, const ViewType3 wHgradBasisGradAtTargetEPoints, + const ViewType3 wNormalBasisCurlAtBasisCurlEPoints, const ViewType3 basisCurlAtTargetCurlEPoints, + const ViewType3 wNormalBasisCurlBasisAtTargetCurlEPoints, const ViewType4 targetAtTargetEPoints, + const ViewType3 targetTanAtTargetEPoints, const ViewType4 targetCurlAtTargetCurlEPoints, + const ViewType5 basisEWeights, const ViewType5 targetEWeights, + const ViewType5 basisCurlEWeights, const ViewType5 targetCurlEWeights, const ViewType6 tagToOrdinal, + const ViewType6 hGradTagToOrdinal, const ViewType7 refTopologyKey, + const ViewType3 refFacesNormal, const ViewType3 refFacesTangents, + const ViewType8 computedDofs, ordinal_type offsetBasis, + ordinal_type offsetBasisCurl, ordinal_type offsetTarget, + ordinal_type offsetTargetCurl, ordinal_type iface, + ordinal_type hgradCardinality, ordinal_type numFaces, + ordinal_type numFaceDofs, ordinal_type numEdgeDofs, + ordinal_type faceDim, ordinal_type dim): + basisCoeffs_(basisCoeffs), + orts_(orts), negPartialProjTan_(negPartialProjTan), negPartialProjCurlNormal_(negPartialProjCurlNormal), + hgradBasisGradAtBasisEPoints_(hgradBasisGradAtBasisEPoints), wHgradBasisGradAtBasisEPoints_(wHgradBasisGradAtBasisEPoints), + basisCurlAtBasisCurlEPoints_(basisCurlAtBasisCurlEPoints), basisCurlNormalAtBasisCurlEPoints_(basisCurlNormalAtBasisCurlEPoints), + basisAtBasisEPoints_(basisAtBasisEPoints), + normalTargetCurlAtTargetEPoints_(normalTargetCurlAtTargetEPoints), basisTanAtBasisEPoints_(basisTanAtBasisEPoints), + hgradBasisGradAtTargetEPoints_(hgradBasisGradAtTargetEPoints), wHgradBasisGradAtTargetEPoints_(wHgradBasisGradAtTargetEPoints), + wNormalBasisCurlAtBasisCurlEPoints_(wNormalBasisCurlAtBasisCurlEPoints), basisCurlAtTargetCurlEPoints_(basisCurlAtTargetCurlEPoints), + wNormalBasisCurlBasisAtTargetCurlEPoints_(wNormalBasisCurlBasisAtTargetCurlEPoints), targetAtTargetEPoints_(targetAtTargetEPoints), + targetTanAtTargetEPoints_(targetTanAtTargetEPoints), targetCurlAtTargetCurlEPoints_(targetCurlAtTargetCurlEPoints), + basisEWeights_(basisEWeights), targetEWeights_(targetEWeights), + basisCurlEWeights_(basisCurlEWeights), targetCurlEWeights_(targetCurlEWeights), tagToOrdinal_(tagToOrdinal), + hGradTagToOrdinal_(hGradTagToOrdinal), refTopologyKey_(refTopologyKey), + refFacesNormal_(refFacesNormal), refFacesTangents_(refFacesTangents), + computedDofs_(computedDofs), offsetBasis_(offsetBasis), + offsetBasisCurl_(offsetBasisCurl), offsetTarget_(offsetTarget), + offsetTargetCurl_(offsetTargetCurl), iface_(iface), + hgradCardinality_(hgradCardinality), numFaces_(numFaces), + numFaceDofs_(numFaceDofs), numEdgeDofs_(numEdgeDofs), + faceDim_(faceDim), dim_(dim){} + + void + KOKKOS_INLINE_FUNCTION + operator()(const ordinal_type ic) const { + + ordinal_type fOrt[6]; + orts_(ic).getFaceOrientation(fOrt, numFaces_); + + ordinal_type ort = fOrt[iface_]; + typename ViewType3::value_type ortJacData[4]; //faceDim x faceDim + auto ortJac = ViewType3(ortJacData, faceDim_, faceDim_); + Impl::OrientationTools::getJacobianOfOrientationMap(ortJac, refTopologyKey_(faceDim_,iface_), ort); + + ordinal_type numBasisEPoints = basisEWeights_.extent(0); + ordinal_type numTargetEPoints = targetEWeights_.extent(0); + for(ordinal_type j=0; j +struct ComputeBasisCoeffsOnCell_HCurl { + const ViewType1 basisCoeffs_; + const ViewType2 negPartialProj_; + const ViewType2 negPartialProjCurl_; + const ViewType2 cellBasisAtBasisEPoints_; + const ViewType2 cellBasisCurlAtBasisCurlEPoints_; + const ViewType2 basisAtBasisEPoints_; + const ViewType2 hgradBasisGradAtBasisEPoints_; + const ViewType2 basisCurlAtBasisCurlEPoints_; + const ViewType2 hgradBasisGradAtTargetEPoints_; + const ViewType2 basisCurlAtTargetCurlEPoints_; + const ViewType3 basisEWeights_; + const ViewType3 basisCurlEWeights_; + const ViewType2 wHgradBasisGradAtBasisEPoints_; + const ViewType2 wBasisCurlAtBasisCurlEPoints_; + const ViewType3 targetEWeights_; + const ViewType3 targetCurlEWeights_; + const ViewType2 wHgradBasisGradAtTargetEPoints_; + const ViewType2 wBasisCurlAtTargetCurlEPoints_; + const ViewType4 computedDofs_; + const ViewType5 tagToOrdinal_; + const ViewType5 hGradTagToOrdinal_; + ordinal_type numCellDofs_; + ordinal_type hgradCardinality_; + ordinal_type offsetBasis_; + ordinal_type offsetBasisCurl_; + ordinal_type offsetTargetCurl_; + ordinal_type numEdgeFaceDofs_; + ordinal_type dim_; + ordinal_type derDim_; + + ComputeBasisCoeffsOnCell_HCurl(const ViewType1 basisCoeffs, ViewType2 negPartialProj, ViewType2 negPartialProjCurl, + const ViewType2 cellBasisAtBasisEPoints, const ViewType2 cellBasisCurlAtBasisCurlEPoints, + const ViewType2 basisAtBasisEPoints, const ViewType2 hgradBasisGradAtBasisEPoints, const ViewType2 basisCurlAtBasisCurlEPoints, + const ViewType2 hgradBasisGradAtTargetEPoints, const ViewType2 basisCurlAtTargetCurlEPoints, + const ViewType3 basisEWeights, const ViewType3 basisCurlEWeights, + const ViewType2 wHgradBasisGradAtBasisEPoints, const ViewType2 wBasisCurlAtBasisCurlEPoints, + const ViewType3 targetEWeights, const ViewType3 targetCurlEWeights, + const ViewType2 wHgradBasisGradAtTargetEPoints, + const ViewType2 wBasisCurlAtTargetCurlEPoints, const ViewType4 computedDofs, + const ViewType5 tagToOrdinal, const ViewType5 hGradTagToOrdinal, + ordinal_type numCellDofs, ordinal_type hgradCardinality, + ordinal_type offsetBasis, ordinal_type offsetBasisCurl, ordinal_type offsetTargetCurl, + ordinal_type numEdgeFaceDofs, ordinal_type dim, ordinal_type derDim) : + basisCoeffs_(basisCoeffs), negPartialProj_(negPartialProj), negPartialProjCurl_(negPartialProjCurl), + cellBasisAtBasisEPoints_(cellBasisAtBasisEPoints), cellBasisCurlAtBasisCurlEPoints_(cellBasisCurlAtBasisCurlEPoints), + basisAtBasisEPoints_(basisAtBasisEPoints), hgradBasisGradAtBasisEPoints_(hgradBasisGradAtBasisEPoints), + basisCurlAtBasisCurlEPoints_(basisCurlAtBasisCurlEPoints), + hgradBasisGradAtTargetEPoints_(hgradBasisGradAtTargetEPoints), + basisCurlAtTargetCurlEPoints_(basisCurlAtTargetCurlEPoints), + basisEWeights_(basisEWeights), basisCurlEWeights_(basisCurlEWeights), + wHgradBasisGradAtBasisEPoints_(wHgradBasisGradAtBasisEPoints), + wBasisCurlAtBasisCurlEPoints_(wBasisCurlAtBasisCurlEPoints), + targetEWeights_(targetEWeights), targetCurlEWeights_(targetCurlEWeights), + wHgradBasisGradAtTargetEPoints_(wHgradBasisGradAtTargetEPoints), + wBasisCurlAtTargetCurlEPoints_(wBasisCurlAtTargetCurlEPoints), + computedDofs_(computedDofs), tagToOrdinal_(tagToOrdinal), hGradTagToOrdinal_(hGradTagToOrdinal), + numCellDofs_(numCellDofs), hgradCardinality_(hgradCardinality), + offsetBasis_(offsetBasis), offsetBasisCurl_(offsetBasisCurl), offsetTargetCurl_(offsetTargetCurl), + numEdgeFaceDofs_(numEdgeFaceDofs), dim_(dim), derDim_(derDim) {} + + void + KOKKOS_INLINE_FUNCTION + operator()(const ordinal_type ic) const { + + ordinal_type numBasisPoints = basisEWeights_.extent(0); + ordinal_type numBasisCurlPoints = basisCurlEWeights_.extent(0); + ordinal_type numTargetPoints = targetEWeights_.extent(0); + ordinal_type numTargetCurlPoints = targetCurlEWeights_.extent(0); + for(ordinal_type j=0; j template void -ProjectionTools::getHCurlEvaluationPoints(typename BasisType::ScalarViewType evaluationPoints, - typename BasisType::ScalarViewType extDerivEvaluationPoints, +ProjectionTools::getHCurlEvaluationPoints(typename BasisType::ScalarViewType targetEPoints, + typename BasisType::ScalarViewType targetCurlEPoints, const Kokkos::DynRankView orts, const BasisType* cellBasis, ProjectionStruct * projStruct, const EvalPointsType evalPointType) { typedef typename BasisType::scalarType scalarType; - typedef Kokkos::DynRankView ScalarViewType; + typedef Kokkos::DynRankView ScalarViewType; typedef Kokkos::pair range_type; const auto cellTopo = cellBasis->getBaseCellTopology(); ordinal_type dim = cellTopo.getDimension(); - ordinal_type numCells = evaluationPoints.extent(0); + ordinal_type numCells = targetEPoints.extent(0); const ordinal_type edgeDim = 1; const ordinal_type faceDim = 2; ordinal_type numEdges = (cellBasis->getDofCount(1, 0) > 0) ? cellTopo.getEdgeCount() : 0; ordinal_type numFaces = (cellBasis->getDofCount(2, 0) > 0) ? cellTopo.getFaceCount() : 0; - Kokkos::View eOrt("eOrt", numEdges), fOrt("fOrt", numFaces); + CellTools::setSubcellParametrization(); + typename CellTools::subcellParamViewType subcellParamEdge, subcellParamFace; + if(numEdges>0) + CellTools::getSubcellParametrization(subcellParamEdge, edgeDim, cellTopo); + if(numFaces>0) + CellTools::getSubcellParametrization(subcellParamFace, faceDim, cellTopo); + + auto refTopologyKey = Kokkos::create_mirror_view_and_copy(typename SpT::memory_space(),projStruct->getTopologyKey()); + + auto evalPointsRange = Kokkos::create_mirror_view_and_copy(typename SpT::memory_space(),projStruct->getPointsRange(evalPointType)); + auto curlEPointsRange = Kokkos::create_mirror_view_and_copy(typename SpT::memory_space(),projStruct->getDerivPointsRange(evalPointType)); + + ScalarViewType workView("workView", numCells, std::max(projStruct->getMaxNumEvalPoints(evalPointType),projStruct->getMaxNumDerivPoints(evalPointType)), dim-1); for(ordinal_type ie=0; iegetTargetPointsRange(edgeDim, ie); - cubPoints = projStruct->getTargetEvalPoints(edgeDim, ie); - } - else { - edgePointsRange = projStruct->getBasisPointsRange(edgeDim, ie); - cubPoints = projStruct->getBasisEvalPoints(edgeDim, ie); - } - ScalarViewType orientedTargetCubPoints("orientedTargetCubPoints", cubPoints.extent(0),edgeDim); + auto edgePointsRange = evalPointsRange(edgeDim, ie); + auto edgeRefPointsRange = range_type(0, range_size(edgePointsRange)); + auto edgeEPoints = Kokkos::create_mirror_view_and_copy(typename SpT::memory_space(),projStruct->getEvalPoints(edgeDim,ie,evalPointType)); - const auto topoKey = projStruct->getTopologyKey(edgeDim,ie); + Kokkos::parallel_for + ("Evaluate Points Edges ", + Kokkos::RangePolicy (0, numCells), + KOKKOS_LAMBDA (const size_t ic) { - for(ordinal_type ic=0; ic::mapToReferenceSubcell(Kokkos::subview(evaluationPoints,ic,edgePointsRange,Kokkos::ALL()), orientedTargetCubPoints, edgeDim, ie, cellBasis->getBaseCellTopology()); - } + ordinal_type eOrt[12]; + orts(ic).getEdgeOrientation(eOrt, numEdges); + ordinal_type ort = eOrt[ie]; + + auto orientedEdgeEPoints = Kokkos::subview(workView, ic, edgeRefPointsRange, range_type(0,edgeDim)); + Impl::OrientationTools::mapToModifiedReference(orientedEdgeEPoints,edgeEPoints,refTopologyKey(edgeDim, ie),ort); + CellTools::mapToReferenceSubcell(Kokkos::subview(targetEPoints,ic,edgePointsRange,Kokkos::ALL()), orientedEdgeEPoints, subcellParamEdge, edgeDim, ie, dim); + }); } for(ordinal_type iface=0; ifacegetDerivEvalPoints(faceDim,iface,evalPointType)); - ScalarViewType cubPoints;//("cubPoints", numTargetCubPoints, faceDim); - range_type facePointsRange; - if(evalPointType == TARGET) { - cubPoints = projStruct->getTargetEvalPoints(faceDim, iface); - facePointsRange = projStruct->getTargetPointsRange(faceDim, iface); - } else { - cubPoints = projStruct->getBasisEvalPoints(faceDim, iface); - facePointsRange = projStruct->getBasisPointsRange(faceDim, iface); - } - - ScalarViewType curlCubPoints;//("curlCubPoints", numTargetCurlCubPoints, faceDim); - range_type faceCurlPointsRange; - if(evalPointType == TARGET) { - curlCubPoints = projStruct->getTargetDerivEvalPoints(faceDim, iface); - faceCurlPointsRange = projStruct->getTargetDerivPointsRange(faceDim, iface); - } else { - curlCubPoints = projStruct->getBasisDerivEvalPoints(faceDim, iface); - faceCurlPointsRange = projStruct->getBasisDerivPointsRange(faceDim, iface); - } + auto facePointsRange = evalPointsRange(faceDim, iface); + auto faceRefPointsRange = range_type(0, range_size(facePointsRange)); + auto faceEPoints = Kokkos::create_mirror_view_and_copy(typename SpT::memory_space(),projStruct->getEvalPoints(faceDim,iface,evalPointType)); - ScalarViewType faceCubPoints("faceCubPoints", cubPoints.extent(0), faceDim); - ScalarViewType faceCurlCubPoints("faceCurlCubPoints", curlCubPoints.extent(0), faceDim); + Kokkos::parallel_for + ("Evaluate Points Faces ", + Kokkos::RangePolicy (0, numCells), + KOKKOS_LAMBDA (const size_t ic) { - const auto topoKey = projStruct->getTopologyKey(faceDim,iface); - for(ordinal_type ic=0; ic::mapToReferenceSubcell(Kokkos::subview(evaluationPoints, ic, facePointsRange, Kokkos::ALL()), faceCubPoints, faceDim, iface, cellBasis->getBaseCellTopology()); + auto orientedFaceEPoints = Kokkos::subview(workView, ic, faceRefPointsRange, Kokkos::ALL()); + Impl::OrientationTools::mapToModifiedReference(orientedFaceEPoints,faceEPoints,refTopologyKey(faceDim, iface),ort); + CellTools::mapToReferenceSubcell(Kokkos::subview(targetEPoints, ic, facePointsRange, Kokkos::ALL()), orientedFaceEPoints , subcellParamFace, faceDim, iface, dim); - Impl::OrientationTools::mapToModifiedReference(faceCurlCubPoints,curlCubPoints,topoKey,ort); - CellTools::mapToReferenceSubcell(Kokkos::subview(extDerivEvaluationPoints, ic, faceCurlPointsRange, Kokkos::ALL()), faceCurlCubPoints, faceDim, iface, cellBasis->getBaseCellTopology()); - } + auto orientedFaceCurlEPoints = Kokkos::subview(workView, ic, faceRefCurlPointsRange, Kokkos::ALL()); + Impl::OrientationTools::mapToModifiedReference(orientedFaceCurlEPoints,faceCurlEPoints,refTopologyKey(faceDim, iface),ort); + CellTools::mapToReferenceSubcell(Kokkos::subview(targetCurlEPoints, ic, faceCurlPointsRange, Kokkos::ALL()), orientedFaceCurlEPoints, subcellParamFace, faceDim, iface, dim); + }); } if(cellBasis->getDofCount(dim,0)>0) { - range_type cellPointsRange; - ScalarViewType cubPoints; - if(evalPointType == TARGET) { - cubPoints = projStruct->getTargetEvalPoints(dim, 0); - cellPointsRange = projStruct->getTargetPointsRange(dim, 0); - } else { - cubPoints = projStruct->getBasisEvalPoints(dim, 0); - cellPointsRange = projStruct->getBasisPointsRange(dim, 0); - } - RealSpaceTools::clone(Kokkos::subview(evaluationPoints, Kokkos::ALL(), cellPointsRange, Kokkos::ALL()), cubPoints); + auto cellEPoints = Kokkos::create_mirror_view_and_copy(typename SpT::memory_space(),projStruct->getEvalPoints(dim,0,evalPointType)); + RealSpaceTools::clone(Kokkos::subview(targetEPoints, Kokkos::ALL(), evalPointsRange(dim, 0), Kokkos::ALL()), cellEPoints); - range_type cellCurlPointsRange; - ScalarViewType curlCubPoints; - if(evalPointType == TARGET) { - curlCubPoints = projStruct->getTargetDerivEvalPoints(dim, 0); - cellCurlPointsRange = projStruct->getTargetDerivPointsRange(dim, 0); - } else { - curlCubPoints = projStruct->getBasisDerivEvalPoints(dim, 0); - cellCurlPointsRange = projStruct->getBasisDerivPointsRange(dim, 0); - } - RealSpaceTools::clone(Kokkos::subview(extDerivEvaluationPoints, Kokkos::ALL(), cellCurlPointsRange, Kokkos::ALL()), curlCubPoints); + auto cellCurlEPoints = Kokkos::create_mirror_view_and_copy(typename SpT::memory_space(),projStruct->getDerivEvalPoints(dim,0,evalPointType)); + RealSpaceTools::clone(Kokkos::subview(targetCurlEPoints, Kokkos::ALL(), curlEPointsRange(dim, 0), Kokkos::ALL()), cellCurlEPoints); } } @@ -179,40 +498,37 @@ typename BasisType, typename ortValueType,class ...ortProperties> void ProjectionTools::getHCurlBasisCoeffs(Kokkos::DynRankView basisCoeffs, - const Kokkos::DynRankView targetAtEvalPoints, - const Kokkos::DynRankView targetCurlAtCurlEvalPoints, - const typename BasisType::ScalarViewType evaluationPoints, - const typename BasisType::ScalarViewType extDerivEvaluationPoints, + const Kokkos::DynRankView targetAtTargetEPoints, + const Kokkos::DynRankView targetCurlAtTargetCurlEPoints, + const typename BasisType::ScalarViewType targetEPoints, + const typename BasisType::ScalarViewType targetCurlEPoints, const Kokkos::DynRankView orts, const BasisType* cellBasis, ProjectionStruct * projStruct){ - typedef typename Kokkos::Impl::is_space::host_mirror_space::execution_space host_space_type; typedef typename BasisType::scalarType scalarType; typedef Kokkos::DynRankView ScalarViewType; typedef Kokkos::pair range_type; const auto cellTopo = cellBasis->getBaseCellTopology(); ordinal_type dim = cellTopo.getDimension(); - ordinal_type numTotalEvaluationPoints(targetAtEvalPoints.extent(1)), - numTotalCurlEvaluationPoints(targetCurlAtCurlEvalPoints.extent(1)); + ordinal_type numTotalTargetEPoints(targetAtTargetEPoints.extent(1)), + numTotalTargetCurlEPoints(targetCurlAtTargetCurlEPoints.extent(1)); ordinal_type basisCardinality = cellBasis->getCardinality(); - ordinal_type numCells = targetAtEvalPoints.extent(0); + ordinal_type numCells = targetAtTargetEPoints.extent(0); const ordinal_type edgeDim = 1; const ordinal_type faceDim = 2; const ordinal_type derDim = dim == 3 ? dim : 1; + const Kokkos::RangePolicy policy(0, numCells); + const std::string& name = cellBasis->getName(); ordinal_type numEdges = (cellBasis->getDofCount(1, 0) > 0) ? cellTopo.getEdgeCount() : 0; ordinal_type numFaces = (cellBasis->getDofCount(2, 0) > 0) ? cellTopo.getFaceCount() : 0; - Kokkos::View eOrt("eOrt", numEdges); - Kokkos::View fOrt("fOrt", numFaces); - ScalarViewType refEdgeTan("refEdgeTan", dim); - ScalarViewType refFaceTangents("refFaceTangents", dim, 2); - ScalarViewType refFaceNormal("refFaceNormal", dim); - auto refFaceTanU = Kokkos::subview(refFaceTangents, Kokkos::ALL, 0); - auto refFaceTanV = Kokkos::subview(refFaceTangents, Kokkos::ALL, 1); + ScalarViewType refEdgesTangent("refEdgesTangent", numEdges, dim); + ScalarViewType refFacesTangents("refFaceTangents", numFaces, dim, 2); + ScalarViewType refFacesNormal("refFaceNormal", numFaces, dim); ordinal_type numEdgeDofs(0); for(ordinal_type ie=0; ie::getHCurlBasisCoeffs(Kokkos::DynRankViewgetDofCount(faceDim,iface); - Kokkos::View computedDofs("computedDofs",numEdgeDofs+numFaceDofs); + auto tagToOrdinal = Kokkos::create_mirror_view_and_copy(typename SpT::memory_space(), cellBasis->getAllDofOrdinal()); - ordinal_type computedDofsCount = 0; + Kokkos::View computedDofs("computedDofs",numEdgeDofs+numFaceDofs); + + auto targetEPointsRange = Kokkos::create_mirror_view_and_copy(typename SpT::memory_space(),projStruct->getTargetPointsRange()); + auto targetCurlEPointsRange = Kokkos::create_mirror_view_and_copy(typename SpT::memory_space(),projStruct->getTargetDerivPointsRange()); + + auto basisEPointsRange = Kokkos::create_mirror_view_and_copy(typename SpT::memory_space(),projStruct->getBasisPointsRange()); + auto basisCurlEPointsRange = Kokkos::create_mirror_view_and_copy(typename SpT::memory_space(),projStruct->getBasisDerivPointsRange()); - ordinal_type numTotalCubPoints = projStruct->getNumBasisEvalPoints(), numTotalCurlCubPoints = projStruct->getNumBasisDerivEvalPoints(); - ScalarViewType cubPoints("cubPoints",numCells,numTotalCubPoints, dim); - ScalarViewType curlCubPoints("curlCubPoints",numCells,numTotalCurlCubPoints, dim); - getHCurlEvaluationPoints(cubPoints, curlCubPoints, orts, cellBasis, projStruct, BASIS); + auto refTopologyKey = Kokkos::create_mirror_view_and_copy(typename SpT::memory_space(),projStruct->getTopologyKey()); - ScalarViewType basisAtCubPoints("basisAtCubPoints",numCells,basisCardinality, numTotalCubPoints, dim); - ScalarViewType basisAtTargetCubPoints("basisAtTargetCubPoints",numCells,basisCardinality, numTotalEvaluationPoints, dim); + ordinal_type numTotalBasisEPoints = projStruct->getNumBasisEvalPoints(), numTotalBasisCurlEPoints = projStruct->getNumBasisDerivEvalPoints(); + + ScalarViewType basisEPoints("basisEPoints",numCells,numTotalBasisEPoints, dim); + ScalarViewType basisCurlEPoints("basisCurlEPoints",numCells,numTotalBasisCurlEPoints, dim); + getHCurlEvaluationPoints(basisEPoints, basisCurlEPoints, orts, cellBasis, projStruct, EvalPointsType::BASIS); + + ScalarViewType basisAtBasisEPoints("basisAtBasisEPoints",numCells,basisCardinality, numTotalBasisEPoints, dim); + ScalarViewType basisAtTargetEPoints("basisAtTargetEPoints",numCells,basisCardinality, numTotalTargetEPoints, dim); { - ScalarViewType nonOrientedBasisAtCubPoints("nonOrientedBasisAtCubPoints",numCells,basisCardinality, numTotalCubPoints, dim); - ScalarViewType nonOrientedBasisAtTargetCubPoints("nonOrientedBasisAtTargetCubPoints",numCells,basisCardinality, numTotalEvaluationPoints, dim); + ScalarViewType nonOrientedBasisAtBasisEPoints("nonOrientedBasisAtEPoints",numCells,basisCardinality, numTotalBasisEPoints, dim); + ScalarViewType nonOrientedBasisAtTargetEPoints("nonOrientedBasisAtTargetEPoints",numCells,basisCardinality, numTotalTargetEPoints, dim); for(ordinal_type ic=0; icgetValues(Kokkos::subview(nonOrientedBasisAtTargetCubPoints,ic,Kokkos::ALL(),Kokkos::ALL(),Kokkos::ALL()), Kokkos::subview(evaluationPoints, ic, Kokkos::ALL(), Kokkos::ALL())); - cellBasis->getValues(Kokkos::subview(nonOrientedBasisAtCubPoints,ic,Kokkos::ALL(),Kokkos::ALL(),Kokkos::ALL()), Kokkos::subview(cubPoints, ic, Kokkos::ALL(), Kokkos::ALL())); + cellBasis->getValues(Kokkos::subview(nonOrientedBasisAtTargetEPoints,ic,Kokkos::ALL(),Kokkos::ALL(),Kokkos::ALL()), Kokkos::subview(targetEPoints, ic, Kokkos::ALL(), Kokkos::ALL())); + cellBasis->getValues(Kokkos::subview(nonOrientedBasisAtBasisEPoints,ic,Kokkos::ALL(),Kokkos::ALL(),Kokkos::ALL()), Kokkos::subview(basisEPoints, ic, Kokkos::ALL(), Kokkos::ALL())); } - OrientationTools::modifyBasisByOrientation(basisAtCubPoints, nonOrientedBasisAtCubPoints, orts, cellBasis); - OrientationTools::modifyBasisByOrientation(basisAtTargetCubPoints, nonOrientedBasisAtTargetCubPoints, orts, cellBasis); + OrientationTools::modifyBasisByOrientation(basisAtBasisEPoints, nonOrientedBasisAtBasisEPoints, orts, cellBasis); + OrientationTools::modifyBasisByOrientation(basisAtTargetEPoints, nonOrientedBasisAtTargetEPoints, orts, cellBasis); } - ScalarViewType basisCurlAtCurlCubPoints; - ScalarViewType basisCurlAtTargetCurlCubPoints; - if(numTotalCurlEvaluationPoints>0) { - ScalarViewType nonOrientedBasisCurlAtTargetCurlCubPoints, nonOrientedBasisCurlAtCurlCubPoints; + ScalarViewType basisCurlAtBasisCurlEPoints; + ScalarViewType basisCurlAtTargetCurlEPoints; + if(numTotalBasisCurlEPoints>0) { + ScalarViewType nonOrientedBasisCurlAtTargetCurlEPoints, nonOrientedBasisCurlAtBasisCurlEPoints; if (dim == 3) { - basisCurlAtCurlCubPoints = ScalarViewType ("basisCurlAtCurlCubPoints",numCells,basisCardinality, numTotalCurlCubPoints, dim); - nonOrientedBasisCurlAtCurlCubPoints = ScalarViewType ("nonOrientedBasisCurlAtCurlCubPoints",numCells,basisCardinality, numTotalCurlCubPoints, dim); - basisCurlAtTargetCurlCubPoints = ScalarViewType("basisCurlAtTargetCurlCubPoints",numCells,basisCardinality, numTotalCurlEvaluationPoints, dim); - nonOrientedBasisCurlAtTargetCurlCubPoints = ScalarViewType("nonOrientedBasisCurlAtTargetCurlCubPoints",numCells,basisCardinality, numTotalCurlEvaluationPoints, dim); + basisCurlAtBasisCurlEPoints = ScalarViewType ("basisCurlAtBasisCurlEPoints",numCells,basisCardinality, numTotalBasisCurlEPoints, dim); + nonOrientedBasisCurlAtBasisCurlEPoints = ScalarViewType ("nonOrientedBasisCurlAtBasisCurlEPoints",numCells,basisCardinality, numTotalBasisCurlEPoints, dim); + basisCurlAtTargetCurlEPoints = ScalarViewType("basisCurlAtTargetCurlEPoints",numCells,basisCardinality, numTotalTargetCurlEPoints, dim); + nonOrientedBasisCurlAtTargetCurlEPoints = ScalarViewType("nonOrientedBasisCurlAtTargetCurlEPoints",numCells,basisCardinality, numTotalTargetCurlEPoints, dim); } else { - basisCurlAtCurlCubPoints = ScalarViewType ("basisCurlAtCurlCubPoints",numCells,basisCardinality, numTotalCurlCubPoints); - nonOrientedBasisCurlAtCurlCubPoints = ScalarViewType ("nonOrientedBasisCurlAtCurlCubPoints",numCells,basisCardinality, numTotalCurlCubPoints); - basisCurlAtTargetCurlCubPoints = ScalarViewType("basisCurlAtTargetCurlCubPoints",numCells,basisCardinality, numTotalCurlEvaluationPoints); - nonOrientedBasisCurlAtTargetCurlCubPoints = ScalarViewType("nonOrientedBasisCurlAtTargetCurlCubPoints",numCells,basisCardinality, numTotalCurlEvaluationPoints); + basisCurlAtBasisCurlEPoints = ScalarViewType ("basisCurlAtBasisCurlEPoints",numCells,basisCardinality, numTotalBasisCurlEPoints); + nonOrientedBasisCurlAtBasisCurlEPoints = ScalarViewType ("nonOrientedBasisCurlAtBasisCurlEPoints",numCells,basisCardinality, numTotalBasisCurlEPoints); + basisCurlAtTargetCurlEPoints = ScalarViewType("basisCurlAtTargetCurlEPoints",numCells,basisCardinality, numTotalTargetCurlEPoints); + nonOrientedBasisCurlAtTargetCurlEPoints = ScalarViewType("nonOrientedBasisCurlAtTargetCurlEPoints",numCells,basisCardinality, numTotalTargetCurlEPoints); } for(ordinal_type ic=0; icgetValues(Kokkos::subview(nonOrientedBasisCurlAtCurlCubPoints,ic,Kokkos::ALL(),Kokkos::ALL(),Kokkos::ALL()), Kokkos::subview(curlCubPoints, ic, Kokkos::ALL(), Kokkos::ALL()),OPERATOR_CURL); - cellBasis->getValues(Kokkos::subview(nonOrientedBasisCurlAtTargetCurlCubPoints,ic,Kokkos::ALL(),Kokkos::ALL(),Kokkos::ALL()), Kokkos::subview(extDerivEvaluationPoints, ic, Kokkos::ALL(), Kokkos::ALL()),OPERATOR_CURL); + cellBasis->getValues(Kokkos::subview(nonOrientedBasisCurlAtBasisCurlEPoints,ic,Kokkos::ALL(),Kokkos::ALL(),Kokkos::ALL()), Kokkos::subview(basisCurlEPoints, ic, Kokkos::ALL(), Kokkos::ALL()),OPERATOR_CURL); + cellBasis->getValues(Kokkos::subview(nonOrientedBasisCurlAtTargetCurlEPoints,ic,Kokkos::ALL(),Kokkos::ALL(),Kokkos::ALL()), Kokkos::subview(targetCurlEPoints, ic, Kokkos::ALL(), Kokkos::ALL()),OPERATOR_CURL); } - OrientationTools::modifyBasisByOrientation(basisCurlAtCurlCubPoints, nonOrientedBasisCurlAtCurlCubPoints, orts, cellBasis); - OrientationTools::modifyBasisByOrientation(basisCurlAtTargetCurlCubPoints, nonOrientedBasisCurlAtTargetCurlCubPoints, orts, cellBasis); + OrientationTools::modifyBasisByOrientation(basisCurlAtBasisCurlEPoints, nonOrientedBasisCurlAtBasisCurlEPoints, orts, cellBasis); + OrientationTools::modifyBasisByOrientation(basisCurlAtTargetCurlEPoints, nonOrientedBasisCurlAtTargetCurlEPoints, orts, cellBasis); } + ordinal_type computedDofsCount = 0; for(ordinal_type ie=0; iegetDofCount(edgeDim,ie); - ordinal_type numCubPoints = projStruct->getNumBasisEvalPoints(edgeDim, ie); - ordinal_type numTargetCubPoints = projStruct->getNumTargetEvalPoints(edgeDim, ie); - - CellTools::getReferenceEdgeTangent(refEdgeTan, ie, cellBasis->getBaseCellTopology()); + ordinal_type numBasisEPoints = range_size(basisEPointsRange(edgeDim, ie)); + ordinal_type numTargetEPoints = range_size(targetEPointsRange(edgeDim, ie)); + + { + auto refEdgeTan = Kokkos::subview(refEdgesTangent, ie, Kokkos::ALL()); + auto refEdgeTanHost = Kokkos::create_mirror_view(refEdgeTan); + CellTools::getReferenceEdgeTangent(refEdgeTanHost, ie, cellTopo); + Kokkos::deep_copy(refEdgeTan,refEdgeTanHost); + } - ScalarViewType tanBasisAtElemCubPoints("tanBasisAtElemCubPoints",numCells,edgeCardinality, numCubPoints); - ScalarViewType tanBasisAtTargetCubPoints("tanBasisAtTargetCubPoints",numCells,edgeCardinality, numTargetCubPoints); - ScalarViewType weightedTanBasisAtElemCubPoints("weightedTanBasisAtElemCubPoints",numCells,edgeCardinality, numCubPoints); - ScalarViewType weightedTanBasisAtTargetCubPoints("weightedTanBasisAtTargetCubPoints",numCells,edgeCardinality, numTargetCubPoints); - ScalarViewType tanTargetAtTargetCubPoints("normalTargetAtTargetCubPoints",numCells, numTargetCubPoints); + ScalarViewType basisTanAtBasisEPoints("basisTanAtBasisEPoints",numCells,edgeCardinality, numBasisEPoints); + ScalarViewType basisTanAtTargetEPoints("basisTanAtTargetEPoints",numCells,edgeCardinality, numTargetEPoints); + ScalarViewType weightedTanBasisAtBasisEPoints("weightedTanBasisAtBasisEPoints",numCells,edgeCardinality, numBasisEPoints); + ScalarViewType weightedTanBasisAtTargetEPoints("weightedTanBasisAtTargetEPoints",numCells,edgeCardinality, numTargetEPoints); + ScalarViewType targetTanAtTargetEPoints("normalTargetAtTargetEPoints",numCells, numTargetEPoints); - ScalarViewType targetEvalWeights = projStruct->getTargetEvalWeights(edgeDim, ie); - ScalarViewType basisEvalWeights = projStruct->getBasisEvalWeights(edgeDim, ie); + auto targetEWeights = Kokkos::create_mirror_view_and_copy(typename SpT::memory_space(),projStruct->getTargetEvalWeights(edgeDim,ie)); + auto basisEWeights = Kokkos::create_mirror_view_and_copy(typename SpT::memory_space(),projStruct->getBasisEvalWeights(edgeDim,ie)); //Note: we are not considering the jacobian of the orientation map since it is simply a scalar term for the integrals and it does not affect the projection - ordinal_type offsetBasis = projStruct->getBasisPointsRange(edgeDim, ie).first; - ordinal_type offsetTarget = projStruct->getTargetPointsRange(edgeDim, ie).first; - for(ordinal_type ic=0; icgetDofOrdinal(edgeDim, ie, j); - for(ordinal_type iq=0; iq functorTypeEdge; + Kokkos::parallel_for(policy, functorTypeEdge(basisTanAtBasisEPoints,basisAtBasisEPoints,basisEWeights, + weightedTanBasisAtBasisEPoints, targetEWeights, + basisAtTargetEPoints, weightedTanBasisAtTargetEPoints, tagToOrdinal, + targetAtTargetEPoints, targetTanAtTargetEPoints, + refEdgesTangent, edgeCardinality, offsetBasis, + offsetTarget, edgeDim, + dim, ie)); + ScalarViewType edgeMassMat_("edgeMassMat_", numCells, edgeCardinality+1, edgeCardinality+1), edgeRhsMat_("rhsMat_", numCells, edgeCardinality+1); - ScalarViewType cubWeights_("cubWeights_", numCells, 1, basisEvalWeights.extent(0)), targetEvalWeights_("targetEvalWeights", numCells, 1, targetEvalWeights.extent(0)); - RealSpaceTools::clone(cubWeights_, basisEvalWeights); - RealSpaceTools::clone(targetEvalWeights_, targetEvalWeights); + ScalarViewType eWeights_("eWeights_", numCells, 1, basisEWeights.extent(0)), targetEWeights_("targetEWeights", numCells, 1, targetEWeights.extent(0)); + RealSpaceTools::clone(eWeights_, basisEWeights); + RealSpaceTools::clone(targetEWeights_, targetEWeights); range_type range_H(0, edgeCardinality); range_type range_B(edgeCardinality, edgeCardinality+1); - FunctionSpaceTools::integrate(Kokkos::subview(edgeMassMat_,Kokkos::ALL(),range_H,range_H), tanBasisAtElemCubPoints, weightedTanBasisAtElemCubPoints); - FunctionSpaceTools::integrate(Kokkos::subview(edgeMassMat_,Kokkos::ALL(),range_H,range_B), tanBasisAtElemCubPoints, cubWeights_); - FunctionSpaceTools::integrate(Kokkos::subview(edgeRhsMat_,Kokkos::ALL(),range_H), tanTargetAtTargetCubPoints, weightedTanBasisAtTargetCubPoints); - FunctionSpaceTools::integrate(Kokkos::subview(edgeRhsMat_,Kokkos::ALL(),range_B), tanTargetAtTargetCubPoints, targetEvalWeights_); - Kokkos::View edgeMassMat("edgeMassMat", edgeCardinality+1,edgeCardinality+1); - Kokkos::View edgeRhsMat("edgeRhsMat",edgeCardinality+1, 1); - - Teuchos::LAPACK lapack; - ordinal_type info = 0; - Kokkos::View pivVec("pivVec", edgeCardinality+1, 1); - for(ordinal_type ic=0; ic>> ERROR (Intrepid::ProjectionTools::getBasisCoeffs): " - << "LAPACK return with error code: " - << info; - INTREPID2_TEST_FOR_EXCEPTION( true, std::runtime_error, ss.str().c_str() ); - } + FunctionSpaceTools::integrate(Kokkos::subview(edgeMassMat_,Kokkos::ALL(),range_H,range_H), basisTanAtBasisEPoints, weightedTanBasisAtBasisEPoints); + FunctionSpaceTools::integrate(Kokkos::subview(edgeMassMat_,Kokkos::ALL(),range_H,range_B), basisTanAtBasisEPoints, eWeights_); + FunctionSpaceTools::integrate(Kokkos::subview(edgeRhsMat_,Kokkos::ALL(),range_H), targetTanAtTargetEPoints, weightedTanBasisAtTargetEPoints); + FunctionSpaceTools::integrate(Kokkos::subview(edgeRhsMat_,Kokkos::ALL(),range_B), targetTanAtTargetEPoints, targetEWeights_); + + typedef Kokkos::DynRankView WorkArrayViewType; + ScalarViewType t_("t",numCells, edgeCardinality+1); + WorkArrayViewType w_("w",numCells, edgeCardinality+1); + + auto edgeDofs = Kokkos::subview(tagToOrdinal, edgeDim, ie, Kokkos::ALL()); + ElemSystem edgeSystem("edgeSystem", false); + edgeSystem.solve(basisCoeffs, edgeMassMat_, edgeRhsMat_, t_, w_, edgeDofs, edgeCardinality, 1); - for(ordinal_type i=0; igetDofOrdinal(edgeDim, ie, i); - basisCoeffs(ic,edge_dof) = edgeRhsMat(i,0); - } - } for(ordinal_type i=0; igetDofOrdinal(edgeDim, ie, i); } - ScalarViewType ortJacobian("ortJacobian", faceDim, faceDim); - - Basis *hgradBasis = NULL; + Basis *hgradBasis = NULL; for(ordinal_type iface=0; iface(cellBasis->getDegree(),POINTTYPE_WARPBLEND); - else if(name.find("TET")!=std::string::npos) - hgradBasis = new Basis_HGRAD_TRI_Cn_FEM(cellBasis->getDegree(),POINTTYPE_WARPBLEND); + if(cellTopo.getKey() == shards::getCellTopologyData >()->key) + hgradBasis = new Basis_HGRAD_QUAD_Cn_FEM(cellBasis->getDegree(),POINTTYPE_WARPBLEND); + else if(cellTopo.getKey() == shards::getCellTopologyData >()->key) + hgradBasis = new Basis_HGRAD_TRI_Cn_FEM(cellBasis->getDegree(),POINTTYPE_WARPBLEND); else { std::stringstream ss; ss << ">>> ERROR (Intrepid2::ProjectionTools::getHCurlBasisCoeffs): " << "Method not implemented for basis " << name; INTREPID2_TEST_FOR_EXCEPTION( true, std::runtime_error, ss.str().c_str() ); - return; } - - ordinal_type numFaceDofs = cellBasis->getDofCount(faceDim,iface); - ordinal_type numTargetCubPoints = projStruct->getNumTargetEvalPoints(faceDim, iface); - - ordinal_type numTargetCurlCubPoints = projStruct->getNumTargetDerivEvalPoints(faceDim, iface); - ordinal_type numCubPoints = projStruct->getNumBasisEvalPoints(faceDim, iface); - - ScalarViewType hgradBasisGradAtCubPoints("hgradBasisGradAtCubPoints",hgradBasis->getCardinality(), numCubPoints, faceDim); - ScalarViewType hgradBasisGradAtTargetCubPoints("hgradBasisGradAtTargetCubPoints",hgradBasis->getCardinality(), numTargetCubPoints, faceDim); - - ordinal_type internalHgradCardinality = hgradBasis->getDofCount(faceDim,0); - ScalarViewType internalHgradBasisGradAtCubPoints("internalHgradBasisGradAtCubPoints",1, internalHgradCardinality, numCubPoints, faceDim); - ScalarViewType internalHgradBasisGradAtTargetCubPoints("internalHgradBasisGradAtTargetCubPoints",1, internalHgradCardinality, numTargetCubPoints, faceDim); - - - CellTools::getReferenceFaceNormal(refFaceNormal, iface, cellTopo); - CellTools::getReferenceFaceTangents(refFaceTanU, refFaceTanV,iface, cellTopo); - - hgradBasis->getValues(hgradBasisGradAtCubPoints,projStruct->getBasisEvalPoints(faceDim, iface), OPERATOR_GRAD); - hgradBasis->getValues(hgradBasisGradAtTargetCubPoints,projStruct->getTargetEvalPoints(faceDim, iface),OPERATOR_GRAD); - - for(ordinal_type j=0; j getDofOrdinal(faceDim, 0, j); - for(ordinal_type d=0; d ::getReferenceFaceTangents(refFaceTanUHost, refFaceTanVHost, iface, cellTopo); + Kokkos::deep_copy(refFaceTanU, refFaceTanUHost); + Kokkos::deep_copy(refFaceTanV, refFaceTanVHost); + auto refFaceNormal = Kokkos::subview(refFacesNormal,iface,Kokkos::ALL()); + auto refFaceNormalHost = Kokkos::create_mirror_view(refFaceNormal); + CellTools::getReferenceFaceNormal(refFaceNormalHost, iface, cellTopo); + Kokkos::deep_copy(refFaceNormal, refFaceNormalHost); } - ScalarViewType tanBasisAtElemCubPoints("tanBasisAtElemCubPoints",numCells,numFaceDofs, numCubPoints,dim-1); - ScalarViewType tanBasisAtTargetCubPoints("tanBasisAtTargetCubPoints",numCells,numFaceDofs, numTargetCubPoints,dim-1); - ScalarViewType normalBasisCurlAtElemCubPoints("normaBasisCurlAtElemCubPoints",numCells,numFaceDofs, numCubPoints); - ScalarViewType wNormalBasisCurlAtElemCubPoints("weightedNormalBasisCurlAtElemCubPoints",numCells,numFaceDofs, numCubPoints); + ordinal_type numTargetEPoints = range_size(targetEPointsRange(faceDim, iface)); + ordinal_type numTargetCurlEPoints = range_size(targetCurlEPointsRange(faceDim, iface)); + ordinal_type numBasisEPoints = range_size(basisEPointsRange(faceDim, iface)); + ordinal_type numBasisCurlEPoints = range_size(basisCurlEPointsRange(faceDim, iface)); - ScalarViewType tanTargetAtTargetCubPoints("tanTargetAtTargetCubPoints",numCells, numTargetCubPoints, dim-1); - ScalarViewType normalTargetCurlAtTargetCubPoints("normalTargetCurlAtTargetCubPoints",numCells, numTargetCurlCubPoints); - ScalarViewType normalBasisCurlAtTargetCurlCubPoints("normalBasisCurlAtTargetCurlCubPoints",numCells,numFaceDofs, numTargetCurlCubPoints); - ScalarViewType wNormalBasisCurlBasisAtTargetCurlCubPoints("weightedNormalBasisCurlAtTargetCurlCubPoints",numCells,numFaceDofs, numTargetCurlCubPoints); - - ScalarViewType wHgradBasisGradAtCubPoints("wHgradBasisGradAtCubPoints",1, internalHgradCardinality, numCubPoints, faceDim); - ScalarViewType wHgradBasisGradAtCubPoints_("wHgradBasisGradAtCubPoints_",numCells, internalHgradCardinality, numCubPoints, faceDim); - ScalarViewType wHgradBasisGradAtTargetCubPoints("wHgradBasisGradAtTargetCubPoints",1, internalHgradCardinality, numTargetCubPoints, faceDim); - ScalarViewType wHgradBasisGradAtTargetCubPoints_("wHgradBasisGradAtTargetCubPoints_",numCells, internalHgradCardinality, numTargetCubPoints, faceDim); - - ScalarViewType mNormalComputedProjectionCurl("mNormalComputedProjection", numCells,numCubPoints); - ScalarViewType mTanComputedProjection("mTanComputedProjection", numCells,numCubPoints,dim-1); - - ScalarViewType targetDerivEvalWeights = projStruct->getTargetDerivEvalWeights(faceDim, iface); - ordinal_type offsetBasis = projStruct->getBasisPointsRange(faceDim, iface).first; - ordinal_type offsetBasisCurl = projStruct->getBasisDerivPointsRange(faceDim, iface).first; - ordinal_type offsetTarget = projStruct->getTargetPointsRange(faceDim, iface).first; - ordinal_type offsetTargetCurl = projStruct->getTargetDerivPointsRange(faceDim, iface).first; - - - //Note: we are not considering the jacobian of the orientation map since it is simply a scalar term for the integrals and it does not affect the projection - const auto topoKey = projStruct->getTopologyKey(faceDim,iface); - for(ordinal_type ic=0; icgetDofOrdinal(faceDim, iface, j); - for(ordinal_type iq=0; iq getDofCount(faceDim,iface); - ScalarViewType faceMassMat_("faceMassMat_", numCells, numFaceDofs+internalHgradCardinality, numFaceDofs+internalHgradCardinality), - faceRhsMat_("rhsMat_", numCells, numFaceDofs+internalHgradCardinality); + ScalarViewType hgradBasisGradAtBasisEPoints("hgradBasisGradAtBasisEPoints",hgradBasis->getCardinality(), numBasisEPoints, faceDim); + ScalarViewType hgradBasisGradAtTargetEPoints("hgradBasisGradAtTargetEPoints",hgradBasis->getCardinality(), numTargetEPoints, faceDim); + + ordinal_type hgradCardinality = hgradBasis->getDofCount(faceDim,0); + + auto refBasisEPoints = Kokkos::create_mirror_view_and_copy(typename SpT::memory_space(),projStruct->getBasisEvalPoints(faceDim, iface)); + auto refTargetEPoints = Kokkos::create_mirror_view_and_copy(typename SpT::memory_space(),projStruct->getTargetEvalPoints(faceDim, iface)); + hgradBasis->getValues(hgradBasisGradAtBasisEPoints, refBasisEPoints, OPERATOR_GRAD); + hgradBasis->getValues(hgradBasisGradAtTargetEPoints, refTargetEPoints, OPERATOR_GRAD); + + ScalarViewType basisTanAtBasisEPoints("basisTanAtBasisEPoints",numCells,numFaceDofs, numBasisEPoints,dim-1); + ScalarViewType basisTanAtTargetEPoints("basisTanAtTargetEPoints",numCells,numFaceDofs, numTargetEPoints,dim-1); + ScalarViewType basisCurlNormalAtBasisCurlEPoints("normaBasisCurlAtBasisEPoints",numCells,numFaceDofs, numBasisCurlEPoints); + ScalarViewType wNormalBasisCurlAtBasisCurlEPoints("weightedNormalBasisCurlAtBasisEPoints",numCells,numFaceDofs, numBasisCurlEPoints); + + ScalarViewType targetTanAtTargetEPoints("targetTanAtTargetEPoints",numCells, numTargetEPoints, dim-1); + ScalarViewType normalTargetCurlAtTargetEPoints("normalTargetCurlAtTargetEPoints",numCells, numTargetCurlEPoints); + ScalarViewType wNormalBasisCurlBasisAtTargetCurlEPoints("weightedNormalBasisCurlAtTargetCurlEPoints",numCells,numFaceDofs, numTargetCurlEPoints); + + ScalarViewType wHgradBasisGradAtBasisEPoints("wHgradBasisGradAtBasisEPoints",numCells, hgradCardinality, numBasisEPoints, faceDim); + ScalarViewType wHgradBasisGradAtTargetEPoints("wHgradBasisGradAtTargetEPoints",numCells, hgradCardinality, numTargetEPoints, faceDim); + + ScalarViewType negPartialProjCurlNormal("mNormalComputedProjection", numCells,numBasisEPoints); + ScalarViewType negPartialProjTan("negPartialProjTan", numCells,numBasisEPoints,dim-1); + + + ordinal_type offsetBasis = basisEPointsRange(faceDim, iface).first; + ordinal_type offsetBasisCurl = basisCurlEPointsRange(faceDim, iface).first; + ordinal_type offsetTarget = targetEPointsRange(faceDim, iface).first; + ordinal_type offsetTargetCurl = targetCurlEPointsRange(faceDim, iface).first; + + auto hGradTagToOrdinal = Kokkos::create_mirror_view_and_copy(typename SpT::memory_space(), hgradBasis->getAllDofOrdinal()); + + auto basisEWeights = Kokkos::create_mirror_view_and_copy(typename SpT::memory_space(),projStruct->getBasisEvalWeights(faceDim,iface)); + auto targetEWeights = Kokkos::create_mirror_view_and_copy(typename SpT::memory_space(),projStruct->getTargetEvalWeights(faceDim,iface)); + auto targetCurlEWeights = Kokkos::create_mirror_view_and_copy(typename SpT::memory_space(),projStruct->getTargetDerivEvalWeights(faceDim,iface)); + auto basisCurlEWeights = Kokkos::create_mirror_view_and_copy(typename SpT::memory_space(),projStruct->getBasisDerivEvalWeights(faceDim,iface)); + typedef ComputeBasisCoeffsOnFaces_HCurl functorTypeFaces; + Kokkos::parallel_for(policy, functorTypeFaces(basisCoeffs, + orts, negPartialProjTan, negPartialProjCurlNormal, + hgradBasisGradAtBasisEPoints, wHgradBasisGradAtBasisEPoints, + basisCurlAtBasisCurlEPoints, basisCurlNormalAtBasisCurlEPoints, + basisAtBasisEPoints, + normalTargetCurlAtTargetEPoints, basisTanAtBasisEPoints, + hgradBasisGradAtTargetEPoints, wHgradBasisGradAtTargetEPoints, + wNormalBasisCurlAtBasisCurlEPoints, basisCurlAtTargetCurlEPoints, + wNormalBasisCurlBasisAtTargetCurlEPoints, targetAtTargetEPoints, + targetTanAtTargetEPoints, targetCurlAtTargetCurlEPoints, + basisEWeights, targetEWeights, + basisCurlEWeights, targetCurlEWeights, tagToOrdinal, + hGradTagToOrdinal, refTopologyKey, + refFacesNormal, refFacesTangents, + computedDofs, offsetBasis, + offsetBasisCurl, offsetTarget, + offsetTargetCurl, iface, + hgradCardinality, numFaces, + numFaceDofs, numEdgeDofs, + faceDim, dim)); + + + ScalarViewType faceMassMat_("faceMassMat_", numCells, numFaceDofs+hgradCardinality, numFaceDofs+hgradCardinality), + faceRhsMat_("rhsMat_", numCells, numFaceDofs+hgradCardinality); + range_type range_H(0, numFaceDofs); + range_type range_B(numFaceDofs, numFaceDofs+hgradCardinality); + FunctionSpaceTools::integrate(Kokkos::subview(faceMassMat_,Kokkos::ALL(),range_H,range_H), basisCurlNormalAtBasisCurlEPoints, wNormalBasisCurlAtBasisCurlEPoints); + FunctionSpaceTools::integrate(Kokkos::subview(faceMassMat_,Kokkos::ALL(),range_H,range_B), basisTanAtBasisEPoints, wHgradBasisGradAtBasisEPoints); - ScalarViewType targetCubWeights_("targetCubWeights_", 1, projStruct->getNumTargetEvalPoints(faceDim, iface)); - RealSpaceTools::clone(targetCubWeights_, projStruct->getTargetEvalWeights(faceDim, iface)); - ScalarViewType cubWeights_("cubWeights_", numCells, 1, numCubPoints); - RealSpaceTools::clone(cubWeights_, projStruct->getBasisEvalWeights(faceDim, iface)); - ArrayTools::scalarMultiplyDataField( wNormalBasisCurlAtElemCubPoints, Kokkos::subview(cubWeights_, Kokkos::ALL(),0, Kokkos::ALL()),normalBasisCurlAtElemCubPoints, false); - ArrayTools::scalarMultiplyDataField( wHgradBasisGradAtCubPoints, Kokkos::subview(cubWeights_, 0, Kokkos::ALL(), Kokkos::ALL()),internalHgradBasisGradAtCubPoints, false); - ArrayTools::scalarMultiplyDataField( wHgradBasisGradAtTargetCubPoints, targetCubWeights_, internalHgradBasisGradAtTargetCubPoints , false); + FunctionSpaceTools::integrate(Kokkos::subview(faceRhsMat_,Kokkos::ALL(),range_H), normalTargetCurlAtTargetEPoints, wNormalBasisCurlBasisAtTargetCurlEPoints); + FunctionSpaceTools::integrate(Kokkos::subview(faceRhsMat_,Kokkos::ALL(),range_H), negPartialProjCurlNormal, wNormalBasisCurlAtBasisCurlEPoints,true); - RealSpaceTools::clone(wHgradBasisGradAtCubPoints_,Kokkos::subview(wHgradBasisGradAtCubPoints,0,Kokkos::ALL(),Kokkos::ALL(),Kokkos::ALL())); - RealSpaceTools::clone(wHgradBasisGradAtTargetCubPoints_,Kokkos::subview(wHgradBasisGradAtTargetCubPoints,0,Kokkos::ALL(),Kokkos::ALL(),Kokkos::ALL())); + FunctionSpaceTools::integrate(Kokkos::subview(faceRhsMat_,Kokkos::ALL(),range_B), targetTanAtTargetEPoints, wHgradBasisGradAtTargetEPoints); + FunctionSpaceTools::integrate(Kokkos::subview(faceRhsMat_,Kokkos::ALL(),range_B), negPartialProjTan, wHgradBasisGradAtBasisEPoints,true); - range_type range_H(0, numFaceDofs); - range_type range_B(numFaceDofs, numFaceDofs+internalHgradCardinality); - FunctionSpaceTools::integrate(Kokkos::subview(faceMassMat_,Kokkos::ALL(),range_H,range_H), normalBasisCurlAtElemCubPoints, wNormalBasisCurlAtElemCubPoints); - FunctionSpaceTools::integrate(Kokkos::subview(faceMassMat_,Kokkos::ALL(),range_H,range_B), tanBasisAtElemCubPoints, wHgradBasisGradAtCubPoints_); - - FunctionSpaceTools::integrate(Kokkos::subview(faceRhsMat_,Kokkos::ALL(),range_H), normalTargetCurlAtTargetCubPoints, wNormalBasisCurlBasisAtTargetCurlCubPoints); - FunctionSpaceTools::integrate(Kokkos::subview(faceRhsMat_,Kokkos::ALL(),range_H), mNormalComputedProjectionCurl, wNormalBasisCurlAtElemCubPoints,true); - - FunctionSpaceTools::integrate(Kokkos::subview(faceRhsMat_,Kokkos::ALL(),range_B), tanTargetAtTargetCubPoints, wHgradBasisGradAtTargetCubPoints_); - FunctionSpaceTools::integrate(Kokkos::subview(faceRhsMat_,Kokkos::ALL(),range_B), mTanComputedProjection, wHgradBasisGradAtCubPoints_,true); - - Kokkos::View faceMassMat("faceMassMat", numFaceDofs+internalHgradCardinality,numFaceDofs+internalHgradCardinality); - Kokkos::View faceRhsMat("faceRhsMat",numFaceDofs+internalHgradCardinality, 1); - - Teuchos::LAPACK lapack; - ordinal_type info = 0; - Kokkos::View pivVec("pivVec", numFaceDofs+internalHgradCardinality, 1); - for(ordinal_type ic=0; ic>> ERROR (Intrepid::ProjectionTools::getBasisCoeffs): " - << "LAPACK return with error code: " - << info; - INTREPID2_TEST_FOR_EXCEPTION( true, std::runtime_error, ss.str().c_str() ); - } + typedef Kokkos::DynRankView WorkArrayViewType; + ScalarViewType t_("t",numCells, numFaceDofs+hgradCardinality); + WorkArrayViewType w_("w",numCells, numFaceDofs+hgradCardinality); - for(ordinal_type i=0; igetDofOrdinal(faceDim, iface, i); - basisCoeffs(ic,face_dof) = faceRhsMat(i,0); - } - } + auto faceDofs = Kokkos::subview(tagToOrdinal, faceDim, iface, Kokkos::ALL()); + ElemSystem faceSystem( "faceSystem", false); + faceSystem.solve(basisCoeffs, faceMassMat_, faceRhsMat_, t_, w_, faceDofs, numFaceDofs, hgradCardinality); for(ordinal_type i=0; igetDofOrdinal(faceDim, iface, i); @@ -551,163 +780,98 @@ ProjectionTools::getHCurlBasisCoeffs(Kokkos::DynRankViewgetDofCount(dim,0); - if(numElemDofs>0) { - if(name.find("HEX")!=std::string::npos) - hgradBasis = new Basis_HGRAD_HEX_Cn_FEM(cellBasis->getDegree()); - else if(name.find("TET")!=std::string::npos) - hgradBasis = new Basis_HGRAD_TET_Cn_FEM(cellBasis->getDegree(),POINTTYPE_WARPBLEND); - else if(name.find("TRI")!=std::string::npos) - hgradBasis = new Basis_HGRAD_TRI_Cn_FEM(cellBasis->getDegree(),POINTTYPE_WARPBLEND); - else if(name.find("QUAD")!=std::string::npos) - hgradBasis = new Basis_HGRAD_QUAD_Cn_FEM(cellBasis->getDegree(),POINTTYPE_WARPBLEND); + ordinal_type numCellDofs = cellBasis->getDofCount(dim,0); + if(numCellDofs>0) { + if(cellTopo.getKey() == shards::getCellTopologyData >()->key) + hgradBasis = new Basis_HGRAD_HEX_Cn_FEM(cellBasis->getDegree()); + else if(cellTopo.getKey() == shards::getCellTopologyData >()->key) + hgradBasis = new Basis_HGRAD_TET_Cn_FEM(cellBasis->getDegree(),POINTTYPE_WARPBLEND); + else if(cellTopo.getKey() == shards::getCellTopologyData >()->key) + hgradBasis = new Basis_HGRAD_TRI_Cn_FEM(cellBasis->getDegree(),POINTTYPE_WARPBLEND); + else if(cellTopo.getKey() == shards::getCellTopologyData >()->key) + hgradBasis = new Basis_HGRAD_QUAD_Cn_FEM(cellBasis->getDegree(),POINTTYPE_WARPBLEND); else { std::stringstream ss; ss << ">>> ERROR (Intrepid2::ProjectionTools::getHCurlBasisCoeffs): " << "Method not implemented for basis " << name; INTREPID2_TEST_FOR_EXCEPTION( true, std::runtime_error, ss.str().c_str() ); - return; - } - - range_type cellPointsRange = projStruct->getTargetPointsRange(dim, 0); - range_type cellCurlPointsRange = projStruct->getTargetDerivPointsRange(dim, 0); - - ordinal_type numTargetCurlCubPoints = projStruct->getNumTargetDerivEvalPoints(dim,0); - ordinal_type numCubPoints = projStruct->getNumBasisEvalPoints(dim,0); - ordinal_type numTargetCubPoints = projStruct->getNumTargetEvalPoints(dim,0); - - ScalarViewType hgradBasisGradAtCubPoints("hgradBasisGradAtCubPoints",hgradBasis->getCardinality(), numCubPoints, dim); - ScalarViewType hgradBasisGradAtTargetCubPoints("hgradBasisGradAtTargetCubPoints",hgradBasis->getCardinality(), numTargetCubPoints, dim); - - ordinal_type internalHgradCardinality = hgradBasis->getDofCount(dim,0); - ScalarViewType internalHgradBasisGradAtCubPoints("internalHgradBasisGradAtCubPoints",1, internalHgradCardinality, numCubPoints, dim); - ScalarViewType internalHgradBasisGradAtTargetCubPoints("internalHgradBasisGradAtTargetCubPoints",numCells, internalHgradCardinality, numTargetCubPoints, dim); - ScalarViewType wHgradBasisGradAtTargetCubPoints("wHgradBasisGradAtTargetCubPoints",numCells, internalHgradCardinality, numTargetCubPoints, dim); - ScalarViewType wHgradBasisGradAtCubPoints("wHgradBasisGradAtCubPoints",numCells, internalHgradCardinality, numCubPoints, dim); - - ScalarViewType targetEvalWeights = projStruct->getTargetEvalWeights(dim, 0); - ScalarViewType basisEvalWeights = projStruct->getBasisEvalWeights(dim, 0); - - hgradBasis->getValues(hgradBasisGradAtCubPoints,projStruct->getBasisEvalPoints(dim, 0), OPERATOR_GRAD); - hgradBasis->getValues(hgradBasisGradAtTargetCubPoints,projStruct->getTargetEvalPoints(dim, 0),OPERATOR_GRAD); - - for(ordinal_type j=0; j getDofOrdinal(dim, 0, j); - for(ordinal_type d=0; d getTargetDerivEvalWeights(dim, 0); - ordinal_type offsetBasis = projStruct->getBasisPointsRange(dim, 0).first; - ordinal_type offsetBasisCurl = projStruct->getBasisDerivPointsRange(dim, 0).first; - ordinal_type offsetTargetCurl = projStruct->getTargetDerivPointsRange(dim, 0).first; - - for(ordinal_type j=0; j getDofOrdinal(dim, 0, j); - for(ordinal_type ic=0; ic::integrate(Kokkos::subview(cellMassMat_,Kokkos::ALL(),range_H,range_H), internalBasisCurlAtElemcubPoints, wBasisCurlAtElemCubPoints); - FunctionSpaceTools::integrate(Kokkos::subview(cellMassMat_,Kokkos::ALL(),range_H,range_B), internalBasisAtElemcubPoints, wHgradBasisGradAtCubPoints); + range_type cellPointsRange = targetEPointsRange(dim, 0); + range_type cellCurlPointsRange = targetCurlEPointsRange(dim, 0); + + ordinal_type numTargetCurlEPoints = range_size(targetCurlEPointsRange(dim,0)); + ordinal_type numBasisCurlEPoints = range_size(basisCurlEPointsRange(dim,0)); + ordinal_type numBasisEPoints = range_size(basisEPointsRange(dim,0)); + ordinal_type numTargetEPoints = range_size(targetEPointsRange(dim,0)); + + ScalarViewType hgradBasisGradAtBasisEPoints("hgradBasisGradAtBasisEPoints",hgradBasis->getCardinality(), numBasisEPoints, dim); + ScalarViewType hgradBasisGradAtTargetEPoints("hgradBasisGradAtTargetEPoints",hgradBasis->getCardinality(), numTargetEPoints, dim); + + ordinal_type hgradCardinality = hgradBasis->getDofCount(dim,0); + ScalarViewType wHgradBasisGradAtTargetEPoints("wHgradBasisGradAtTargetEPoints",numCells, hgradCardinality, numTargetEPoints, dim); + ScalarViewType wHgradBasisGradAtBasisEPoints("wHgradBasisGradAtBasisEPoints",numCells, hgradCardinality, numBasisEPoints, dim); + + hgradBasis->getValues(hgradBasisGradAtBasisEPoints,Kokkos::subview(basisEPoints, 0, basisEPointsRange(dim, 0), Kokkos::ALL()), OPERATOR_GRAD); + hgradBasis->getValues(hgradBasisGradAtTargetEPoints,Kokkos::subview(targetEPoints, 0, targetEPointsRange(dim, 0), Kokkos::ALL()),OPERATOR_GRAD); + + ScalarViewType cellBasisAtBasisEPoints("basisCellAtEPoints",numCells,numCellDofs, numBasisEPoints, dim); + ScalarViewType cellBasisCurlAtCurlEPoints("cellBasisCurlAtCurlEPoints",numCells,numCellDofs, numBasisCurlEPoints, derDim); + ScalarViewType negPartialProjCurl("negPartialProjCurl", numCells, numBasisEPoints, derDim); + ScalarViewType negPartialProj("negPartialProj", numCells, numBasisEPoints, dim); + ScalarViewType wBasisCurlAtCurlEPoints("weightedBasisCurlAtBasisEPoints",numCells,numCellDofs, numBasisCurlEPoints,derDim); + ScalarViewType wBasisCurlBasisAtTargetCurlEPoints("weightedBasisCurlAtTargetCurlEPoints",numCells,numCellDofs, numTargetCurlEPoints,derDim); + + auto targetEWeights = Kokkos::create_mirror_view_and_copy(typename SpT::memory_space(),projStruct->getTargetEvalWeights(dim,0)); + auto basisEWeights = Kokkos::create_mirror_view_and_copy(typename SpT::memory_space(),projStruct->getBasisEvalWeights(dim,0)); + auto targetCurlEWeights = Kokkos::create_mirror_view_and_copy(typename SpT::memory_space(),projStruct->getTargetDerivEvalWeights(dim,0)); + auto basisCurlEWeights = Kokkos::create_mirror_view_and_copy(typename SpT::memory_space(),projStruct->getBasisDerivEvalWeights(dim,0)); + ordinal_type offsetBasis = basisEPointsRange(dim, 0).first; + ordinal_type offsetBasisCurl = basisCurlEPointsRange(dim, 0).first; + ordinal_type offsetTargetCurl = targetCurlEPointsRange(dim, 0).first; + + + auto hGradTagToOrdinal = Kokkos::create_mirror_view_and_copy(typename SpT::memory_space(), hgradBasis->getAllDofOrdinal()); + + typedef ComputeBasisCoeffsOnCell_HCurl functorTypeCell; + Kokkos::parallel_for(policy, functorTypeCell(basisCoeffs, negPartialProj, negPartialProjCurl, + cellBasisAtBasisEPoints, cellBasisCurlAtCurlEPoints, + basisAtBasisEPoints, hgradBasisGradAtBasisEPoints, basisCurlAtBasisCurlEPoints, + hgradBasisGradAtTargetEPoints, basisCurlAtTargetCurlEPoints, + basisEWeights, basisCurlEWeights, wHgradBasisGradAtBasisEPoints, + wBasisCurlAtCurlEPoints, targetEWeights, targetCurlEWeights, + wHgradBasisGradAtTargetEPoints, + wBasisCurlBasisAtTargetCurlEPoints, computedDofs, + tagToOrdinal, hGradTagToOrdinal, + numCellDofs, hgradCardinality, + offsetBasis, offsetBasisCurl, offsetTargetCurl, + numEdgeDofs+numFaceDofs, dim, derDim)); + + ScalarViewType cellMassMat_("cellMassMat_", numCells, numCellDofs+hgradCardinality, numCellDofs+hgradCardinality), + cellRhsMat_("rhsMat_", numCells, numCellDofs+hgradCardinality); + + range_type range_H(0, numCellDofs); + range_type range_B(numCellDofs, numCellDofs+hgradCardinality); + FunctionSpaceTools::integrate(Kokkos::subview(cellMassMat_,Kokkos::ALL(),range_H,range_H), cellBasisCurlAtCurlEPoints, wBasisCurlAtCurlEPoints); + FunctionSpaceTools::integrate(Kokkos::subview(cellMassMat_,Kokkos::ALL(),range_H,range_B), cellBasisAtBasisEPoints, wHgradBasisGradAtBasisEPoints); if(dim==3) - FunctionSpaceTools::integrate(Kokkos::subview(cellRhsMat_,Kokkos::ALL(),range_H), Kokkos::subview(targetCurlAtCurlEvalPoints,Kokkos::ALL(),cellCurlPointsRange,Kokkos::ALL()), wBasisCurlBasisAtTargetCurlCubPoints); + FunctionSpaceTools::integrate(Kokkos::subview(cellRhsMat_,Kokkos::ALL(),range_H), Kokkos::subview(targetCurlAtTargetCurlEPoints,Kokkos::ALL(),cellCurlPointsRange,Kokkos::ALL()), wBasisCurlBasisAtTargetCurlEPoints); else - FunctionSpaceTools::integrate(Kokkos::subview(cellRhsMat_,Kokkos::ALL(),range_H), Kokkos::subview(targetCurlAtCurlEvalPoints,Kokkos::ALL(),cellCurlPointsRange), Kokkos::subview(wBasisCurlBasisAtTargetCurlCubPoints,Kokkos::ALL(),Kokkos::ALL(),Kokkos::ALL(),0)); - FunctionSpaceTools::integrate(Kokkos::subview(cellRhsMat_,Kokkos::ALL(),range_H), mComputedProjectionCurl, wBasisCurlAtElemCubPoints, true); + FunctionSpaceTools::integrate(Kokkos::subview(cellRhsMat_,Kokkos::ALL(),range_H), Kokkos::subview(targetCurlAtTargetCurlEPoints,Kokkos::ALL(),cellCurlPointsRange), Kokkos::subview(wBasisCurlBasisAtTargetCurlEPoints,Kokkos::ALL(),Kokkos::ALL(),Kokkos::ALL(),0)); + FunctionSpaceTools::integrate(Kokkos::subview(cellRhsMat_,Kokkos::ALL(),range_H), negPartialProjCurl, wBasisCurlAtCurlEPoints, true); - FunctionSpaceTools::integrate(Kokkos::subview(cellRhsMat_,Kokkos::ALL(),range_B), Kokkos::subview(targetAtEvalPoints,Kokkos::ALL(),cellPointsRange,Kokkos::ALL()), wHgradBasisGradAtTargetCubPoints); - FunctionSpaceTools::integrate(Kokkos::subview(cellRhsMat_,Kokkos::ALL(),range_B), mComputedProjection, wHgradBasisGradAtCubPoints, true); + FunctionSpaceTools::integrate(Kokkos::subview(cellRhsMat_,Kokkos::ALL(),range_B), Kokkos::subview(targetAtTargetEPoints,Kokkos::ALL(),cellPointsRange,Kokkos::ALL()), wHgradBasisGradAtTargetEPoints); + FunctionSpaceTools::integrate(Kokkos::subview(cellRhsMat_,Kokkos::ALL(),range_B), negPartialProj, wHgradBasisGradAtBasisEPoints, true); - Kokkos::View cellMassMat("cellMassMat", numElemDofs+internalHgradCardinality,numElemDofs+internalHgradCardinality); - Kokkos::View cellRhsMat("cellRhsMat",numElemDofs+internalHgradCardinality, 1); + typedef Kokkos::DynRankView WorkArrayViewType; + ScalarViewType t_("t",numCells, numCellDofs+hgradCardinality); + WorkArrayViewType w_("w",numCells, numCellDofs+hgradCardinality); - Teuchos::LAPACK lapack; - ordinal_type info = 0; - Kokkos::View pivVec("pivVec", numElemDofs+internalHgradCardinality, 1); - - for(ordinal_type ic=0; icgetDofOrdinal(dim, 0, i); - basisCoeffs(ic,idof) = cellRhsMat(i,0); - } - - if (info) { - std::stringstream ss; - ss << ">>> ERROR (Intrepid::ProjectionTools::getBasisCoeffs): " - << "LAPACK return with error code: " - << info; - INTREPID2_TEST_FOR_EXCEPTION( true, std::runtime_error, ss.str().c_str() ); - } - } delete hgradBasis; } } diff --git a/packages/intrepid2/src/Projection/Intrepid2_ProjectionToolsDefHDIV.hpp b/packages/intrepid2/src/Projection/Intrepid2_ProjectionToolsDefHDIV.hpp index 77cb323e7a9b..66f74efd33a8 100644 --- a/packages/intrepid2/src/Projection/Intrepid2_ProjectionToolsDefHDIV.hpp +++ b/packages/intrepid2/src/Projection/Intrepid2_ProjectionToolsDefHDIV.hpp @@ -58,12 +58,196 @@ namespace Intrepid2 { namespace Experimental { +template +struct ComputeBasisCoeffsOnSides_HDiv { + const ViewType1 sideBasisNormalAtBasisEPoints_; + const ViewType1 basisAtBasisEPoints_; + const ViewType2 basisEWeights_; + const ViewType1 wBasisDofAtBasisEPoints_; + const ViewType2 targetEWeights_; + const ViewType1 basisAtTargetEPoints_; + const ViewType1 wBasisDofAtTargetEPoints_; + const ViewType3 tagToOrdinal_; + const ViewType1 targetAtEPoints_; + const ViewType1 targetAtTargetEPoints_; + const ViewType1 refSidesNormal_; + ordinal_type sideCardinality_; + ordinal_type offsetBasis_; + ordinal_type offsetTarget_; + ordinal_type sideDim_; + ordinal_type dim_; + ordinal_type iside_; + + ComputeBasisCoeffsOnSides_HDiv(const ViewType1 sideBasisNormalAtBasisEPoints, + const ViewType1 basisAtBasisEPoints, const ViewType2 basisEWeights, const ViewType1 wBasisDofAtBasisEPoints, const ViewType2 targetEWeights, + const ViewType1 basisAtTargetEPoints, const ViewType1 wBasisDofAtTargetEvalPoint, const ViewType3 tagToOrdinal, + const ViewType1 targetAtEPoints, const ViewType1 targetAtTargetEPoints, + const ViewType1 refSidesNormal, ordinal_type sideCardinality, ordinal_type offsetBasis, + ordinal_type offsetTarget, ordinal_type sideDim, + ordinal_type dim, ordinal_type iside) : + sideBasisNormalAtBasisEPoints_(sideBasisNormalAtBasisEPoints), + basisAtBasisEPoints_(basisAtBasisEPoints), basisEWeights_(basisEWeights), wBasisDofAtBasisEPoints_(wBasisDofAtBasisEPoints), targetEWeights_(targetEWeights), + basisAtTargetEPoints_(basisAtTargetEPoints), wBasisDofAtTargetEPoints_(wBasisDofAtTargetEvalPoint), + tagToOrdinal_(tagToOrdinal), targetAtEPoints_(targetAtEPoints), + targetAtTargetEPoints_(targetAtTargetEPoints), + refSidesNormal_(refSidesNormal), sideCardinality_(sideCardinality), offsetBasis_(offsetBasis), + offsetTarget_(offsetTarget), sideDim_(sideDim), dim_(dim), iside_(iside) + {} + + void + KOKKOS_INLINE_FUNCTION + operator()(const ordinal_type ic) const { + + //Note: we are not considering the jacobian of the orientation map since it is simply a scalar term for the integrals and it does not affect the projection + for(ordinal_type j=0; j +struct ComputeBasisCoeffsOnCells_HDiv { + const ViewType1 basisCoeffs_; + const ViewType2 negPartialProjAtBasisEPoints_; + const ViewType2 nonWeightedBasisAtBasisEPoints_; + const ViewType2 basisAtBasisEPoints_; + const ViewType3 basisEWeights_; + const ViewType2 wBasisAtBasisEPoints_; + const ViewType3 targetEWeights_; + const ViewType2 basisAtTargetEPoints_; + const ViewType2 wBasisAtTargetEPoints_; + const ViewType4 computedDofs_; + const ViewType5 cellDof_; + ordinal_type numCellDofs_; + ordinal_type offsetBasis_; + ordinal_type offsetTarget_; + ordinal_type numSideDofs_; + + ComputeBasisCoeffsOnCells_HDiv(const ViewType1 basisCoeffs, ViewType2 negPartialProjAtBasisEPoints, const ViewType2 nonWeightedBasisAtBasisEPoints, + const ViewType2 basisAtBasisEPoints, const ViewType3 basisEWeights, const ViewType2 wBasisAtBasisEPoints, const ViewType3 targetEWeights, + const ViewType2 basisAtTargetEPoints, const ViewType2 wBasisAtTargetEPoints, const ViewType4 computedDofs, const ViewType5 cellDof, + ordinal_type numCellDofs, ordinal_type offsetBasis, ordinal_type offsetTarget, ordinal_type numSideDofs) : + basisCoeffs_(basisCoeffs), negPartialProjAtBasisEPoints_(negPartialProjAtBasisEPoints), nonWeightedBasisAtBasisEPoints_(nonWeightedBasisAtBasisEPoints), + basisAtBasisEPoints_(basisAtBasisEPoints), basisEWeights_(basisEWeights), wBasisAtBasisEPoints_(wBasisAtBasisEPoints), targetEWeights_(targetEWeights), + basisAtTargetEPoints_(basisAtTargetEPoints), wBasisAtTargetEPoints_(wBasisAtTargetEPoints), + computedDofs_(computedDofs), cellDof_(cellDof),numCellDofs_(numCellDofs), offsetBasis_(offsetBasis), + offsetTarget_(offsetTarget), numSideDofs_(numSideDofs) {} + + void + KOKKOS_INLINE_FUNCTION + operator()(const ordinal_type ic) const { + + for(ordinal_type j=0; j +struct ComputeHCurlBasisCoeffsOnCells_HDiv { + const ViewType1 basisCoeffs_; + const ViewType2 negPartialProjAtBasisEPoints_; + const ViewType2 nonWeightedBasisAtBasisEPoints_; + const ViewType2 basisAtBasisEPoints_; + const ViewType2 hcurlBasisCurlAtBasisEPoints_; + const ViewType3 basisEWeights_; + const ViewType2 wHCurlBasisAtBasisEPoints_; + const ViewType3 targetEWeights_; + const ViewType2 hcurlBasisCurlAtTargetEPoints_; + const ViewType2 wHCurlBasisAtTargetEPoints_; + const ViewType4 tagToOrdinal_; + const ViewType5 computedDofs_; + const ViewType6 hCurlDof_; + ordinal_type numCellDofs_; + ordinal_type offsetBasis_; + ordinal_type numSideDofs_; + ordinal_type dim_; + + ComputeHCurlBasisCoeffsOnCells_HDiv(const ViewType1 basisCoeffs, ViewType2 negPartialProjAtBasisEPoints, const ViewType2 nonWeightedBasisAtBasisEPoints, + const ViewType2 basisAtBasisEPoints, const ViewType2 hcurlBasisCurlAtBasisEPoints, const ViewType3 basisEWeights, const ViewType2 wHCurlBasisAtBasisEPoints, const ViewType3 targetEWeights, + const ViewType2 hcurlBasisCurlAtTargetEPoints, const ViewType2 wHCurlBasisAtTargetEPoints, const ViewType4 tagToOrdinal, const ViewType5 computedDofs, const ViewType6 hCurlDof, + ordinal_type numCellDofs, ordinal_type offsetBasis, ordinal_type numSideDofs, ordinal_type dim) : + basisCoeffs_(basisCoeffs), negPartialProjAtBasisEPoints_(negPartialProjAtBasisEPoints), nonWeightedBasisAtBasisEPoints_(nonWeightedBasisAtBasisEPoints), + basisAtBasisEPoints_(basisAtBasisEPoints), hcurlBasisCurlAtBasisEPoints_(hcurlBasisCurlAtBasisEPoints), basisEWeights_(basisEWeights), wHCurlBasisAtBasisEPoints_(wHCurlBasisAtBasisEPoints), targetEWeights_(targetEWeights), + hcurlBasisCurlAtTargetEPoints_(hcurlBasisCurlAtTargetEPoints), wHCurlBasisAtTargetEPoints_(wHCurlBasisAtTargetEPoints), + tagToOrdinal_(tagToOrdinal), computedDofs_(computedDofs), hCurlDof_(hCurlDof),numCellDofs_(numCellDofs), offsetBasis_(offsetBasis), + numSideDofs_(numSideDofs), dim_(dim) {} + + void + KOKKOS_INLINE_FUNCTION + operator()(const ordinal_type ic) const { + + ordinal_type numBasisEPoints = basisEWeights_.extent(0); + + for(ordinal_type i=0; i(hCurlDof_.extent(0)); ++i) { + ordinal_type idof = hCurlDof_(i); + for(ordinal_type d=0; d(targetEWeights_.extent(0)); ++iq) { + wHCurlBasisAtTargetEPoints_(ic,i,iq,d) = hcurlBasisCurlAtTargetEPoints_(idof,iq,d)*targetEWeights_(iq); + } + } + } + } +}; + + template template void -ProjectionTools::getHDivEvaluationPoints(typename BasisType::ScalarViewType evaluationPoints, - typename BasisType::ScalarViewType extDerivEvaluationPoints, +ProjectionTools::getHDivEvaluationPoints(typename BasisType::ScalarViewType targetEPoints, + typename BasisType::ScalarViewType targetDivEPoints, const Kokkos::DynRankView orts, const BasisType* cellBasis, ProjectionStruct * projStruct, @@ -71,67 +255,63 @@ ProjectionTools::getHDivEvaluationPoints(typename BasisType::ScalarViewType typedef typename BasisType::scalarType scalarType; typedef Kokkos::DynRankView ScalarViewType; typedef Kokkos::pair range_type; + auto refTopologyKey = Kokkos::create_mirror_view_and_copy(typename SpT::memory_space(),projStruct->getTopologyKey()); + //const auto cellTopoKey = cellBasis->getBaseCellTopology().getKey(); ordinal_type dim = cellBasis->getBaseCellTopology().getDimension(); ordinal_type sideDim = dim-1; ordinal_type numSides = cellBasis->getBaseCellTopology().getSideCount(); ordinal_type numCells = orts.extent(0); - Kokkos::DynRankView sOrt("sOrt", numSides); + + CellTools::setSubcellParametrization(); + typename CellTools::subcellParamViewType subcellParamSide; + if(numSides>0) + CellTools::getSubcellParametrization(subcellParamSide, sideDim, cellBasis->getBaseCellTopology()); + + auto evalPointsRange = Kokkos::create_mirror_view_and_copy(typename SpT::memory_space(),projStruct->getPointsRange(evalPointType)); for(ordinal_type is=0; isgetTargetPointsRange(sideDim, is); - sideCubPoints = projStruct->getTargetEvalPoints(sideDim, is); - } - else { - sidePointsRange = projStruct->getBasisPointsRange(sideDim, is); - sideCubPoints = projStruct->getBasisEvalPoints(sideDim, is); - } + ScalarViewType sideWorkview("sideWorkview", numCells, projStruct->getMaxNumEvalPoints(evalPointType), sideDim); - ScalarViewType orientedTargetCubPoints("orientedTargetCubPoints", sideCubPoints.extent(0),sideDim); + const auto topoKey = refTopologyKey(sideDim,is); + auto sideBasisEPoints = Kokkos::create_mirror_view_and_copy(typename SpT::memory_space(),projStruct->getEvalPoints(sideDim,is,evalPointType)); - const auto topoKey = projStruct->getTopologyKey(sideDim,is); + Kokkos::parallel_for + ("Evaluate Points Sides ", + Kokkos::RangePolicy (0, numCells), + KOKKOS_LAMBDA (const size_t ic) { + auto sidePointsRange = evalPointsRange(sideDim, is); + auto sideRefPointsRange = range_type(0, range_size(sidePointsRange)); + auto orientedBasisEPoints = Kokkos::subview(sideWorkview, ic, sideRefPointsRange, range_type(0,sideDim)); - for(ordinal_type ic=0; ic::mapToReferenceSubcell(Kokkos::subview(evaluationPoints,ic,sidePointsRange,Kokkos::ALL()), orientedTargetCubPoints, sideDim, is, cellBasis->getBaseCellTopology()); - } + orts(ic).getEdgeOrientation(sOrt, numSides); + ordinal_type ort = sOrt[is]; + + Impl::OrientationTools::mapToModifiedReference(orientedBasisEPoints,sideBasisEPoints,topoKey,ort); + CellTools::mapToReferenceSubcell(Kokkos::subview(targetEPoints,ic,sidePointsRange,Kokkos::ALL()), orientedBasisEPoints, subcellParamSide, sideDim, is, dim); + }); } if(cellBasis->getDofCount(dim,0) <= 0) return; - range_type cellDivPointsRange; - ScalarViewType divCubPoints; - if(evalPointType == TARGET) { - divCubPoints = projStruct->getTargetDerivEvalPoints(dim, 0); - cellDivPointsRange = projStruct->getTargetDerivPointsRange(dim, 0); - } else { - divCubPoints = projStruct->getBasisDerivEvalPoints(dim, 0); - cellDivPointsRange = projStruct->getBasisDerivPointsRange(dim, 0); - } - RealSpaceTools::clone(Kokkos::subview(extDerivEvaluationPoints, Kokkos::ALL(), cellDivPointsRange, Kokkos::ALL()), divCubPoints); + auto evalDivPointsRange = Kokkos::create_mirror_view_and_copy(typename SpT::memory_space(),projStruct->getDerivPointsRange(evalPointType)); + auto cellDivPointsRange = evalDivPointsRange(dim, 0); + auto cellBasisDivEPoints = Kokkos::create_mirror_view_and_copy(typename SpT::memory_space(),projStruct->getDerivEvalPoints(dim,0,evalPointType)); + + RealSpaceTools::clone(Kokkos::subview(targetDivEPoints, Kokkos::ALL(), cellDivPointsRange, Kokkos::ALL()), cellBasisDivEPoints); + if(projStruct->getTargetEvalPoints(dim, 0).data() != NULL) { - range_type cellPointsRange; - ScalarViewType cubPoints; - if(evalPointType == TARGET) { - cubPoints = projStruct->getTargetEvalPoints(dim, 0); - cellPointsRange = projStruct->getTargetPointsRange(dim, 0); - } else { - cubPoints = projStruct->getBasisEvalPoints(dim, 0); - cellPointsRange = projStruct->getBasisPointsRange(dim, 0); - } - RealSpaceTools::clone(Kokkos::subview(evaluationPoints, Kokkos::ALL(), cellPointsRange, Kokkos::ALL()), cubPoints); + auto cellPointsRange = evalPointsRange(dim, 0); + auto cellBasisEPoints = Kokkos::create_mirror_view_and_copy(typename SpT::memory_space(),projStruct->getEvalPoints(dim,0,evalPointType)); + RealSpaceTools::clone(Kokkos::subview(targetEPoints, Kokkos::ALL(), cellPointsRange, Kokkos::ALL()), cellBasisEPoints); } } @@ -143,23 +323,22 @@ typename BasisType, typename ortValueType,class ...ortProperties> void ProjectionTools::getHDivBasisCoeffs(Kokkos::DynRankView basisCoeffs, - const Kokkos::DynRankView targetAtEvalPoints, - const Kokkos::DynRankView targetDivAtDivEvalPoints, - const typename BasisType::ScalarViewType evaluationPoints, - const typename BasisType::ScalarViewType extDerivEvaluationPoints, + const Kokkos::DynRankView targetAtEPoints, + const Kokkos::DynRankView targetDivAtDivEPoints, + const typename BasisType::ScalarViewType targetEPoints, + const typename BasisType::ScalarViewType targetDivEPoints, const Kokkos::DynRankView orts, const BasisType* cellBasis, ProjectionStruct * projStruct){ - typedef typename Kokkos::Impl::is_space::host_mirror_space::execution_space host_space_type; typedef typename BasisType::scalarType scalarType; typedef Kokkos::DynRankView ScalarViewType; typedef Kokkos::pair range_type; const auto cellTopo = cellBasis->getBaseCellTopology(); ordinal_type dim = cellTopo.getDimension(); - ordinal_type numTotalEvaluationPoints(targetAtEvalPoints.extent(1)), - numTotalDivEvaluationPoints(targetDivAtDivEvalPoints.extent(1)); + ordinal_type numTotalEvaluationPoints(targetAtEPoints.extent(1)), + numTotalDivEvaluationPoints(targetDivAtDivEPoints.extent(1)); ordinal_type basisCardinality = cellBasis->getCardinality(); - ordinal_type numCells = targetAtEvalPoints.extent(0); + ordinal_type numCells = targetAtEPoints.extent(0); const ordinal_type sideDim = dim-1; const std::string& name = cellBasis->getName(); @@ -171,165 +350,130 @@ ProjectionTools::getHDivBasisCoeffs(Kokkos::DynRankViewgetDofCount(sideDim,is); - Kokkos::View computedDofs("computedDofs",numSideDofs); + Kokkos::View computedDofs("computedDofs",numSideDofs); - ordinal_type computedDofsCount = 0; + const Kokkos::RangePolicy policy(0, numCells); + + auto targetEPointsRange = Kokkos::create_mirror_view_and_copy(typename SpT::memory_space(),projStruct->getTargetPointsRange()); + auto basisEPointsRange = Kokkos::create_mirror_view_and_copy(typename SpT::memory_space(),projStruct->getBasisPointsRange()); - ordinal_type numTotalCubPoints = projStruct->getNumBasisEvalPoints(), numTotalDivCubPoints = projStruct->getNumBasisDerivEvalPoints(); - ScalarViewType cubPoints_("cubPoints",numCells,numTotalCubPoints, dim); - ScalarViewType divCubPoints("divCubPoints",numCells,numTotalDivCubPoints, dim); - getHDivEvaluationPoints(cubPoints_, divCubPoints, orts, cellBasis, projStruct, BASIS); + auto tagToOrdinal = Kokkos::create_mirror_view_and_copy(typename SpT::memory_space(), cellBasis->getAllDofOrdinal()); - ScalarViewType basisAtCubPoints("basisAtCubPoints",numCells,basisCardinality, numTotalCubPoints, dim); - ScalarViewType basisAtTargetCubPoints("basisAtTargetCubPoints",numCells,basisCardinality, numTotalEvaluationPoints, dim); + ordinal_type numTotalBasisEPoints = projStruct->getNumBasisEvalPoints(), numTotalBasisDivEPoints = projStruct->getNumBasisDerivEvalPoints(); + ScalarViewType basisEPoints_("basisEPoints",numCells,numTotalBasisEPoints, dim); + ScalarViewType basisDivEPoints("basisDivEPoints",numCells,numTotalBasisDivEPoints, dim); + getHDivEvaluationPoints(basisEPoints_, basisDivEPoints, orts, cellBasis, projStruct, EvalPointsType::BASIS); + + ScalarViewType basisAtBasisEPoints("basisAtBasisEPoints",numCells,basisCardinality, numTotalBasisEPoints, dim); + ScalarViewType basisAtTargetEPoints("basisAtTargetEPoints",numCells,basisCardinality, numTotalEvaluationPoints, dim); { - ScalarViewType nonOrientedBasisAtCubPoints("nonOrientedBasisAtCubPoints",numCells,basisCardinality, numTotalCubPoints, dim); - ScalarViewType nonOrientedBasisAtTargetCubPoints("nonOrientedBasisAtTargetCubPoints",numCells,basisCardinality, numTotalEvaluationPoints, dim); + ScalarViewType nonOrientedBasisAtBasisEPoints("nonOrientedBasisAtBasisEPoints",numCells,basisCardinality, numTotalBasisEPoints, dim); + ScalarViewType nonOrientedBasisAtTargetEPoints("nonOrientedBasisAtTargetEPoints",numCells,basisCardinality, numTotalEvaluationPoints, dim); for(ordinal_type ic=0; icgetValues(Kokkos::subview(nonOrientedBasisAtTargetCubPoints,ic,Kokkos::ALL(),Kokkos::ALL(),Kokkos::ALL()), Kokkos::subview(evaluationPoints, ic, Kokkos::ALL(), Kokkos::ALL())); - cellBasis->getValues(Kokkos::subview(nonOrientedBasisAtCubPoints,ic,Kokkos::ALL(),Kokkos::ALL(),Kokkos::ALL()), Kokkos::subview(cubPoints_, ic, Kokkos::ALL(), Kokkos::ALL())); + cellBasis->getValues(Kokkos::subview(nonOrientedBasisAtTargetEPoints,ic,Kokkos::ALL(),Kokkos::ALL(),Kokkos::ALL()), Kokkos::subview(targetEPoints, ic, Kokkos::ALL(), Kokkos::ALL())); + cellBasis->getValues(Kokkos::subview(nonOrientedBasisAtBasisEPoints,ic,Kokkos::ALL(),Kokkos::ALL(),Kokkos::ALL()), Kokkos::subview(basisEPoints_, ic, Kokkos::ALL(), Kokkos::ALL())); } - OrientationTools::modifyBasisByOrientation(basisAtCubPoints, nonOrientedBasisAtCubPoints, orts, cellBasis); - OrientationTools::modifyBasisByOrientation(basisAtTargetCubPoints, nonOrientedBasisAtTargetCubPoints, orts, cellBasis); + OrientationTools::modifyBasisByOrientation(basisAtBasisEPoints, nonOrientedBasisAtBasisEPoints, orts, cellBasis); + OrientationTools::modifyBasisByOrientation(basisAtTargetEPoints, nonOrientedBasisAtTargetEPoints, orts, cellBasis); } - ScalarViewType basisDivAtDivCubPoints; - ScalarViewType basisDivAtTargetDivCubPoints; + ScalarViewType basisDivAtBasisDivEPoints; + ScalarViewType basisDivAtTargetDivEPoints; if(numTotalDivEvaluationPoints>0) { - ScalarViewType nonOrientedBasisDivAtTargetDivCubPoints, nonOrientedBasisDivAtDivCubPoints; - basisDivAtDivCubPoints = ScalarViewType ("basisDivAtDivCubPoints",numCells,basisCardinality, numTotalDivCubPoints); - nonOrientedBasisDivAtDivCubPoints = ScalarViewType ("nonOrientedBasisDivAtDivCubPoints",numCells,basisCardinality, numTotalDivCubPoints); - basisDivAtTargetDivCubPoints = ScalarViewType("basisDivAtTargetDivCubPoints",numCells,basisCardinality, numTotalDivEvaluationPoints); - nonOrientedBasisDivAtTargetDivCubPoints = ScalarViewType("nonOrientedBasisDivAtTargetDivCubPoints",numCells,basisCardinality, numTotalDivEvaluationPoints); + ScalarViewType nonOrientedBasisDivAtTargetDivEPoints, nonOrientedBasisDivAtBasisDivEPoints; + basisDivAtBasisDivEPoints = ScalarViewType ("basisDivAtBasisDivEPoints",numCells,basisCardinality, numTotalBasisDivEPoints); + nonOrientedBasisDivAtBasisDivEPoints = ScalarViewType ("nonOrientedBasisDivAtBasisDivEPoints",numCells,basisCardinality, numTotalBasisDivEPoints); + basisDivAtTargetDivEPoints = ScalarViewType("basisDivAtTargetDivEPoints",numCells,basisCardinality, numTotalDivEvaluationPoints); + nonOrientedBasisDivAtTargetDivEPoints = ScalarViewType("nonOrientedBasisDivAtTargetDivEPoints",numCells,basisCardinality, numTotalDivEvaluationPoints); for(ordinal_type ic=0; icgetValues(Kokkos::subview(nonOrientedBasisDivAtDivCubPoints,ic,Kokkos::ALL(),Kokkos::ALL()), Kokkos::subview(divCubPoints, ic, Kokkos::ALL(), Kokkos::ALL()),OPERATOR_DIV); - cellBasis->getValues(Kokkos::subview(nonOrientedBasisDivAtTargetDivCubPoints,ic,Kokkos::ALL(),Kokkos::ALL()), Kokkos::subview(extDerivEvaluationPoints, ic, Kokkos::ALL(), Kokkos::ALL()),OPERATOR_DIV); + cellBasis->getValues(Kokkos::subview(nonOrientedBasisDivAtBasisDivEPoints,ic,Kokkos::ALL(),Kokkos::ALL()), Kokkos::subview(basisDivEPoints, ic, Kokkos::ALL(), Kokkos::ALL()),OPERATOR_DIV); + cellBasis->getValues(Kokkos::subview(nonOrientedBasisDivAtTargetDivEPoints,ic,Kokkos::ALL(),Kokkos::ALL()), Kokkos::subview(targetDivEPoints, ic, Kokkos::ALL(), Kokkos::ALL()),OPERATOR_DIV); } - OrientationTools::modifyBasisByOrientation(basisDivAtDivCubPoints, nonOrientedBasisDivAtDivCubPoints, orts, cellBasis); - OrientationTools::modifyBasisByOrientation(basisDivAtTargetDivCubPoints, nonOrientedBasisDivAtTargetDivCubPoints, orts, cellBasis); + OrientationTools::modifyBasisByOrientation(basisDivAtBasisDivEPoints, nonOrientedBasisDivAtBasisDivEPoints, orts, cellBasis); + OrientationTools::modifyBasisByOrientation(basisDivAtTargetDivEPoints, nonOrientedBasisDivAtTargetDivEPoints, orts, cellBasis); } - + ScalarViewType refSidesNormal("refSidesNormal", numSides, dim); + ordinal_type computedDofsCount = 0; for(ordinal_type is=0; isgetDofCount(sideDim,is); - ordinal_type numCubPoints = projStruct->getNumBasisEvalPoints(sideDim,is); - ordinal_type numTargetCubPoints = projStruct->getNumTargetEvalPoints(sideDim,is); + + ordinal_type numTargetEPoints = range_size(targetEPointsRange(sideDim,is)); + ordinal_type numBasisEPoints = range_size(basisEPointsRange(sideDim,is)); for(ordinal_type i=0; igetDofOrdinal(sideDim, is, i); - CellTools::getReferenceSideNormal(refSideNormal, is, cellBasis->getBaseCellTopology()); + auto sideNormal = Kokkos::subview(refSidesNormal,is,Kokkos::ALL()); + auto sideNormalHost = Kokkos::create_mirror_view(sideNormal); + CellTools::getReferenceSideNormal(sideNormalHost, is, cellTopo); + Kokkos::deep_copy(sideNormal, sideNormalHost); - ScalarViewType normalBasisAtElemcubPoints("normalBasisAtElemcubPoints",numCells,sideCardinality, numCubPoints); - ScalarViewType normalBasisAtTargetcubPoints("normalBasisAtTargetcubPoints",numCells,sideCardinality, numTargetCubPoints); - ScalarViewType weightedNormalBasisAtElemcubPoints("weightedNormalBasisAtElemcubPoints",numCells,sideCardinality, numCubPoints); - ScalarViewType weightedNormalBasisAtTargetcubPoints("weightedNormalBasisAtTargetcubPoints",numCells,sideCardinality, numTargetCubPoints); - ScalarViewType normalTargetAtTargetcubPoints("normalTargetAtTargetcubPoints",numCells, numTargetCubPoints); + ScalarViewType basisNormalAtBasisEPoints("normalBasisAtBasisEPoints",numCells,sideCardinality, numBasisEPoints); + ScalarViewType wBasisNormalAtBasisEPoints("wBasisNormalAtBasisEPoints",numCells,sideCardinality, numBasisEPoints); + ScalarViewType wBasisNormalAtTargetEPoints("wBasisNormalAtTargetEPoints",numCells,sideCardinality, numTargetEPoints); + ScalarViewType targetNormalAtTargetEPoints("targetNormalAtTargetEPoints",numCells, numTargetEPoints); - ScalarViewType targetEvalWeights = projStruct->getTargetEvalWeights(sideDim, is); - ScalarViewType basisEvalWeights = projStruct->getBasisEvalWeights(sideDim, is); + ordinal_type offsetBasis = basisEPointsRange(sideDim,is).first; + ordinal_type offsetTarget = targetEPointsRange(sideDim,is).first; + auto targetEWeights = Kokkos::create_mirror_view_and_copy(typename SpT::memory_space(),projStruct->getTargetEvalWeights(sideDim,is)); + auto basisEWeights = Kokkos::create_mirror_view_and_copy(typename SpT::memory_space(),projStruct->getBasisEvalWeights(sideDim,is)); - //Note: we are not considering the jacobian of the orientation map since it is simply a scalar term for the integrals and it does not affect the projection - ordinal_type offsetBasis = projStruct->getBasisPointsRange(sideDim, is).first; - ordinal_type offsetTarget = projStruct->getTargetPointsRange(sideDim, is).first; - for(ordinal_type ic=0; icgetDofOrdinal(sideDim, is, j); - for(ordinal_type iq=0; iq functorTypeSide; + Kokkos::parallel_for(policy, functorTypeSide(basisNormalAtBasisEPoints, basisAtBasisEPoints, + basisEWeights, wBasisNormalAtBasisEPoints, targetEWeights, + basisAtTargetEPoints, wBasisNormalAtTargetEPoints, tagToOrdinal, + targetAtEPoints, targetNormalAtTargetEPoints, + refSidesNormal, sideCardinality, offsetBasis, + offsetTarget, sideDim, + dim, is)); ScalarViewType sideMassMat_("sideMassMat_", numCells, sideCardinality+1, sideCardinality+1), sideRhsMat_("rhsMat_", numCells, sideCardinality+1); - ScalarViewType targetEvalWeights_("targetEvalWeights", numCells, 1, targetEvalWeights.extent(0)); - RealSpaceTools::clone(targetEvalWeights_, targetEvalWeights); + ScalarViewType targetEWeights_("targetEWeights", numCells, 1, targetEWeights.extent(0)); + RealSpaceTools::clone(targetEWeights_, targetEWeights); range_type range_H(0, sideCardinality); range_type range_B(sideCardinality, sideCardinality+1); - ScalarViewType ones("ones",numCells,1,numCubPoints); + ScalarViewType ones("ones",numCells,1,numBasisEPoints); Kokkos::deep_copy(ones,1); - FunctionSpaceTools::integrate(Kokkos::subview(sideMassMat_, Kokkos::ALL(), range_H, range_H), normalBasisAtElemcubPoints, weightedNormalBasisAtElemcubPoints); - FunctionSpaceTools::integrate(Kokkos::subview(sideMassMat_, Kokkos::ALL(), range_H, range_B), weightedNormalBasisAtElemcubPoints, ones); - - FunctionSpaceTools::integrate(Kokkos::subview(sideRhsMat_, Kokkos::ALL(), range_H), normalTargetAtTargetcubPoints, weightedNormalBasisAtTargetcubPoints); - FunctionSpaceTools::integrate(Kokkos::subview(sideRhsMat_, Kokkos::ALL(), range_B), normalTargetAtTargetcubPoints, targetEvalWeights_); - - Kokkos::View sideMassMat("sideMassMat", sideCardinality+1,sideCardinality+1); - Kokkos::View sideRhsMat("sideRhsMat",sideCardinality+1, 1); - - Teuchos::LAPACK lapack; - ordinal_type info = 0; - Kokkos::View pivVec("pivVec", sideCardinality+1, 1); - - for(ordinal_type ic=0; ic::integrate(Kokkos::subview(sideMassMat_, Kokkos::ALL(), range_H, range_H), basisNormalAtBasisEPoints, wBasisNormalAtBasisEPoints); + FunctionSpaceTools::integrate(Kokkos::subview(sideMassMat_, Kokkos::ALL(), range_H, range_B), wBasisNormalAtBasisEPoints, ones); - lapack.GESV(sideCardinality+1, 1, - sideMassMat.data(), - sideMassMat.stride_1(), - (ordinal_type*)pivVec.data(), - sideRhsMat.data(), - sideRhsMat.stride_1(), - &info); + FunctionSpaceTools::integrate(Kokkos::subview(sideRhsMat_, Kokkos::ALL(), range_H), targetNormalAtTargetEPoints, wBasisNormalAtTargetEPoints); + FunctionSpaceTools::integrate(Kokkos::subview(sideRhsMat_, Kokkos::ALL(), range_B), targetNormalAtTargetEPoints, targetEWeights_); - for(ordinal_type i=0; igetDofOrdinal(dim-1, is, i); - basisCoeffs(ic,facet_dof) = sideRhsMat(i,0); - } + typedef Kokkos::DynRankView WorkArrayViewType; + ScalarViewType t_("t",numCells, sideCardinality+1); + WorkArrayViewType w_("w",numCells, sideCardinality+1); + auto sideDof = Kokkos::subview(tagToOrdinal, sideDim, is, Kokkos::ALL()); - if (info) { - std::stringstream ss; - ss << ">>> ERROR (Intrepid::ProjectionTools::getBasisCoeffs): " - << "LAPACK return with error code: " - << info; - INTREPID2_TEST_FOR_EXCEPTION( true, std::runtime_error, ss.str().c_str() ); - } - } + ElemSystem sideSystem("sideSystem", false); + sideSystem.solve(basisCoeffs, sideMassMat_, sideRhsMat_, t_, w_, sideDof, sideCardinality, 1); } - //elem - ordinal_type numElemDofs = cellBasis->getDofCount(dim,0); - if(numElemDofs==0) + //Cell + ordinal_type numCellDofs = cellBasis->getDofCount(dim,0); + if(numCellDofs==0) return; - Basis *hcurlBasis = NULL; - if(name.find("HEX")!=std::string::npos) - hcurlBasis = new Basis_HCURL_HEX_In_FEM(cellBasis->getDegree()); - else if(name.find("TET")!=std::string::npos) - hcurlBasis = new Basis_HCURL_TET_In_FEM(cellBasis->getDegree()); - else if(name.find("QUAD")!=std::string::npos) - hcurlBasis = new Basis_HGRAD_QUAD_Cn_FEM(cellBasis->getDegree()); - else if(name.find("TRI")!=std::string::npos) - hcurlBasis = new Basis_HGRAD_TRI_Cn_FEM(cellBasis->getDegree()); + Basis *hcurlBasis = NULL; + if(cellTopo.getKey() == shards::getCellTopologyData >()->key) + hcurlBasis = new Basis_HCURL_HEX_In_FEM(cellBasis->getDegree()); + else if(cellTopo.getKey() == shards::getCellTopologyData >()->key) + hcurlBasis = new Basis_HCURL_TET_In_FEM(cellBasis->getDegree()); + else if(cellTopo.getKey() == shards::getCellTopologyData >()->key) + hcurlBasis = new Basis_HGRAD_QUAD_Cn_FEM(cellBasis->getDegree()); + else if(cellTopo.getKey() == shards::getCellTopologyData >()->key) + hcurlBasis = new Basis_HGRAD_TRI_Cn_FEM(cellBasis->getDegree()); else { std::stringstream ss; ss << ">>> ERROR (Intrepid2::ProjectionTools::getHDivEvaluationPoints): " @@ -339,176 +483,87 @@ ProjectionTools::getHDivBasisCoeffs(Kokkos::DynRankViewgetNumTargetDerivEvalPoints(dim,0); - ordinal_type numDivCubPoints = projStruct->getNumBasisDerivEvalPoints(dim,0); + auto targetDivEPointsRange = Kokkos::create_mirror_view_and_copy(typename SpT::memory_space(),projStruct->getTargetDerivPointsRange()); + auto basisDivEPointsRange = Kokkos::create_mirror_view_and_copy(typename SpT::memory_space(),projStruct->getBasisDerivPointsRange()); - ScalarViewType weightedBasisDivAtcubPoints("weightedBasisDivAtcubPoints",numCells,numElemDofs, numDivCubPoints); - ScalarViewType weightedBasisDivAtcubTargetPoints("weightedBasisDivAtcubTargetPoints",numCells, numElemDofs, numTargetDivCubPoints); + ordinal_type numTargetDivEPoints = range_size(targetDivEPointsRange(dim,0)); + ordinal_type numBasisDivEPoints = range_size(basisDivEPointsRange(dim,0)); - ScalarViewType internalBasisDivAtcubPoints("basisDivAtcubPoints",numCells,numElemDofs, numDivCubPoints); + auto targetDivEWeights = Kokkos::create_mirror_view_and_copy(typename SpT::memory_space(),projStruct->getTargetDerivEvalWeights(dim,0)); + auto divEWeights = Kokkos::create_mirror_view_and_copy(typename SpT::memory_space(),projStruct->getBasisDerivEvalWeights(dim,0)); - ScalarViewType targetDivEvalWeights = projStruct->getTargetDerivEvalWeights(dim, 0); - ScalarViewType divEvalWeights = projStruct->getBasisDerivEvalWeights(dim, 0); - ordinal_type offsetBasisDiv = projStruct->getBasisDerivPointsRange(dim, 0).first; - ordinal_type offsetTargetDiv = projStruct->getTargetDerivPointsRange(dim, 0).first; + ordinal_type offsetBasisDiv = basisDivEPointsRange(dim,0).first; + ordinal_type offsetTargetDiv = targetDivEPointsRange(dim,0).first; + + ScalarViewType weightedBasisDivAtBasisEPoints("weightedBasisDivAtBasisEPoints",numCells,numCellDofs, numBasisDivEPoints); + ScalarViewType weightedBasisDivAtTargetEPoints("weightedBasisDivAtTargetEPoints",numCells, numCellDofs, numTargetDivEPoints); + ScalarViewType basisDivAtBasisEPoints("basisDivAtBasisEPoints",numCells,numCellDofs, numBasisDivEPoints); + ScalarViewType targetSideDivAtBasisEPoints("targetSideDivAtBasisEPoints",numCells, numBasisDivEPoints); + + auto cellDofs = Kokkos::subview(tagToOrdinal, dim, 0, Kokkos::ALL()); + typedef ComputeBasisCoeffsOnCells_HDiv functorType; + Kokkos::parallel_for(policy, functorType( basisCoeffs, targetSideDivAtBasisEPoints, basisDivAtBasisEPoints, + basisDivAtBasisDivEPoints, divEWeights, weightedBasisDivAtBasisEPoints, targetDivEWeights, basisDivAtTargetDivEPoints, weightedBasisDivAtTargetEPoints, + computedDofs, cellDofs, numCellDofs, offsetBasisDiv, offsetTargetDiv, numSideDofs)); - for(ordinal_type ic=0; icgetDofOrdinal(dim, 0, i); - for(ordinal_type iq=0; iqgetDofOrdinal(dim, 0, i); - for(ordinal_type iq=0; iqgetCardinality(); ordinal_type numCurlInteriorDOFs = hcurlBasis->getDofCount(dim,0); - range_type range_H(0, numElemDofs); - range_type range_B(numElemDofs, numElemDofs+numCurlInteriorDOFs); + range_type range_H(0, numCellDofs); + range_type range_B(numCellDofs, numCellDofs+numCurlInteriorDOFs); - Kokkos::DynRankView massMat_("massMat_",numCells,numElemDofs+numCurlInteriorDOFs,numElemDofs+numCurlInteriorDOFs); - Kokkos::DynRankView rhsMatTrans("rhsMatTrans",numCells,numElemDofs+numCurlInteriorDOFs); - ScalarViewType targetSideDivAtcubPoints("targetSideDivAtcubPoints",numCells, numDivCubPoints); - for(ordinal_type i=0; i::integrate(Kokkos::subview(massMat_, Kokkos::ALL(), range_H,range_H), internalBasisDivAtcubPoints, weightedBasisDivAtcubPoints); - FunctionSpaceTools::integrate(Kokkos::subview(rhsMatTrans, Kokkos::ALL(), range_H), targetDivAtDivEvalPoints, weightedBasisDivAtcubTargetPoints); - FunctionSpaceTools::integrate(Kokkos::subview(rhsMatTrans, Kokkos::ALL(), range_H), targetSideDivAtcubPoints, weightedBasisDivAtcubPoints,true); + FunctionSpaceTools::integrate(Kokkos::subview(massMat_, Kokkos::ALL(), range_H,range_H), basisDivAtBasisEPoints, weightedBasisDivAtBasisEPoints); + FunctionSpaceTools::integrate(Kokkos::subview(rhsMatTrans, Kokkos::ALL(), range_H), targetDivAtDivEPoints, weightedBasisDivAtTargetEPoints); + FunctionSpaceTools::integrate(Kokkos::subview(rhsMatTrans, Kokkos::ALL(), range_H), targetSideDivAtBasisEPoints, weightedBasisDivAtBasisEPoints,true); if(numCurlInteriorDOFs>0){ - ScalarViewType cubPoints = projStruct->getBasisEvalPoints(dim,0); - ordinal_type numCubPoints = projStruct->getNumBasisEvalPoints(dim,0); - ordinal_type numTargetCubPoints = projStruct->getNumTargetEvalPoints(dim,0); + ordinal_type numTargetEPoints = range_size(targetEPointsRange(dim,0)); + ordinal_type numBasisEPoints = range_size(basisEPointsRange(dim,0)); - ScalarViewType targetSideApproxAtcubPoints("targetSideAtcubPoints",numCells, numCubPoints, dim); - ScalarViewType internalBasisAtcubPoints("basisAtcubPoints",numCells,numElemDofs, numCubPoints, dim); - ScalarViewType hcurlBasisCurlAtcubPoints("hcurlBasisCurlAtcubPoints",hcurlBasisCardinality, numCubPoints,dim); - ScalarViewType internalHcurlBasisCurlAtcubPoints("internalHcurlBasisCurlAtcubPoints",numCells,numCurlInteriorDOFs, numCubPoints,dim); - ScalarViewType hcurlBasisCurlAtcubTargetPoints("hcurlBasisCurlAtcubTargetPoints", hcurlBasisCardinality,numTargetCubPoints, dim); - ScalarViewType internalHcurlBasisCurlAtcubTargetPoints("internalHcurlBasisCurlAtcubTargetPoints",numCells, numCurlInteriorDOFs, numTargetCubPoints, dim); - ScalarViewType weightedHcurlBasisCurlAtcubPoints("weightedHcurlBasisHcurlAtcubPoints", numCells, numCurlInteriorDOFs, numCubPoints,dim); - ScalarViewType weightedHcurlBasisCurlAtcubTargetPoints("weightedHcurlBasisHcurlAtcubTargetPoints",numCells, numCurlInteriorDOFs, numTargetCubPoints,dim); + auto targetEWeights = Kokkos::create_mirror_view_and_copy(typename SpT::memory_space(),projStruct->getTargetEvalWeights(dim,0)); + auto basisEWeights = Kokkos::create_mirror_view_and_copy(typename SpT::memory_space(),projStruct->getBasisEvalWeights(dim,0)); - hcurlBasis->getValues(hcurlBasisCurlAtcubPoints, cubPoints, OPERATOR_CURL); + ordinal_type offsetBasis = basisEPointsRange(dim,0).first; - ordinal_type offsetBasis = projStruct->getBasisPointsRange(dim, 0).first; - range_type targetPointsRange = projStruct->getTargetPointsRange(dim, 0); + auto basisEPoints = Kokkos::subview(basisEPoints_, 0, basisEPointsRange(dim,0), Kokkos::ALL()); - ScalarViewType targetEvalWeights = projStruct->getTargetEvalWeights(dim, 0); - ScalarViewType basisEvalWeights = projStruct->getBasisEvalWeights(dim, 0); + ScalarViewType negPartialProjAtBasisEPoints("targetSideAtBasisEPoints",numCells, numBasisEPoints, dim); + ScalarViewType nonWeightedBasisAtBasisEPoints("basisAtBasisEPoints",numCells,numCellDofs, numBasisEPoints, dim); + ScalarViewType hcurlBasisCurlAtBasisEPoints("hcurlBasisCurlAtBasisEPoints",hcurlBasisCardinality, numBasisEPoints,dim); + ScalarViewType hcurlBasisCurlAtTargetEPoints("hcurlBasisCurlAtTargetEPoints", hcurlBasisCardinality,numTargetEPoints, dim); + ScalarViewType wHcurlBasisCurlAtBasisEPoints("wHcurlBasisHcurlAtBasisEPoints", numCells, numCurlInteriorDOFs, numBasisEPoints,dim); + ScalarViewType wHcurlBasisCurlAtTargetEPoints("wHcurlBasisHcurlAtTargetEPoints",numCells, numCurlInteriorDOFs, numTargetEPoints,dim); + hcurlBasis->getValues(hcurlBasisCurlAtBasisEPoints, basisEPoints, OPERATOR_CURL); + hcurlBasis->getValues(hcurlBasisCurlAtTargetEPoints, Kokkos::subview(targetEPoints,0,targetEPointsRange(dim,0),Kokkos::ALL()), OPERATOR_CURL); - for(ordinal_type ic=0; icgetDofOrdinal(dim, 0, i); - for(ordinal_type iq=0; iqgetDofOrdinal(dim, 0, i); - for(ordinal_type d=0; dgetValues(hcurlBasisCurlAtcubTargetPoints, Kokkos::subview(evaluationPoints,ic,targetPointsRange,Kokkos::ALL()), OPERATOR_CURL); - for(ordinal_type i=0; igetDofOrdinal(dim, 0, i); - for(ordinal_type d=0; d::integrate(Kokkos::subview(massMat_, Kokkos::ALL(), range_H,range_B), internalBasisAtcubPoints, weightedHcurlBasisCurlAtcubPoints); - FunctionSpaceTools::integrate(Kokkos::subview(rhsMatTrans, Kokkos::ALL(), range_B), Kokkos::subview(targetAtEvalPoints, Kokkos::ALL(), targetPointsRange, Kokkos::ALL()), weightedHcurlBasisCurlAtcubTargetPoints); - FunctionSpaceTools::integrate(Kokkos::subview(rhsMatTrans, Kokkos::ALL(), range_B), targetSideApproxAtcubPoints, weightedHcurlBasisCurlAtcubPoints,true); + auto hCurlTagToOrdinal = Kokkos::create_mirror_view_and_copy(typename SpT::memory_space(), hcurlBasis->getAllDofOrdinal()); + auto cellHCurlDof = Kokkos::subview(hCurlTagToOrdinal, dim, 0, range_type(0, numCurlInteriorDOFs)); + typedef ComputeHCurlBasisCoeffsOnCells_HDiv functorTypeHCurlCells; + Kokkos::parallel_for(policy, functorTypeHCurlCells(basisCoeffs, negPartialProjAtBasisEPoints, nonWeightedBasisAtBasisEPoints, + basisAtBasisEPoints, hcurlBasisCurlAtBasisEPoints, basisEWeights, wHcurlBasisCurlAtBasisEPoints, targetEWeights, + hcurlBasisCurlAtTargetEPoints, wHcurlBasisCurlAtTargetEPoints, tagToOrdinal, computedDofs, cellHCurlDof, + numCellDofs, offsetBasis, numSideDofs, dim)); + FunctionSpaceTools::integrate(Kokkos::subview(massMat_, Kokkos::ALL(), range_H,range_B), nonWeightedBasisAtBasisEPoints, wHcurlBasisCurlAtBasisEPoints); + FunctionSpaceTools::integrate(Kokkos::subview(rhsMatTrans, Kokkos::ALL(), range_B), Kokkos::subview(targetAtEPoints, Kokkos::ALL(), targetEPointsRange(dim,0), Kokkos::ALL()), wHcurlBasisCurlAtTargetEPoints); + FunctionSpaceTools::integrate(Kokkos::subview(rhsMatTrans, Kokkos::ALL(), range_B), negPartialProjAtBasisEPoints, wHcurlBasisCurlAtBasisEPoints,true); } delete hcurlBasis; - Kokkos::View - massMat("massMat", numElemDofs+numCurlInteriorDOFs, numElemDofs+numCurlInteriorDOFs), - rhsMat("rhsMat", numElemDofs+numCurlInteriorDOFs, 1 ); - - Teuchos::LAPACK lapack; - ordinal_type info = 0; - Kokkos::View pivVec("pivVec", 2*(numElemDofs+numCurlInteriorDOFs), 1); - - for(ordinal_type ic=0; ic>> ERROR (Intrepid::ProjectionTools::getBasisCoeffs): " - << "LAPACK return with error code: " - << info; - INTREPID2_TEST_FOR_EXCEPTION( true, std::runtime_error, ss.str().c_str() ); - } + typedef Kokkos::DynRankView WorkArrayViewType; + ScalarViewType t_("t",numCells, numCellDofs+numCurlInteriorDOFs); + WorkArrayViewType w_("w",numCells, numCellDofs+numCurlInteriorDOFs); - for(ordinal_type i=0; igetDofOrdinal(dim, 0, i); - basisCoeffs(ic,idof) = rhsMat(i,0); - } - } + ElemSystem cellSystem("cellSystem", true); + cellSystem.solve(basisCoeffs, massMat_, rhsMatTrans, t_, w_, cellDofs, numCellDofs, numCurlInteriorDOFs); } diff --git a/packages/intrepid2/src/Projection/Intrepid2_ProjectionToolsDefHGRAD.hpp b/packages/intrepid2/src/Projection/Intrepid2_ProjectionToolsDefHGRAD.hpp index 61d8a7e4e2e9..5a6f0ee0526e 100644 --- a/packages/intrepid2/src/Projection/Intrepid2_ProjectionToolsDefHGRAD.hpp +++ b/packages/intrepid2/src/Projection/Intrepid2_ProjectionToolsDefHGRAD.hpp @@ -57,12 +57,274 @@ namespace Intrepid2 { namespace Experimental { +template +struct ComputeBasisCoeffsOnVertices_HGRAD { + ViewType1 basisCoeffs_; + const ViewType2 tagToOrdinal_; + const ViewType3 targetEPointsRange_; + const ViewType4 targetAtTargetEPoints_; + const ViewType5 basisAtTargetEPoints_; + ordinal_type numVertices_; + + + ComputeBasisCoeffsOnVertices_HGRAD(ViewType1 basisCoeffs, ViewType2 tagToOrdinal, ViewType3 targetEPointsRange, + ViewType4 targetAtTargetEPoints, ViewType5 basisAtTargetEPoints, ordinal_type numVertices) : + basisCoeffs_(basisCoeffs), tagToOrdinal_(tagToOrdinal), targetEPointsRange_(targetEPointsRange), + targetAtTargetEPoints_(targetAtTargetEPoints), basisAtTargetEPoints_(basisAtTargetEPoints), numVertices_(numVertices) {} + + void + KOKKOS_INLINE_FUNCTION + operator()(const ordinal_type ic) const { + + + for(ordinal_type iv=0; iv +struct ComputeBasisCoeffsOnEdges_HGRAD { + const ViewType1 basisCoeffs_; + const ViewType2 negPartialProjGrad_; + const ViewType2 basisTanAtEPoints_; + const ViewType2 basisGradAtBasisGradEPoints_; + const ViewType3 basisGradEWeights_; + const ViewType2 wBasisAtBasisGradEPoints_; + const ViewType3 targetGradEWeights_; + const ViewType2 basisGradAtTargetGradEPoints_; + const ViewType2 wBasisAtTargetGradEPoints_; + const ViewType4 computedDofs_; + const ViewType5 tagToOrdinal_; + const ViewType2 targetGradTanAtTargetGradEPoints_; + const ViewType6 targetGradAtTargetGradEPoints_; + const ViewType2 refEdgesTan_; + ordinal_type edgeCardinality_; + ordinal_type offsetBasis_; + ordinal_type offsetTarget_; + ordinal_type numVertexDofs_; + ordinal_type edgeDim_; + ordinal_type dim_; + ordinal_type iedge_; + + ComputeBasisCoeffsOnEdges_HGRAD(const ViewType1 basisCoeffs, ViewType2 negPartialProjGrad, const ViewType2 basisTanAtEPoints, + const ViewType2 basisGradAtBasisGradEPoints, const ViewType3 basisGradEWeights, const ViewType2 wBasisAtBasisGradEPoints, const ViewType3 targetGradEWeights, + const ViewType2 basisGradAtTargetGradEPoints, const ViewType2 wBasisAtTargetGradEPoints, const ViewType4 computedDofs, const ViewType5 tagToOrdinal, + const ViewType2 targetGradTanAtTargetGradEPoints, const ViewType6 targetGradAtTargetGradEPoints, const ViewType2 refEdgesTan, + ordinal_type edgeCardinality, ordinal_type offsetBasis, + ordinal_type offsetTarget, ordinal_type numVertexDofs, ordinal_type edgeDim, ordinal_type dim, ordinal_type iedge) : + basisCoeffs_(basisCoeffs), negPartialProjGrad_(negPartialProjGrad), basisTanAtEPoints_(basisTanAtEPoints), + basisGradAtBasisGradEPoints_(basisGradAtBasisGradEPoints), basisGradEWeights_(basisGradEWeights), wBasisAtBasisGradEPoints_(wBasisAtBasisGradEPoints), targetGradEWeights_(targetGradEWeights), + basisGradAtTargetGradEPoints_(basisGradAtTargetGradEPoints), wBasisAtTargetGradEPoints_(wBasisAtTargetGradEPoints), + computedDofs_(computedDofs), tagToOrdinal_(tagToOrdinal), targetGradTanAtTargetGradEPoints_(targetGradTanAtTargetGradEPoints), + targetGradAtTargetGradEPoints_(targetGradAtTargetGradEPoints), refEdgesTan_(refEdgesTan), + edgeCardinality_(edgeCardinality), offsetBasis_(offsetBasis), + offsetTarget_(offsetTarget), numVertexDofs_(numVertexDofs), edgeDim_(edgeDim), dim_(dim), iedge_(iedge) + {} + + void + KOKKOS_INLINE_FUNCTION + operator()(const ordinal_type ic) const { + + ordinal_type numBasisGradEPoints = basisGradEWeights_.extent(0); + ordinal_type numTargetGradEPoints = targetGradEWeights_.extent(0); + for(ordinal_type j=0; j +struct ComputeBasisCoeffsOnFaces_HGRAD { + const ViewType1 basisCoeffs_; + const ViewType2 negPartialProjGrad_; + const ViewType2 faceBasisGradAtGradEPoints_; + const ViewType2 basisGradAtBasisGradEPoints_; + const ViewType3 basisGradEWeights_; + const ViewType2 wBasisGradAtGradEPoints_; + const ViewType3 targetGradEWeights_; + const ViewType2 basisGradAtTargetGradEPoints_; + const ViewType2 wBasisGradBasisAtTargetGradEPoints_; + const ViewType4 computedDofs_; + const ViewType5 tagToOrdinal_; + const ViewType6 orts_; + const ViewType2 targetGradTanAtTargetGradEPoints_; + const ViewType7 targetGradAtTargetGradEPoints_; + const ViewType2 ortJacobian_; + const ViewType2 faceCoeff_; + const ViewType2 refFacesTangents_; + ordinal_type faceCardinality_; + ordinal_type offsetBasisGrad_; + ordinal_type offsetTargetGrad_; + ordinal_type numVertexEdgeDofs_; + ordinal_type numFaces_; + ordinal_type faceDim_; + ordinal_type dim_; + ordinal_type iface_; + unsigned topoKey_; + + ComputeBasisCoeffsOnFaces_HGRAD(const ViewType1 basisCoeffs, ViewType2 negPartialProjGrad, const ViewType2 faceBasisGradAtGradEPoints, + const ViewType2 basisGradAtBasisGradEPoints, const ViewType3 basisGradEWeights, const ViewType2 wBasisGradAtGradEPoints, const ViewType3 targetGradEWeights, + const ViewType2 basisGradAtTargetGradEPoints, const ViewType2 wBasisGradBasisAtTargetGradEPoints, const ViewType4 computedDofs, const ViewType5 tagToOrdinal, + const ViewType6 orts, const ViewType2 targetGradTanAtTargetGradEPoints, const ViewType7 targetGradAtTargetGradEPoints, + const ViewType2 refFacesTangents, ordinal_type faceCardinality, ordinal_type offsetBasisGrad, + ordinal_type offsetTargetGrad, ordinal_type numVertexEdgeDofs, ordinal_type numFaces, ordinal_type faceDim, + ordinal_type dim, ordinal_type iface, unsigned topoKey) : + basisCoeffs_(basisCoeffs), negPartialProjGrad_(negPartialProjGrad), faceBasisGradAtGradEPoints_(faceBasisGradAtGradEPoints), + basisGradAtBasisGradEPoints_(basisGradAtBasisGradEPoints), basisGradEWeights_(basisGradEWeights), wBasisGradAtGradEPoints_(wBasisGradAtGradEPoints), + targetGradEWeights_(targetGradEWeights), + basisGradAtTargetGradEPoints_(basisGradAtTargetGradEPoints), wBasisGradBasisAtTargetGradEPoints_(wBasisGradBasisAtTargetGradEPoints), + computedDofs_(computedDofs), tagToOrdinal_(tagToOrdinal), orts_(orts), targetGradTanAtTargetGradEPoints_(targetGradTanAtTargetGradEPoints), + targetGradAtTargetGradEPoints_(targetGradAtTargetGradEPoints), refFacesTangents_(refFacesTangents), + faceCardinality_(faceCardinality), offsetBasisGrad_(offsetBasisGrad), + offsetTargetGrad_(offsetTargetGrad), numVertexEdgeDofs_(numVertexEdgeDofs), numFaces_(numFaces), + faceDim_(faceDim), dim_(dim), iface_(iface), topoKey_(topoKey) + {} + + void + KOKKOS_INLINE_FUNCTION + operator()(const ordinal_type ic) const { + + typename ViewType2::value_type ortJacData[2*2]; + auto ortJac = ViewType2(ortJacData, 2, 2); + + ordinal_type fOrt[6]; + orts_(ic).getFaceOrientation(fOrt, numFaces_); + ordinal_type ort = fOrt[iface_]; + + ordinal_type numBasisGradEPoints = basisGradEWeights_.extent(0); + ordinal_type numTargetGradEPoints = targetGradEWeights_.extent(0); + Impl::OrientationTools::getJacobianOfOrientationMap(ortJac, topoKey_, ort); + for(ordinal_type j=0; j +struct ComputeBasisCoeffsOnCells_HGRAD { + const ViewType1 basisCoeffs_; + const ViewType2 negPartialProjGrad_; + const ViewType2 cellBasisGradAtGradEPoints_; + const ViewType2 basisGradAtBasisGradEPoints_; + const ViewType3 basisGradEWeights_; + const ViewType2 wBasisGradAtGradEPoints_; + const ViewType3 targetGradEWeights_; + const ViewType2 basisGradAtTargetGradEPoints_; + const ViewType2 wBasisGradBasisAtTargetGradEPoints_; + const ViewType4 computedDofs_; + const ViewType5 elemDof_; + ordinal_type dim_; + ordinal_type numElemDofs_; + ordinal_type offsetBasisGrad_; + ordinal_type offsetTargetGrad_; + ordinal_type numVertexEdgeFaceDofs_; + + ComputeBasisCoeffsOnCells_HGRAD(const ViewType1 basisCoeffs, ViewType2 negPartialProjGrad, const ViewType2 cellBasisGradAtGradEPoints, + const ViewType2 basisGradAtBasisGradEPoints, const ViewType3 basisGradEWeights, const ViewType2 wBasisGradAtGradEPoints, const ViewType3 targetGradEWeights, + const ViewType2 basisGradAtTargetGradEPoints, const ViewType2 wBasisGradBasisAtTargetGradEPoints, const ViewType4 computedDofs, const ViewType5 elemDof, + ordinal_type dim, ordinal_type numElemDofs, ordinal_type offsetBasisGrad, ordinal_type offsetTargetGrad, ordinal_type numVertexEdgeFaceDofs) : + basisCoeffs_(basisCoeffs), negPartialProjGrad_(negPartialProjGrad), cellBasisGradAtGradEPoints_(cellBasisGradAtGradEPoints), + basisGradAtBasisGradEPoints_(basisGradAtBasisGradEPoints), basisGradEWeights_(basisGradEWeights), wBasisGradAtGradEPoints_(wBasisGradAtGradEPoints), targetGradEWeights_(targetGradEWeights), + basisGradAtTargetGradEPoints_(basisGradAtTargetGradEPoints), wBasisGradBasisAtTargetGradEPoints_(wBasisGradBasisAtTargetGradEPoints), + computedDofs_(computedDofs), elemDof_(elemDof), dim_(dim), numElemDofs_(numElemDofs), offsetBasisGrad_(offsetBasisGrad), + offsetTargetGrad_(offsetTargetGrad), numVertexEdgeFaceDofs_(numVertexEdgeFaceDofs) {} + + void + KOKKOS_INLINE_FUNCTION + operator()(const ordinal_type ic) const { + ordinal_type numBasisGradEPoints = basisGradEWeights_.extent(0); + ordinal_type numTargetGradEPoints = targetGradEWeights_.extent(0); + for(ordinal_type j=0; j template void -ProjectionTools::getHGradEvaluationPoints(typename BasisType::ScalarViewType evaluationPoints, - typename BasisType::ScalarViewType extDerivEvaluationPoints, +ProjectionTools::getHGradEvaluationPoints(typename BasisType::ScalarViewType ePoints, + typename BasisType::ScalarViewType gradEPoints, const Kokkos::DynRankView orts, const BasisType* cellBasis, ProjectionStruct * projStruct, @@ -71,8 +333,9 @@ ProjectionTools::getHGradEvaluationPoints(typename BasisType::ScalarViewTyp typedef Kokkos::DynRankView ScalarViewType; typedef Kokkos::pair range_type; const auto cellTopo = cellBasis->getBaseCellTopology(); + //const auto cellTopoKey = cellBasis->getBaseCellTopology().getKey(); ordinal_type dim = cellTopo.getDimension(); - ordinal_type numCells = evaluationPoints.extent(0); + ordinal_type numCells = ePoints.extent(0); const ordinal_type edgeDim = 1; const ordinal_type faceDim = 2; @@ -80,81 +343,80 @@ ProjectionTools::getHGradEvaluationPoints(typename BasisType::ScalarViewTyp ordinal_type numEdges = (cellBasis->getDofCount(1, 0) > 0) ? cellTopo.getEdgeCount() : 0; ordinal_type numFaces = (cellBasis->getDofCount(2, 0) > 0) ? cellTopo.getFaceCount() : 0; - Kokkos::View eOrt("eOrt", numEdges), fOrt("fOrt", numFaces); + CellTools::setSubcellParametrization(); + typename CellTools::subcellParamViewType subcellParamEdge, subcellParamFace; + if(numEdges>0) + CellTools::getSubcellParametrization(subcellParamEdge, edgeDim, cellBasis->getBaseCellTopology()); + if(numFaces>0) + CellTools::getSubcellParametrization(subcellParamFace, faceDim, cellBasis->getBaseCellTopology()); + + auto refTopologyKey = Kokkos::create_mirror_view_and_copy(typename SpT::memory_space(),projStruct->getTopologyKey()); + + auto ePointsRange = Kokkos::create_mirror_view_and_copy(typename SpT::memory_space(),projStruct->getPointsRange(evalPointType)); + auto gradEPointsRange = Kokkos::create_mirror_view_and_copy(typename SpT::memory_space(),projStruct->getDerivPointsRange(evalPointType)); if(numVertices>0) { - //TODO: use lattice to retrieve vertex coordinates. - ScalarViewType dofCoords("dofCoords", cellBasis->getCardinality(), dim); - cellBasis->getDofCoords(dofCoords); for(ordinal_type iv=0; ivgetDofOrdinal(0, iv, 0); - for(ordinal_type d=0; dgetEvalPoints(0,iv,evalPointType)); + RealSpaceTools::clone(Kokkos::subview(ePoints, Kokkos::ALL(), + ePointsRange(0, iv), Kokkos::ALL()), vertexEPoints); } } + ScalarViewType workView("workView", numCells, projStruct->getMaxNumDerivPoints(evalPointType), dim-1); for(ordinal_type ie=0; iegetTargetDerivPointsRange(edgeDim, ie); - cubPoints = projStruct->getTargetDerivEvalPoints(edgeDim, ie); - } - else { - edgeGradPointsRange = projStruct->getBasisDerivPointsRange(edgeDim, ie); - cubPoints = projStruct->getBasisDerivEvalPoints(edgeDim, ie); - } - ScalarViewType orientedTargetCubPoints("orientedTargetCubPoints", cubPoints.extent(0),edgeDim); + auto edgeGradEPointsRange = gradEPointsRange(edgeDim, ie); + auto edgeRefGradEPointsRange = range_type(0, range_size(edgeGradEPointsRange)); + auto edgeGradEPoints = Kokkos::create_mirror_view_and_copy(typename SpT::memory_space(),projStruct->getDerivEvalPoints(edgeDim,ie,evalPointType)); - const auto topoKey = projStruct->getTopologyKey(edgeDim,ie); + const auto topoKey = refTopologyKey(edgeDim,ie); - for(ordinal_type ic=0; ic::mapToReferenceSubcell(Kokkos::subview(extDerivEvaluationPoints,ic,edgeGradPointsRange,Kokkos::ALL()), orientedTargetCubPoints, edgeDim, ie, cellBasis->getBaseCellTopology()); - } + Kokkos::parallel_for + ("Evaluate Points Edges ", + Kokkos::RangePolicy (0, numCells), + KOKKOS_LAMBDA (const size_t ic) { + + + ordinal_type eOrt[12]; + orts(ic).getEdgeOrientation(eOrt, numEdges); + ordinal_type ort = eOrt[ie]; + + auto orientedEdgeEPoints = Kokkos::subview(workView, ic, edgeRefGradEPointsRange, range_type(0, edgeDim)); + Impl::OrientationTools::mapToModifiedReference(orientedEdgeEPoints,edgeGradEPoints,topoKey,ort); + CellTools::mapToReferenceSubcell(Kokkos::subview(gradEPoints,ic,edgeGradEPointsRange,Kokkos::ALL()), orientedEdgeEPoints, subcellParamEdge, edgeDim, ie, dim); + }); } for(ordinal_type iface=0; ifacegetTargetDerivEvalPoints(faceDim, iface); - faceGradPointsRange = projStruct->getTargetDerivPointsRange(faceDim, iface); - } else { - gradCubPoints = projStruct->getBasisDerivEvalPoints(faceDim, iface); - faceGradPointsRange = projStruct->getBasisDerivPointsRange(faceDim, iface); - } + auto faceGradEPointsRange = gradEPointsRange(faceDim, iface); + auto faceRefGradEPointsRange = range_type(0, range_size(faceGradEPointsRange)); + auto refGradEPoints = Kokkos::create_mirror_view_and_copy(typename SpT::memory_space(),projStruct->getDerivEvalPoints(faceDim,iface,evalPointType)); - ScalarViewType faceGradCubPoints("faceGradCubPoints", gradCubPoints.extent(0), faceDim); - const auto topoKey = projStruct->getTopologyKey(faceDim,iface); - for(ordinal_type ic=0; ic (0, numCells), + KOKKOS_LAMBDA (const size_t ic) { + auto faceGradEPoints = Kokkos::subview(workView, ic, faceRefGradEPointsRange, Kokkos::ALL()); - orts(ic).getFaceOrientation(fOrt.data(), numFaces); + ordinal_type fOrt[6]; + orts(ic).getFaceOrientation(fOrt, numFaces); + ordinal_type ort = fOrt[iface]; - ordinal_type ort = fOrt(iface); - Impl::OrientationTools::mapToModifiedReference(faceGradCubPoints,gradCubPoints,topoKey,ort); - CellTools::mapToReferenceSubcell(Kokkos::subview(extDerivEvaluationPoints, ic, faceGradPointsRange, Kokkos::ALL()), faceGradCubPoints, faceDim, iface, cellBasis->getBaseCellTopology()); - } + Impl::OrientationTools::mapToModifiedReference(faceGradEPoints,refGradEPoints,topoKey,ort); + CellTools::mapToReferenceSubcell(Kokkos::subview(gradEPoints, ic, faceGradEPointsRange, Kokkos::ALL()), faceGradEPoints, subcellParamFace, faceDim, iface, dim); + }); } if(cellBasis->getDofCount(dim,0)>0) { - range_type cellGradPointsRange; - ScalarViewType gradCubPoints; - if(evalPointType == TARGET) { - gradCubPoints = projStruct->getTargetDerivEvalPoints(dim, 0); - cellGradPointsRange = projStruct->getTargetDerivPointsRange(dim, 0); - } else { - gradCubPoints = projStruct->getBasisDerivEvalPoints(dim, 0); - cellGradPointsRange = projStruct->getBasisDerivPointsRange(dim, 0); - } - RealSpaceTools::clone(Kokkos::subview(extDerivEvaluationPoints, Kokkos::ALL(), cellGradPointsRange, Kokkos::ALL()), gradCubPoints); + auto gradPointsRange = gradEPointsRange(dim, 0); + //auto refGradEPointsRange = range_type(0, range_size(gradPointsRange)); + auto refCellGradEPoints = Kokkos::create_mirror_view_and_copy(typename SpT::memory_space(),projStruct->getDerivEvalPoints(dim,0,evalPointType)); + RealSpaceTools::clone(Kokkos::subview(gradEPoints, Kokkos::ALL(), gradPointsRange, Kokkos::ALL()), refCellGradEPoints); } } @@ -166,10 +428,10 @@ typename BasisType, typename ortValueType,class ...ortProperties> void ProjectionTools::getHGradBasisCoeffs(Kokkos::DynRankView basisCoeffs, - const Kokkos::DynRankView targetAtEvalPoints, - const Kokkos::DynRankView targetGradAtGradEvalPoints, - const typename BasisType::ScalarViewType evaluationPoints, - const typename BasisType::ScalarViewType extDerivEvaluationPoints, + const Kokkos::DynRankView targetAtTargetEPoints, + const Kokkos::DynRankView targetGradAtTargetGradEPoints, + const typename BasisType::ScalarViewType targetEPoints, + const typename BasisType::ScalarViewType targetGradEPoints, const Kokkos::DynRankView orts, const BasisType* cellBasis, ProjectionStruct * projStruct){ @@ -180,10 +442,10 @@ ProjectionTools::getHGradBasisCoeffs(Kokkos::DynRankView range_type; const auto cellTopo = cellBasis->getBaseCellTopology(); ordinal_type dim = cellTopo.getDimension(); - ordinal_type numTotalEvaluationPoints(targetAtEvalPoints.extent(1)), - numTotalGradEvaluationPoints(targetGradAtGradEvalPoints.extent(1)); + ordinal_type numTotalTargetEPoints(targetAtTargetEPoints.extent(1)), + numTotalTargetGradEPoints(targetGradAtTargetGradEPoints.extent(1)); ordinal_type basisCardinality = cellBasis->getCardinality(); - ordinal_type numCells = targetAtEvalPoints.extent(0); + ordinal_type numCells = targetAtTargetEPoints.extent(0); const ordinal_type edgeDim = 1; const ordinal_type faceDim = 2; @@ -191,12 +453,8 @@ ProjectionTools::getHGradBasisCoeffs(Kokkos::DynRankViewgetDofCount(1, 0) > 0) ? cellTopo.getEdgeCount() : 0; ordinal_type numFaces = (cellBasis->getDofCount(2, 0) > 0) ? cellTopo.getFaceCount() : 0; - Kokkos::View eOrt("eOrt", numEdges); - Kokkos::View fOrt("fOrt", numFaces); - ScalarViewType refEdgeTan("refEdgeTan", dim); - ScalarViewType refFaceTangents("refFaceTangents", dim, 2); - auto refFaceTanU = Kokkos::subview(refFaceTangents, Kokkos::ALL, 0); - auto refFaceTanV = Kokkos::subview(refFaceTangents, Kokkos::ALL, 1); + ScalarViewType refEdgesTan("refEdgesTan", numEdges, dim); + ScalarViewType refFacesTangents("refFacesTangents", numFaces, dim, faceDim); ordinal_type numVertexDofs = numVertices; @@ -210,354 +468,208 @@ ProjectionTools::getHGradBasisCoeffs(Kokkos::DynRankView computedDofs("computedDofs",numVertexDofs+numEdgeDofs+numFaceDofs); - ordinal_type computedDofsCount = 0; + ordinal_type numTotalBasisEPoints = projStruct->getNumBasisEvalPoints(), + numTotalBasisGradEPoints = projStruct->getNumBasisDerivEvalPoints(); + ScalarViewType basisEPoints("basisEPoints",numCells,numTotalBasisEPoints, dim); + ScalarViewType basisGradEPoints("basisGradEPoints",numCells,numTotalBasisGradEPoints, dim); + getHGradEvaluationPoints(basisEPoints, basisGradEPoints, orts, cellBasis, projStruct, EvalPointsType::BASIS); - ordinal_type numTotalCubPoints = projStruct->getNumBasisEvalPoints(), - numTotalGradCubPoints = projStruct->getNumBasisDerivEvalPoints(); - ScalarViewType cubPoints("cubPoints",numCells,numTotalCubPoints, dim); - ScalarViewType gradCubPoints("gradCubPoints",numCells,numTotalGradCubPoints, dim); - getHGradEvaluationPoints(cubPoints, gradCubPoints, orts, cellBasis, projStruct, BASIS); - - ScalarViewType basisAtCubPoints("basisAtCubPoints",numCells,basisCardinality, numTotalCubPoints); - ScalarViewType basisAtTargetCubPoints("basisAtTargetCubPoints",numCells,basisCardinality, numTotalEvaluationPoints); + ScalarViewType basisAtTargetEPoints("basisAtTargetEPoints",numCells,basisCardinality, numTotalTargetEPoints); { - ScalarViewType nonOrientedBasisAtCubPoints("nonOrientedBasisAtCubPoints",numCells,basisCardinality, numTotalCubPoints); - ScalarViewType nonOrientedBasisAtTargetCubPoints("nonOrientedBasisAtTargetCubPoints",numCells,basisCardinality, numTotalEvaluationPoints); - + ScalarViewType nonOrientedBasisAtTargetEPoints("nonOrientedBasisAtTargetEPoints",numCells,basisCardinality, numTotalTargetEPoints); for(ordinal_type ic=0; icgetValues(Kokkos::subview(nonOrientedBasisAtTargetCubPoints,ic,Kokkos::ALL(),Kokkos::ALL()), Kokkos::subview(evaluationPoints, ic, Kokkos::ALL(), Kokkos::ALL())); - cellBasis->getValues(Kokkos::subview(nonOrientedBasisAtCubPoints,ic,Kokkos::ALL(),Kokkos::ALL()), Kokkos::subview(cubPoints, ic, Kokkos::ALL(), Kokkos::ALL())); + cellBasis->getValues(Kokkos::subview(nonOrientedBasisAtTargetEPoints,ic,Kokkos::ALL(),Kokkos::ALL()), Kokkos::subview(targetEPoints, ic, Kokkos::ALL(), Kokkos::ALL())); } - - OrientationTools::modifyBasisByOrientation(basisAtCubPoints, nonOrientedBasisAtCubPoints, orts, cellBasis); - OrientationTools::modifyBasisByOrientation(basisAtTargetCubPoints, nonOrientedBasisAtTargetCubPoints, orts, cellBasis); + OrientationTools::modifyBasisByOrientation(basisAtTargetEPoints, nonOrientedBasisAtTargetEPoints, orts, cellBasis); } - ScalarViewType basisGradAtGradCubPoints; - ScalarViewType basisGradAtTargetGradCubPoints; - if(numTotalGradEvaluationPoints>0) { - ScalarViewType nonOrientedBasisGradAtTargetGradCubPoints, nonOrientedBasisGradAtGradCubPoints; + ScalarViewType basisGradAtBasisGradEPoints; + ScalarViewType basisGradAtTargetGradEPoints; + if(numTotalBasisGradEPoints>0) { + ScalarViewType nonOrientedBasisGradAtTargetGradEPoints, nonOrientedBasisGradAtBasisGradEPoints; - basisGradAtGradCubPoints = ScalarViewType ("basisGradAtGradCubPoints",numCells,basisCardinality, numTotalGradCubPoints, dim); - nonOrientedBasisGradAtGradCubPoints = ScalarViewType ("nonOrientedBasisGradAtGradCubPoints",numCells,basisCardinality, numTotalGradCubPoints, dim); - basisGradAtTargetGradCubPoints = ScalarViewType("basisGradAtTargetGradCubPoints",numCells,basisCardinality, numTotalGradEvaluationPoints, dim); - nonOrientedBasisGradAtTargetGradCubPoints = ScalarViewType("nonOrientedBasisGradAtTargetGradCubPoints",numCells,basisCardinality, numTotalGradEvaluationPoints, dim); + basisGradAtBasisGradEPoints = ScalarViewType ("basisGradAtBasisGradEPoints",numCells,basisCardinality, numTotalBasisGradEPoints, dim); + nonOrientedBasisGradAtBasisGradEPoints = ScalarViewType ("nonOrientedBasisGradAtBasisGradEPoints",numCells,basisCardinality, numTotalBasisGradEPoints, dim); + basisGradAtTargetGradEPoints = ScalarViewType("basisGradAtTargetGradEPoints",numCells,basisCardinality, numTotalTargetGradEPoints, dim); + nonOrientedBasisGradAtTargetGradEPoints = ScalarViewType("nonOrientedBasisGradAtTargetGradEPoints",numCells,basisCardinality, numTotalTargetGradEPoints, dim); for(ordinal_type ic=0; icgetValues(Kokkos::subview(nonOrientedBasisGradAtGradCubPoints,ic,Kokkos::ALL(),Kokkos::ALL(),Kokkos::ALL()), Kokkos::subview(gradCubPoints, ic, Kokkos::ALL(), Kokkos::ALL()),OPERATOR_GRAD); - cellBasis->getValues(Kokkos::subview(nonOrientedBasisGradAtTargetGradCubPoints,ic,Kokkos::ALL(),Kokkos::ALL(),Kokkos::ALL()), Kokkos::subview(extDerivEvaluationPoints, ic, Kokkos::ALL(), Kokkos::ALL()),OPERATOR_GRAD); + cellBasis->getValues(Kokkos::subview(nonOrientedBasisGradAtBasisGradEPoints,ic,Kokkos::ALL(),Kokkos::ALL(),Kokkos::ALL()), Kokkos::subview(basisGradEPoints, ic, Kokkos::ALL(), Kokkos::ALL()),OPERATOR_GRAD); + cellBasis->getValues(Kokkos::subview(nonOrientedBasisGradAtTargetGradEPoints,ic,Kokkos::ALL(),Kokkos::ALL(),Kokkos::ALL()), Kokkos::subview(targetGradEPoints, ic, Kokkos::ALL(), Kokkos::ALL()),OPERATOR_GRAD); } - OrientationTools::modifyBasisByOrientation(basisGradAtGradCubPoints, nonOrientedBasisGradAtGradCubPoints, orts, cellBasis); - OrientationTools::modifyBasisByOrientation(basisGradAtTargetGradCubPoints, nonOrientedBasisGradAtTargetGradCubPoints, orts, cellBasis); + OrientationTools::modifyBasisByOrientation(basisGradAtBasisGradEPoints, nonOrientedBasisGradAtBasisGradEPoints, orts, cellBasis); + OrientationTools::modifyBasisByOrientation(basisGradAtTargetGradEPoints, nonOrientedBasisGradAtTargetGradEPoints, orts, cellBasis); } - for(ordinal_type iv=0; ivgetDofOrdinal(0, iv, 0); - computedDofs(computedDofsCount++) = idof; - for(ordinal_type ic=0; icgetTargetPointsRange()); + auto targetGradEPointsRange = Kokkos::create_mirror_view_and_copy(typename SpT::memory_space(),projStruct->getTargetDerivPointsRange()); - for(ordinal_type ie=0; iegetBasisDerivPointsRange()); - ordinal_type edgeCardinality = cellBasis->getDofCount(edgeDim,ie); - ordinal_type numCubPoints = projStruct->getNumBasisDerivEvalPoints(edgeDim, ie); - ordinal_type numTargetCubPoints = projStruct->getNumTargetDerivEvalPoints(edgeDim, ie); - - CellTools::getReferenceEdgeTangent(refEdgeTan, ie, cellBasis->getBaseCellTopology()); - - ScalarViewType edgeBasisAtCubPoints("tanBasisAtElemCubPoints",numCells,edgeCardinality, numCubPoints); - ScalarViewType edgeTargetAtTargetCubPoints("tanBasisAtTargetCubPoints",numCells, numTargetCubPoints); - ScalarViewType weightedBasisAtElemCubPoints("weightedTanBasisAtElemCubPoints",numCells,edgeCardinality, numCubPoints); - ScalarViewType weightedBasisAtTargetCubPoints("weightedTanBasisAtTargetCubPoints",numCells,edgeCardinality, numTargetCubPoints); - ScalarViewType mComputedProjection("mComputedProjection", numCells, numCubPoints); - - ScalarViewType targetEvalWeights = projStruct->getTargetDerivEvalWeights(edgeDim, ie); - ScalarViewType basisEvalWeights = projStruct->getBasisDerivEvalWeights(edgeDim, ie); - - //Note: we are not considering the jacobian of the orientation map since it is simply a scalar term for the integrals and it does not affect the projection - ordinal_type offsetBasis = projStruct->getBasisDerivPointsRange(edgeDim, ie).first; - ordinal_type offsetTarget = projStruct->getTargetDerivPointsRange(edgeDim, ie).first; - for(ordinal_type j=0; j getDofOrdinal(edgeDim, ie, j); - for(ordinal_type ic=0; icgetTopologyKey()); - for(ordinal_type ic=0; icgetAllDofOrdinal()); + ordinal_type computedDofsCount = 0; + for(ordinal_type iv=0; iv policy(0, numCells); + typedef ComputeBasisCoeffsOnVertices_HGRAD functorType; + Kokkos::parallel_for(policy, functorType(basisCoeffs, tagToOrdinal, targetEPointsRange, + targetAtTargetEPoints, basisAtTargetEPoints, numVertices)); - ScalarViewType cubWeights_("cubWeights_", numCells, 1, basisEvalWeights.extent(0)), targetEvalWeights_("targetEvalWeights", numCells, 1, targetEvalWeights.extent(0)); - RealSpaceTools::clone(cubWeights_, basisEvalWeights); - RealSpaceTools::clone(targetEvalWeights_, targetEvalWeights); + for(ordinal_type ie=0; ie::integrate(edgeMassMat_, edgeBasisAtCubPoints, weightedBasisAtElemCubPoints); - FunctionSpaceTools::integrate(edgeRhsMat_, edgeTargetAtTargetCubPoints, weightedBasisAtTargetCubPoints); - FunctionSpaceTools::integrate(edgeRhsMat_, mComputedProjection, weightedBasisAtElemCubPoints,true); + ordinal_type edgeCardinality = cellBasis->getDofCount(edgeDim,ie); + ordinal_type offsetBasis = basisGradEPointsRange(edgeDim, ie).first; + ordinal_type offsetTarget = targetGradEPointsRange(edgeDim, ie).first; + ordinal_type numBasisGradEPoints = range_size(basisGradEPointsRange(edgeDim, ie)); + ordinal_type numTargetGradEPoints = range_size(targetGradEPointsRange(edgeDim, ie)); + auto basisGradEWeights = Kokkos::create_mirror_view_and_copy(typename SpT::memory_space(),projStruct->getBasisDerivEvalWeights(edgeDim,ie)); + auto targetGradEWeights = Kokkos::create_mirror_view_and_copy(typename SpT::memory_space(),projStruct->getTargetDerivEvalWeights(edgeDim,ie)); + + auto edgeTan = Kokkos::subview(refEdgesTan, ie, Kokkos::ALL()); + auto edgeTanHost = Kokkos::create_mirror_view(edgeTan); + CellTools::getReferenceEdgeTangent(edgeTanHost,ie, cellTopo); + Kokkos::deep_copy(edgeTan,edgeTanHost); + + ScalarViewType basisTanAtEPoints("basisTanAtEPoints",numCells,edgeCardinality, numBasisGradEPoints); + ScalarViewType targetGradTanAtTargetGradEPoints("tanBasisAtTargetGradEPoints",numCells, numTargetGradEPoints); + ScalarViewType wBasisAtBasisGradEPoints("wTanBasisAtBasisGradEPoints",numCells,edgeCardinality, numBasisGradEPoints); + ScalarViewType wBasisAtTargetGradEPoints("wTanBasisAtTargetGradEPoints",numCells,edgeCardinality, numTargetGradEPoints); + ScalarViewType negPartialProjGrad("negPartialProjGrad", numCells, numBasisGradEPoints); + + typedef ComputeBasisCoeffsOnEdges_HGRAD functorTypeEdge; + + Kokkos::parallel_for(policy, functorTypeEdge(basisCoeffs, negPartialProjGrad, basisTanAtEPoints, + basisGradAtBasisGradEPoints, basisGradEWeights, wBasisAtBasisGradEPoints, targetGradEWeights, + basisGradAtTargetGradEPoints, wBasisAtTargetGradEPoints, computedDofs, tagToOrdinal, + targetGradTanAtTargetGradEPoints, targetGradAtTargetGradEPoints, refEdgesTan, + edgeCardinality, offsetBasis, + offsetTarget, numVertexDofs, edgeDim, dim, ie)); + ScalarViewType edgeMassMat_("edgeMassMat_", numCells, edgeCardinality, edgeCardinality), + edgeRhsMat_("rhsMat_", numCells, edgeCardinality); - Kokkos::View edgeMassMat("edgeMassMat", edgeCardinality,edgeCardinality); - Kokkos::View edgeRhsMat("edgeRhsMat",edgeCardinality, 1); + FunctionSpaceTools::integrate(edgeMassMat_, basisTanAtEPoints, wBasisAtBasisGradEPoints); + FunctionSpaceTools::integrate(edgeRhsMat_, targetGradTanAtTargetGradEPoints, wBasisAtTargetGradEPoints); + FunctionSpaceTools::integrate(edgeRhsMat_, negPartialProjGrad, wBasisAtBasisGradEPoints,true); - Teuchos::LAPACK lapack; - ordinal_type info = 0; - for(ordinal_type ic=0; ic WorkArrayViewType; + ScalarViewType t_("t",numCells, edgeCardinality); + WorkArrayViewType w_("w",numCells, edgeCardinality); - lapack.POSV('U', edgeCardinality, 1, - edgeMassMat.data(), - edgeMassMat.stride_1(), - edgeRhsMat.data(), - edgeRhsMat.stride_1(), - &info); - - if (info) { - std::stringstream ss; - ss << ">>> ERROR (Intrepid::ProjectionTools::getBasisCoeffs): " - << "LAPACK return with error code: " - << info; - INTREPID2_TEST_FOR_EXCEPTION( true, std::runtime_error, ss.str().c_str() ); - } + auto edgeDofs = Kokkos::subview(tagToOrdinal, edgeDim, ie, Kokkos::ALL()); + + ElemSystem edgeSystem("edgeSystem", false); + edgeSystem.solve(basisCoeffs, edgeMassMat_, edgeRhsMat_, t_, w_, edgeDofs, edgeCardinality); - for(ordinal_type i=0; igetDofOrdinal(edgeDim, ie, i); - basisCoeffs(ic,edge_dof) = edgeRhsMat(i,0); - } - } for(ordinal_type i=0; igetDofOrdinal(edgeDim, ie, i); + computedDofs(computedDofsCount++) = tagToOrdinal(edgeDim, ie, i); } - ScalarViewType ortJacobian("ortJacobian", faceDim, faceDim); - for(ordinal_type iface=0; ifacegetTopologyKey(faceDim,iface); - + const auto topoKey = refTopologyKey(faceDim,iface); ordinal_type faceCardinality = cellBasis->getDofCount(faceDim,iface); - ordinal_type numTargetGradCubPoints = projStruct->getNumTargetDerivEvalPoints(faceDim, iface); - ordinal_type numGradCubPoints = projStruct->getNumBasisDerivEvalPoints(faceDim, iface); - - CellTools::getReferenceFaceTangents(refFaceTanU, refFaceTanV,iface, cellTopo); - - ScalarViewType faceBasisGradAtGradCubPoints("normaBasisGradAtGradCubPoints",numCells,faceCardinality, numGradCubPoints,faceDim); - ScalarViewType wBasisGradAtGradCubPoints("weightedNormalBasisGradAtGradCubPoints",numCells,faceCardinality, numGradCubPoints,faceDim); - - ScalarViewType faceBasisGradAtTargetGradCubPoints("normalBasisGradAtTargetGradCubPoints",numCells,faceCardinality, numTargetGradCubPoints,faceDim); - ScalarViewType wBasisGradBasisAtTargetGradCubPoints("weightedNormalBasisGradAtTargetGradCubPoints",numCells,faceCardinality, numTargetGradCubPoints,faceDim); - - ScalarViewType targetGradAtTargetGradCubPoints("targetGradAtTargetGradCubPoints",numCells, numTargetGradCubPoints,faceDim); - ScalarViewType mComputedProjectionGrad("mNormalComputedProjection", numCells,numGradCubPoints,faceDim); - - ordinal_type offsetBasisGrad = projStruct->getBasisDerivPointsRange(faceDim, iface).first; - ordinal_type offsetTargetGrad = projStruct->getTargetDerivPointsRange(faceDim, iface).first; - ScalarViewType targetGradCubWeights = projStruct->getTargetDerivEvalWeights(faceDim, iface); - ScalarViewType gradCubWeights = projStruct->getBasisDerivEvalWeights(faceDim, iface); - - //Note: we are not considering the jacobian of the orientation map since it is simply a scalar term for the integrals and it does not affect the projection - for(ordinal_type ic=0; icgetDofOrdinal(faceDim, iface, j); - for(ordinal_type itan=0; itan getBasisDerivEvalWeights(faceDim,iface)); + auto targetGradEWeights = Kokkos::create_mirror_view_and_copy(typename SpT::memory_space(),projStruct->getTargetDerivEvalWeights(faceDim,iface)); + + auto refFaceTanU = Kokkos::subview(refFacesTangents, iface, Kokkos::ALL, 0); + auto refFaceTanV = Kokkos::subview(refFacesTangents, iface, Kokkos::ALL,1); + auto refFaceTanUHost = Kokkos::create_mirror_view(refFaceTanU); + auto refFaceTanVHost = Kokkos::create_mirror_view(refFaceTanV); + CellTools::getReferenceFaceTangents(refFaceTanUHost, refFaceTanVHost, iface, cellTopo); + Kokkos::deep_copy(refFaceTanU, refFaceTanUHost); + Kokkos::deep_copy(refFaceTanV, refFaceTanVHost); + + ScalarViewType faceBasisGradAtGradEPoints("normaBasisGradAtGradEPoints",numCells,faceCardinality, numGradEPoints,faceDim); + ScalarViewType wBasisGradAtGradEPoints("wNormalBasisGradAtGradEPoints",numCells,faceCardinality, numGradEPoints,faceDim); + ScalarViewType wBasisGradBasisAtTargetGradEPoints("wNormalBasisGradAtTargetGradEPoints",numCells,faceCardinality, numTargetGradEPoints,faceDim); + ScalarViewType targetGradTanAtTargetGradEPoints("targetGradTanAtTargetGradEPoints",numCells, numTargetGradEPoints,faceDim); + ScalarViewType negPartialProjGrad("mNormalComputedProjection", numCells,numGradEPoints,faceDim); + + typedef ComputeBasisCoeffsOnFaces_HGRAD functorTypeFace_HGRAD; + + Kokkos::parallel_for(policy, functorTypeFace_HGRAD(basisCoeffs, negPartialProjGrad, faceBasisGradAtGradEPoints, + basisGradAtBasisGradEPoints, basisGradEWeights, wBasisGradAtGradEPoints, targetGradEWeights, + basisGradAtTargetGradEPoints,wBasisGradBasisAtTargetGradEPoints, computedDofs, tagToOrdinal, + orts,targetGradTanAtTargetGradEPoints,targetGradAtTargetGradEPoints, + refFacesTangents, faceCardinality, offsetBasisGrad, + offsetTargetGrad, numVertexDofs+numEdgeDofs, numFaces, faceDim, + dim, iface, topoKey)); ScalarViewType faceMassMat_("faceMassMat_", numCells, faceCardinality, faceCardinality), faceRhsMat_("rhsMat_", numCells, faceCardinality); - FunctionSpaceTools::integrate(faceMassMat_, faceBasisGradAtGradCubPoints, wBasisGradAtGradCubPoints); + FunctionSpaceTools::integrate(faceMassMat_, faceBasisGradAtGradEPoints, wBasisGradAtGradEPoints); - FunctionSpaceTools::integrate(faceRhsMat_, targetGradAtTargetGradCubPoints, wBasisGradBasisAtTargetGradCubPoints); - FunctionSpaceTools::integrate(faceRhsMat_, mComputedProjectionGrad, wBasisGradAtGradCubPoints,true); + FunctionSpaceTools::integrate(faceRhsMat_, targetGradTanAtTargetGradEPoints, wBasisGradBasisAtTargetGradEPoints); + FunctionSpaceTools::integrate(faceRhsMat_, negPartialProjGrad, wBasisGradAtGradEPoints,true); Kokkos::View faceMassMat("faceMassMat", faceCardinality,faceCardinality); Kokkos::View faceRhsMat("faceRhsMat",faceCardinality, 1); - Teuchos::LAPACK lapack; - ordinal_type info = 0; - for(ordinal_type ic=0; ic WorkArrayViewType; + ScalarViewType t_("t",numCells, faceCardinality); + WorkArrayViewType w_("w",numCells, faceCardinality); - lapack.POSV('U', faceCardinality, 1, - faceMassMat.data(), - faceMassMat.stride_1(), - faceRhsMat.data(), - faceRhsMat.stride_1(), - &info); - - if (info) { - std::stringstream ss; - ss << ">>> ERROR (Intrepid::ProjectionTools::getBasisCoeffs): " - << "LAPACK return with error code: " - << info; - INTREPID2_TEST_FOR_EXCEPTION( true, std::runtime_error, ss.str().c_str() ); - } + auto faceDofs = Kokkos::subview(tagToOrdinal, faceDim, iface, Kokkos::ALL()); - for(ordinal_type i=0; igetDofOrdinal(faceDim, iface, i); - basisCoeffs(ic,face_dof) = faceRhsMat(i,0); - } - } + ElemSystem faceSystem("faceSystem", false); + faceSystem.solve(basisCoeffs, faceMassMat_, faceRhsMat_, t_, w_, faceDofs, faceCardinality); for(ordinal_type i=0; igetDofOrdinal(faceDim, iface, i); + computedDofs(computedDofsCount++) = tagToOrdinal(faceDim, iface, i); } ordinal_type numElemDofs = cellBasis->getDofCount(dim,0); if(numElemDofs>0) { - range_type cellGradPointsRange = projStruct->getTargetDerivPointsRange(dim, 0); - - ordinal_type numTargetGradCubPoints = projStruct->getNumTargetDerivEvalPoints(dim,0); - ordinal_type numGradCubPoints = projStruct->getNumBasisDerivEvalPoints(dim,0); - - ScalarViewType internalBasisGradAtGradCubPoints("internalBasisGradAtCubPoints",numCells,numElemDofs, numGradCubPoints, dim); - ScalarViewType internalBasisGradAtTargetGradCubPoints("weightedBasisGradAtGradCubPoints",numCells,numElemDofs, numTargetGradCubPoints,dim); - ScalarViewType mComputedProjectionGrad("mComputedProjectionGrad", numCells, numGradCubPoints, dim); - - ScalarViewType targetGradCubWeights = projStruct->getTargetDerivEvalWeights(dim, 0); - ScalarViewType cubGradWeights = projStruct->getBasisDerivEvalWeights(dim, 0); - ordinal_type offsetBasisGrad = projStruct->getBasisDerivPointsRange(dim, 0).first; - ordinal_type offsetTargetGrad = projStruct->getTargetDerivPointsRange(dim, 0).first; - - - ScalarViewType wBasisGradAtGradCubPoints("weightedBasisGradAtGradCubPoints",numCells,numElemDofs, numGradCubPoints,dim); - ScalarViewType wBasisGradBasisAtTargetGradCubPoints("weightedBasisGradAtTargetGradCubPoints",numCells,numElemDofs, numTargetGradCubPoints,dim); - for(ordinal_type j=0; j getDofOrdinal(dim, 0, j); - for(ordinal_type ic=0; icgetTargetDerivEvalWeights(dim,0)); + auto basisGradEWeights = Kokkos::create_mirror_view_and_copy(typename SpT::memory_space(),projStruct->getBasisDerivEvalWeights(dim,0)); + + ScalarViewType cellBasisGradAtGradEPoints("internalBasisGradAtEPoints",numCells,numElemDofs, numGradEPoints, dim); + ScalarViewType negPartialProjGrad("negPartialProjGrad", numCells, numGradEPoints, dim); + ScalarViewType wBasisGradAtGradEPoints("wBasisGradAtGradEPoints",numCells,numElemDofs, numGradEPoints,dim); + ScalarViewType wBasisGradBasisAtTargetGradEPoints("wBasisGradAtTargetGradEPoints",numCells,numElemDofs, numTargetGradEPoints,dim); + + auto elemDof = Kokkos::subview(tagToOrdinal, dim, 0, Kokkos::ALL()); + typedef ComputeBasisCoeffsOnCells_HGRAD functorTypeCell_HGRAD; + Kokkos::parallel_for(policy, functorTypeCell_HGRAD(basisCoeffs, negPartialProjGrad, cellBasisGradAtGradEPoints, + basisGradAtBasisGradEPoints, basisGradEWeights, wBasisGradAtGradEPoints, targetGradEWeights, + basisGradAtTargetGradEPoints, wBasisGradBasisAtTargetGradEPoints, computedDofs, elemDof, + dim, numElemDofs, offsetBasisGrad, offsetTargetGrad, numVertexDofs+numEdgeDofs+numFaceDofs)); ScalarViewType cellMassMat_("cellMassMat_", numCells, numElemDofs, numElemDofs), cellRhsMat_("rhsMat_", numCells, numElemDofs); - FunctionSpaceTools::integrate(cellMassMat_, internalBasisGradAtGradCubPoints, wBasisGradAtGradCubPoints); - FunctionSpaceTools::integrate(cellRhsMat_, Kokkos::subview(targetGradAtGradEvalPoints,Kokkos::ALL(),cellGradPointsRange,Kokkos::ALL()), wBasisGradBasisAtTargetGradCubPoints); - FunctionSpaceTools::integrate(cellRhsMat_, mComputedProjectionGrad, wBasisGradAtGradCubPoints, true); + FunctionSpaceTools::integrate(cellMassMat_, cellBasisGradAtGradEPoints, wBasisGradAtGradEPoints); + FunctionSpaceTools::integrate(cellRhsMat_, Kokkos::subview(targetGradAtTargetGradEPoints,Kokkos::ALL(),cellTargetGradEPointsRange,Kokkos::ALL()), wBasisGradBasisAtTargetGradEPoints); + FunctionSpaceTools::integrate(cellRhsMat_, negPartialProjGrad, wBasisGradAtGradEPoints, true); - Kokkos::View cellMassMat("cellMassMat", numElemDofs,numElemDofs); - Kokkos::View cellRhsMat("cellRhsMat",numElemDofs, 1); + typedef Kokkos::DynRankView WorkArrayViewType; + ScalarViewType t_("t",numCells, numElemDofs); + WorkArrayViewType w_("w",numCells, numElemDofs); - Teuchos::LAPACK lapack; - ordinal_type info = 0; - for(ordinal_type ic=0; icgetDofOrdinal(dim, 0, i); - basisCoeffs(ic,idof) = cellRhsMat(i,0); - } - - if (info) { - std::stringstream ss; - ss << ">>> ERROR (Intrepid::ProjectionTools::getBasisCoeffs): " - << "LAPACK return with error code: " - << info; - INTREPID2_TEST_FOR_EXCEPTION( true, std::runtime_error, ss.str().c_str() ); - } - } + auto cellDofs = Kokkos::subview(tagToOrdinal, dim, 0, Kokkos::ALL()); + ElemSystem cellSystem("cellSystem", true); + cellSystem.solve(basisCoeffs, cellMassMat_, cellRhsMat_, t_, w_, cellDofs, numElemDofs); } } } diff --git a/packages/intrepid2/src/Projection/Intrepid2_ProjectionToolsDefHVOL.hpp b/packages/intrepid2/src/Projection/Intrepid2_ProjectionToolsDefHVOL.hpp index 9ad65440990a..eb9bfa6bcc12 100644 --- a/packages/intrepid2/src/Projection/Intrepid2_ProjectionToolsDefHVOL.hpp +++ b/packages/intrepid2/src/Projection/Intrepid2_ProjectionToolsDefHVOL.hpp @@ -61,22 +61,15 @@ template template void -ProjectionTools::getHVolEvaluationPoints(typename BasisType::ScalarViewType evaluationPoints, +ProjectionTools::getHVolEvaluationPoints(typename BasisType::ScalarViewType ePoints, const Kokkos::DynRankView /*orts*/, const BasisType* cellBasis, ProjectionStruct * projStruct, - const EvalPointsType evalPointType) { - typedef typename BasisType::scalarType scalarType; - typedef Kokkos::DynRankView ScalarViewType; + const EvalPointsType ePointType) { ordinal_type dim = cellBasis->getBaseCellTopology().getDimension(); - - ScalarViewType cubPoints; - if(evalPointType == TARGET) { - cubPoints = projStruct->getTargetEvalPoints(dim, 0); - } else { - cubPoints = projStruct->getBasisEvalPoints(dim, 0); - } - RealSpaceTools::clone(evaluationPoints,cubPoints); + auto refEPoints = Kokkos::create_mirror_view_and_copy(typename SpT::memory_space(),projStruct->getEvalPoints(dim,0,ePointType)); + auto ePointsRange = projStruct->getPointsRange(ePointType); + RealSpaceTools::clone(Kokkos::subview(ePoints, Kokkos::ALL(), ePointsRange(dim, 0), Kokkos::ALL()), refEPoints); } @@ -87,87 +80,74 @@ typename BasisType, typename ortValueType,class ...ortProperties> void ProjectionTools::getHVolBasisCoeffs(Kokkos::DynRankView basisCoeffs, - const Kokkos::DynRankView targetAtEvalPoints, - const typename BasisType::ScalarViewType evaluationPoints, + const Kokkos::DynRankView targetAtTargetEPoints, + const typename BasisType::ScalarViewType targetEPoints, const Kokkos::DynRankView orts, const BasisType* cellBasis, ProjectionStruct * projStruct){ - typedef typename Kokkos::Impl::is_space::host_mirror_space::execution_space host_space_type; typedef typename BasisType::scalarType scalarType; typedef Kokkos::DynRankView ScalarViewType; ordinal_type dim = cellBasis->getBaseCellTopology().getDimension(); ordinal_type basisCardinality = cellBasis->getCardinality(); - ordinal_type numCubPoints = projStruct->getNumBasisEvalPoints(dim, 0); - ordinal_type numTargetCubPoints = projStruct->getNumTargetEvalPoints(dim, 0); - ScalarViewType cubPoints = projStruct->getBasisEvalPoints(dim, 0); - ScalarViewType cubWeights = projStruct->getBasisEvalWeights(dim, 0); - ScalarViewType cubTargetWeights = projStruct->getTargetEvalWeights(dim, 0); + ordinal_type numCells = targetAtTargetEPoints.extent(0); + + auto refTargetEWeights = Kokkos::create_mirror_view_and_copy(typename SpT::memory_space(),projStruct->getTargetEvalWeights(dim,0)); + auto targetEPointsRange = Kokkos::create_mirror_view_and_copy(typename SpT::memory_space(),projStruct->getTargetPointsRange()); - ordinal_type numCells = targetAtEvalPoints.extent(0); + auto refBasisEWeights = Kokkos::create_mirror_view_and_copy(typename SpT::memory_space(),projStruct->getBasisEvalWeights(dim,0)); + auto basisEPointsRange = Kokkos::create_mirror_view_and_copy(typename SpT::memory_space(),projStruct->getBasisPointsRange()); - ScalarViewType basisAtCubPoints("basisAtcubPoints", basisCardinality, numCubPoints); - ScalarViewType basisAtcubTargetPoints("basisAtcubTargetPoints", basisCardinality, numTargetCubPoints); + ordinal_type numTargetEPoints = range_size(targetEPointsRange(dim,0)); + ordinal_type numBasisEPoints = range_size(basisEPointsRange(dim,0)); - cellBasis->getValues(basisAtCubPoints, cubPoints); - if(evaluationPoints.rank()==3) - cellBasis->getValues(basisAtcubTargetPoints, Kokkos::subview(evaluationPoints,0,Kokkos::ALL(),Kokkos::ALL())); + ScalarViewType basisAtBasisEPoints("basisAtBasisEPoints", 1, basisCardinality, numBasisEPoints); + ScalarViewType basisAtTargetEPoints("basisAtTargetEPoints", basisCardinality, numTargetEPoints); + + ScalarViewType basisEPoints("basisEPoints",numCells,projStruct->getNumBasisEvalPoints(), dim); + getHVolEvaluationPoints(basisEPoints, orts, cellBasis, projStruct, EvalPointsType::BASIS); + + cellBasis->getValues(Kokkos::subview(basisAtBasisEPoints, 0, Kokkos::ALL(), Kokkos::ALL()), Kokkos::subview(basisEPoints,0, Kokkos::ALL(), Kokkos::ALL())); + if(targetEPoints.rank()==3) + cellBasis->getValues(basisAtTargetEPoints, Kokkos::subview(targetEPoints, 0, Kokkos::ALL(), Kokkos::ALL())); else - cellBasis->getValues(basisAtcubTargetPoints, evaluationPoints); - - - ScalarViewType weightedBasisAtcubTargetPoints_("weightedBasisAtcubTargetPoints_",numCells, basisCardinality, numTargetCubPoints); - ScalarViewType cubWeights_(cubWeights.data(),1,numCubPoints); - ScalarViewType evaluationWeights_(cubTargetWeights.data(),1,numTargetCubPoints); - ScalarViewType basisAtcubTargetPoints_(basisAtcubTargetPoints.data(),1, basisCardinality, numTargetCubPoints); - ScalarViewType basisAtCubPoints_(basisAtCubPoints.data(),1, basisCardinality, numCubPoints); - ScalarViewType weightedBasisAtCubPoints("weightedBasisAtCubPoints",1,basisCardinality, numCubPoints); - ScalarViewType weightedBasisAtcubTargetPoints("weightedBasisAtcubTargetPoints",1, basisCardinality, numTargetCubPoints); - ArrayTools::scalarMultiplyDataField( weightedBasisAtCubPoints, cubWeights_, basisAtCubPoints_, false); - ArrayTools::scalarMultiplyDataField( weightedBasisAtcubTargetPoints, evaluationWeights_, basisAtcubTargetPoints, false); - RealSpaceTools::clone(weightedBasisAtcubTargetPoints_,Kokkos::subview(weightedBasisAtcubTargetPoints,0,Kokkos::ALL(), Kokkos::ALL())); - - Kokkos::View - massMat("massMat", basisCardinality, basisCardinality), - rhsMat("rhsMat", basisCardinality, numCells ); - - Kokkos::DynRankView massMat_(massMat.data(),1,basisCardinality,basisCardinality); - Kokkos::DynRankView rhsMatTrans("rhsMatTrans",numCells,basisCardinality); - - FunctionSpaceTools::integrate(massMat_, basisAtCubPoints_, weightedBasisAtCubPoints); - FunctionSpaceTools::integrate(rhsMatTrans, targetAtEvalPoints, weightedBasisAtcubTargetPoints_); - - for(ordinal_type i=0; i lapack; - ordinal_type info = 0; - - lapack.POSV('U', basisCardinality, numCells, - massMat.data(), - massMat.stride_1(), - rhsMat.data(), - rhsMat.stride_1(), - &info); - - for(ordinal_type i=0; i>> ERROR (Intrepid::ProjectionTools::getBasisCoeffs): " - << "LAPACK return with error code: " - << info; - INTREPID2_TEST_FOR_EXCEPTION( true, std::runtime_error, ss.str().c_str() ); + cellBasis->getValues(basisAtTargetEPoints, targetEPoints); + + ScalarViewType weightedBasisAtTargetEPoints("weightedBasisAtTargetEPoints_",numCells, basisCardinality, numTargetEPoints); + ScalarViewType weightedBasisAtBasisEPoints("weightedBasisAtBasisEPoints", 1, basisCardinality, numBasisEPoints); + + auto tagToOrdinal = Kokkos::create_mirror_view_and_copy(typename SpT::memory_space(), cellBasis->getAllDofOrdinal()); + auto cellDofs = Kokkos::subview(tagToOrdinal, dim, 0, Kokkos::ALL()); + + ScalarViewType + massMat0("massMat0", 1, basisCardinality, basisCardinality), + massMat("massMat", numCells, basisCardinality, basisCardinality), + rhsMat("rhsMat", numCells, basisCardinality ); + + ordinal_type offsetBasis = basisEPointsRange(dim,0).first; + ordinal_type offsetTarget = targetEPointsRange(dim,0).first; + for(ordinal_type j=0; j ::integrate(massMat0, basisAtBasisEPoints, weightedBasisAtBasisEPoints); + RealSpaceTools::clone(massMat, Kokkos::subview(massMat0,0,Kokkos::ALL(), Kokkos::ALL())); + RealSpaceTools::clone(weightedBasisAtTargetEPoints, Kokkos::subview(weightedBasisAtTargetEPoints,0,Kokkos::ALL(), Kokkos::ALL())); + FunctionSpaceTools::integrate(rhsMat, targetAtTargetEPoints, weightedBasisAtTargetEPoints); + typedef Kokkos::DynRankView WorkArrayViewType; + ScalarViewType t_("t",numCells, basisCardinality); + WorkArrayViewType w_("w",numCells,basisCardinality); + + ElemSystem cellSystem("cellSystem", true); + cellSystem.solve(basisCoeffs, massMat, rhsMat, t_, w_, cellDofs, basisCardinality); +} } } diff --git a/packages/intrepid2/src/Projection/Intrepid2_ProjectionToolsDefL2.hpp b/packages/intrepid2/src/Projection/Intrepid2_ProjectionToolsDefL2.hpp index 049c057ec99b..c69007800144 100644 --- a/packages/intrepid2/src/Projection/Intrepid2_ProjectionToolsDefL2.hpp +++ b/packages/intrepid2/src/Projection/Intrepid2_ProjectionToolsDefL2.hpp @@ -57,107 +57,367 @@ namespace Intrepid2 { namespace Experimental { + +template +struct ComputeBasisCoeffsOnVertices_L2 { + ViewType1 basisCoeffs_; + const ViewType2 tagToOrdinal_; + const ViewType3 targetEPointsRange_; + const ViewType4 targetAtTargetEPoints_; + const ViewType5 basisAtTargetEPoints_; + ordinal_type numVertices_; + + + ComputeBasisCoeffsOnVertices_L2(ViewType1 basisCoeffs, ViewType2 tagToOrdinal, ViewType3 targetEPointsRange, + ViewType4 targetAtTargetEPoints, ViewType5 basisAtTargetEPoints, ordinal_type numVertices) : + basisCoeffs_(basisCoeffs), tagToOrdinal_(tagToOrdinal), targetEPointsRange_(targetEPointsRange), + targetAtTargetEPoints_(targetAtTargetEPoints), basisAtTargetEPoints_(basisAtTargetEPoints), numVertices_(numVertices) {} + + void + KOKKOS_INLINE_FUNCTION + operator()(const ordinal_type ic) const { + for(ordinal_type iv=0; iv +struct ComputeBasisCoeffsOnEdges_L2 { + const ViewType1 basisCoeffs_; + const ViewType2 negPartialProj_; + const ViewType2 basisDofDofAtBasisEPoints_; + const ViewType2 basisAtBasisEPoints_; + const ViewType3 basisEWeights_; + const ViewType2 wBasisDofAtBasisEPoints_; + const ViewType3 targetEWeights_; + const ViewType2 basisAtTargetEPoints_; + const ViewType2 wBasisDofAtTargetEPoints_; + const ViewType4 computedDofs_; + const ViewType5 tagToOrdinal_; + const ViewType6 targetAtTargetEPoints_; + const ViewType2 targetTanAtTargetEPoints_; + const ViewType2 refEdgesVec_; + ordinal_type fieldDim_; + ordinal_type edgeCardinality_; + ordinal_type offsetBasis_; + ordinal_type offsetTarget_; + ordinal_type numVertexDofs_; + ordinal_type edgeDim_; + ordinal_type iedge_; + + ComputeBasisCoeffsOnEdges_L2(const ViewType1 basisCoeffs, ViewType2 negPartialProj, const ViewType2 basisDofDofAtBasisEPoints, + const ViewType2 basisAtBasisEPoints, const ViewType3 basisEWeights, const ViewType2 wBasisDofAtBasisEPoints, const ViewType3 targetEWeights, + const ViewType2 basisAtTargetEPoints, const ViewType2 wBasisDofAtTargetEPoints, const ViewType4 computedDofs, const ViewType5 tagToOrdinal, + const ViewType6 targetAtTargetEPoints, const ViewType2 targetTanAtTargetEPoints, const ViewType2 refEdgesVec, + ordinal_type fieldDim, ordinal_type edgeCardinality, ordinal_type offsetBasis, + ordinal_type offsetTarget, ordinal_type numVertexDofs, ordinal_type edgeDim, ordinal_type iedge) : + basisCoeffs_(basisCoeffs), negPartialProj_(negPartialProj), basisDofDofAtBasisEPoints_(basisDofDofAtBasisEPoints), + basisAtBasisEPoints_(basisAtBasisEPoints), basisEWeights_(basisEWeights), wBasisDofAtBasisEPoints_(wBasisDofAtBasisEPoints), targetEWeights_(targetEWeights), + basisAtTargetEPoints_(basisAtTargetEPoints), wBasisDofAtTargetEPoints_(wBasisDofAtTargetEPoints), + computedDofs_(computedDofs), tagToOrdinal_(tagToOrdinal), targetAtTargetEPoints_(targetAtTargetEPoints), + targetTanAtTargetEPoints_(targetTanAtTargetEPoints), refEdgesVec_(refEdgesVec), + fieldDim_(fieldDim), edgeCardinality_(edgeCardinality), offsetBasis_(offsetBasis), + offsetTarget_(offsetTarget), numVertexDofs_(numVertexDofs), edgeDim_(edgeDim), iedge_(iedge) + {} + + void + KOKKOS_INLINE_FUNCTION + operator()(const ordinal_type ic) const { + for(ordinal_type j=0; j +struct ComputeBasisCoeffsOnFaces_L2 { + const ViewType1 basisCoeffs_; + const ViewType2 negPartialProj_; + const ViewType2 faceBasisDofAtBasisEPoints_; + const ViewType2 basisAtBasisEPoints_; + const ViewType3 basisEWeights_; + const ViewType2 wBasisDofAtBasisEPoints_; + const ViewType3 targetEWeights_; + const ViewType2 basisAtTargetEPoints_; + const ViewType2 wBasisDofAtTargetEPoints_; + const ViewType4 computedDofs_; + const ViewType5 tagToOrdinal_; + const ViewType6 orts_; + const ViewType7 targetAtTargetEPoints_; + const ViewType2 targetDofAtTargetEPoints_; + const ViewType2 ortJacobian_; + const ViewType2 faceCoeff_; + const ViewType2 refFacesTangents_; + const ViewType2 refFacesNormal_; + ordinal_type fieldDim_; + ordinal_type faceCardinality_; + ordinal_type offsetBasis_; + ordinal_type offsetTarget_; + ordinal_type numVertexEdgeDofs_; + ordinal_type numFaces_; + ordinal_type faceDim_; + ordinal_type faceDofDim_; + ordinal_type dim_; + ordinal_type iface_; + unsigned topoKey_; + bool isHCurlBasis_, isHDivBasis_; + + ComputeBasisCoeffsOnFaces_L2(const ViewType1 basisCoeffs, ViewType2 negPartialProj, const ViewType2 faceBasisDofAtBasisEPoints, + const ViewType2 basisAtBasisEPoints, const ViewType3 basisEWeights, const ViewType2 wBasisDofAtBasisEPoints, const ViewType3 targetEWeights, + const ViewType2 basisAtTargetEPoints, const ViewType2 wBasisDofAtTargetEPoints, const ViewType4 computedDofs, const ViewType5 tagToOrdinal, + const ViewType6 orts, const ViewType7 targetAtTargetEPoints, const ViewType2 targetDofAtTargetEPoints, const ViewType2 ortJacobian, const ViewType2 faceCoeff, + const ViewType2 refFacesTangents, const ViewType2 refFacesNormal, ordinal_type fieldDim, ordinal_type faceCardinality, ordinal_type offsetBasis, + ordinal_type offsetTarget, ordinal_type numVertexEdgeDofs, ordinal_type numFaces, ordinal_type faceDim, ordinal_type faceDofDim, + ordinal_type dim, ordinal_type iface, unsigned topoKey, bool isHCurlBasis, bool isHDivBasis) : + basisCoeffs_(basisCoeffs), negPartialProj_(negPartialProj), faceBasisDofAtBasisEPoints_(faceBasisDofAtBasisEPoints), + basisAtBasisEPoints_(basisAtBasisEPoints), basisEWeights_(basisEWeights), wBasisDofAtBasisEPoints_(wBasisDofAtBasisEPoints), targetEWeights_(targetEWeights), + basisAtTargetEPoints_(basisAtTargetEPoints), wBasisDofAtTargetEPoints_(wBasisDofAtTargetEPoints), + computedDofs_(computedDofs), tagToOrdinal_(tagToOrdinal), orts_(orts), targetAtTargetEPoints_(targetAtTargetEPoints), + targetDofAtTargetEPoints_(targetDofAtTargetEPoints), ortJacobian_(ortJacobian), faceCoeff_(faceCoeff), + refFacesTangents_(refFacesTangents), refFacesNormal_(refFacesNormal), + fieldDim_(fieldDim), faceCardinality_(faceCardinality), offsetBasis_(offsetBasis), + offsetTarget_(offsetTarget), numVertexEdgeDofs_(numVertexEdgeDofs), numFaces_(numFaces), + faceDim_(faceDim), faceDofDim_(faceDofDim), dim_(dim), iface_(iface), topoKey_(topoKey), + isHCurlBasis_(isHCurlBasis), isHDivBasis_(isHDivBasis) + {} + + void + KOKKOS_INLINE_FUNCTION + operator()(const ordinal_type ic) const { + + ordinal_type fOrt[6]; + orts_(ic).getFaceOrientation(fOrt, numFaces_); + ordinal_type ort = fOrt[iface_]; + //Note: we are not considering the jacobian of the orientation map since it is simply a scalar term for the integrals and it does not affect the projection + + auto ortJacobian = Kokkos::subview(ortJacobian_, ic, Kokkos::ALL(), Kokkos::ALL()); + if(isHCurlBasis_) { + Impl::OrientationTools::getJacobianOfOrientationMap(ortJacobian, topoKey_, ort); + for(ordinal_type d=0; d +struct ComputeBasisCoeffsOnCells_L2 { + const ViewType1 basisCoeffs_; + const ViewType2 negPartialProj_; + const ViewType2 internalBasisAtBasisEPoints_; + const ViewType2 basisAtBasisEPoints_; + const ViewType3 basisEWeights_; + const ViewType2 wBasisAtBasisEPoints_; + const ViewType3 targetEWeights_; + const ViewType2 basisAtTargetEPoints_; + const ViewType2 wBasisDofAtTargetEPoints_; + const ViewType4 computedDofs_; + const ViewType5 elemDof_; + ordinal_type fieldDim_; + ordinal_type numElemDofs_; + ordinal_type offsetBasis_; + ordinal_type offsetTarget_; + ordinal_type numVertexEdgeFaceDofs_; + + ComputeBasisCoeffsOnCells_L2(const ViewType1 basisCoeffs, ViewType2 negPartialProj, const ViewType2 internalBasisAtBasisEPoints, + const ViewType2 basisAtBasisEPoints, const ViewType3 basisEWeights, const ViewType2 wBasisAtBasisEPoints, const ViewType3 targetEWeights, + const ViewType2 basisAtTargetEPoints, const ViewType2 wBasisDofAtTargetEPoints, const ViewType4 computedDofs, const ViewType5 elemDof, + ordinal_type fieldDim, ordinal_type numElemDofs, ordinal_type offsetBasis, ordinal_type offsetTarget, ordinal_type numVertexEdgeFaceDofs) : + basisCoeffs_(basisCoeffs), negPartialProj_(negPartialProj), internalBasisAtBasisEPoints_(internalBasisAtBasisEPoints), + basisAtBasisEPoints_(basisAtBasisEPoints), basisEWeights_(basisEWeights), wBasisAtBasisEPoints_(wBasisAtBasisEPoints), targetEWeights_(targetEWeights), + basisAtTargetEPoints_(basisAtTargetEPoints), wBasisDofAtTargetEPoints_(wBasisDofAtTargetEPoints), + computedDofs_(computedDofs), elemDof_(elemDof), fieldDim_(fieldDim), numElemDofs_(numElemDofs), offsetBasis_(offsetBasis), + offsetTarget_(offsetTarget), numVertexEdgeFaceDofs_(numVertexEdgeFaceDofs) {} + + void + KOKKOS_INLINE_FUNCTION + operator()(const ordinal_type ic) const { + + for(ordinal_type j=0; j template void -ProjectionTools::getL2EvaluationPoints(typename BasisType::ScalarViewType evaluationPoints, +ProjectionTools::getL2EvaluationPoints(typename BasisType::ScalarViewType ePoints, const Kokkos::DynRankView orts, const BasisType* cellBasis, ProjectionStruct * projStruct, - const EvalPointsType evalPointType) { + const EvalPointsType ePointType) { typedef typename BasisType::scalarType scalarType; - typedef Kokkos::DynRankView ScalarViewType; + typedef Kokkos::DynRankView ScalarViewType; typedef Kokkos::pair range_type; const auto cellTopo = cellBasis->getBaseCellTopology(); + //const auto cellTopoKey = cellBasis->getBaseCellTopology().getKey(); ordinal_type dim = cellTopo.getDimension(); - ordinal_type numCells = evaluationPoints.extent(0); + ordinal_type numCells = ePoints.extent(0); const ordinal_type edgeDim = 1; const ordinal_type faceDim = 2; ordinal_type numVertices = (cellBasis->getDofCount(0, 0) > 0) ? cellTopo.getVertexCount() : 0; - ordinal_type numEdges = (cellBasis->getDofCount(1, 0) > 0) ? cellTopo.getEdgeCount() : 0; - ordinal_type numFaces = (cellBasis->getDofCount(2, 0) > 0) ? cellTopo.getFaceCount() : 0; + ordinal_type numEdges = (cellBasis->getDofCount(edgeDim, 0) > 0) ? cellTopo.getEdgeCount() : 0; + ordinal_type numFaces = (cellBasis->getDofCount(faceDim, 0) > 0) ? cellTopo.getFaceCount() : 0; + ordinal_type numVols = (cellBasis->getDofCount(dim, 0) > 0); - Kokkos::View eOrt("eOrt", numEdges), fOrt("fOrt", numFaces); + CellTools::setSubcellParametrization(); - if(numVertices>0) { - //TODO: use lattice to retrieve vertex coordinates. - ScalarViewType dofCoords("dofCoords", cellBasis->getCardinality(), dim); - cellBasis->getDofCoords(dofCoords); - for(ordinal_type iv=0; ivgetDofOrdinal(0, iv, 0); - for(ordinal_type d=0; dgetPointsRange(ePointType)); - for(ordinal_type ie=0; iegetTargetPointsRange(edgeDim, ie); - cubPoints = projStruct->getTargetEvalPoints(edgeDim, ie); - } - else { - edgePointsRange = projStruct->getBasisPointsRange(edgeDim, ie); - cubPoints = projStruct->getBasisEvalPoints(edgeDim, ie); - } + typename CellTools::subcellParamViewType subcellParamEdge, subcellParamFace; + if(numEdges>0) + CellTools::getSubcellParametrization(subcellParamEdge, edgeDim, cellTopo); + if(numFaces>0) + CellTools::getSubcellParametrization(subcellParamFace, faceDim, cellTopo); - ScalarViewType orientedTargetCubPoints("orientedTargetCubPoints", cubPoints.extent(0),edgeDim); + auto refTopologyKey = Kokkos::create_mirror_view_and_copy(typename SpT::memory_space(),projStruct->getTopologyKey()); - const auto topoKey = projStruct->getTopologyKey(edgeDim,ie); + ScalarViewType workView("workView", numCells, projStruct->getMaxNumEvalPoints(ePointType), dim-1); - for(ordinal_type ic=0; ic::mapToReferenceSubcell(Kokkos::subview(evaluationPoints,ic,edgePointsRange,Kokkos::ALL()), orientedTargetCubPoints, edgeDim, ie, cellBasis->getBaseCellTopology()); + if(numVertices>0) { + for(ordinal_type iv=0; ivgetEvalPoints(0,iv,ePointType)); + RealSpaceTools::clone(Kokkos::subview(ePoints, Kokkos::ALL(), + ePointsRange(0, iv), Kokkos::ALL()), vertexEPoints); } } + for(ordinal_type ie=0; iegetEvalPoints(edgeDim,ie,ePointType)); - for(ordinal_type iface=0; iface (0, numCells), + KOKKOS_LAMBDA (const size_t ic) { - ScalarViewType cubPoints; - range_type facePointsRange; - if(evalPointType == TARGET) { - cubPoints = projStruct->getTargetEvalPoints(faceDim, iface); - facePointsRange = projStruct->getTargetPointsRange(faceDim, iface); - } else { - cubPoints = projStruct->getBasisEvalPoints(faceDim, iface); - facePointsRange = projStruct->getBasisPointsRange(faceDim, iface); - } - - ScalarViewType faceCubPoints("faceCubPoints", cubPoints.extent(0), faceDim); + ordinal_type eOrt[12]; + orts(ic).getEdgeOrientation(eOrt, numEdges); + ordinal_type ort = eOrt[ie]; - const auto topoKey = projStruct->getTopologyKey(faceDim,iface); - for(ordinal_type ic=0; ic::mapToReferenceSubcell(Kokkos::subview(ePoints,ic,edgePointsRange,Kokkos::ALL()), orientedEdgeEPoints, subcellParamEdge, edgeDim, ie, dim); + }); + } - ordinal_type ort = fOrt(iface); - Impl::OrientationTools::mapToModifiedReference(faceCubPoints,cubPoints,topoKey,ort); - CellTools::mapToReferenceSubcell(Kokkos::subview(evaluationPoints, ic, facePointsRange, Kokkos::ALL()), faceCubPoints, faceDim, iface, cellBasis->getBaseCellTopology()); - } + for(ordinal_type iface=0; ifacegetEvalPoints(faceDim,iface,ePointType)); + + Kokkos::parallel_for + ("Evaluate Points", + Kokkos::RangePolicy (0, numCells), + KOKKOS_LAMBDA (const size_t ic) { + ordinal_type fOrt[6]; + orts(ic).getFaceOrientation(fOrt, numFaces); + ordinal_type ort = fOrt[iface]; + + auto orientedFaceEPoints = Kokkos::subview(workView, ic, faceRefPointsRange, Kokkos::ALL()); + + Impl::OrientationTools::mapToModifiedReference(orientedFaceEPoints,faceEPoints,refTopologyKey(faceDim,iface),ort); + CellTools::mapToReferenceSubcell(Kokkos::subview(ePoints, ic, facePointsRange, Kokkos::ALL()), orientedFaceEPoints, subcellParamFace, faceDim, iface, dim); + }); } - if(cellBasis->getDofCount(dim,0)>0) { - range_type cellPointsRange; - ScalarViewType cubPoints; - if(evalPointType == TARGET) { - cubPoints = projStruct->getTargetEvalPoints(dim, 0); - cellPointsRange = projStruct->getTargetPointsRange(dim, 0); - } else { - cubPoints = projStruct->getBasisEvalPoints(dim, 0); - cellPointsRange = projStruct->getBasisPointsRange(dim, 0); - } - RealSpaceTools::clone(Kokkos::subview(evaluationPoints, Kokkos::ALL(), cellPointsRange, Kokkos::ALL()), cubPoints); + + if(numVols > 0) { + auto pointsRange = ePointsRange(dim, 0); + auto cellEPoints = Kokkos::create_mirror_view_and_copy(typename SpT::memory_space(),projStruct->getEvalPoints(dim,0,ePointType)); + RealSpaceTools::clone(Kokkos::subview(ePoints, Kokkos::ALL(), pointsRange, Kokkos::ALL()), cellEPoints); } } - template template void ProjectionTools::getL2BasisCoeffs(Kokkos::DynRankView basisCoeffs, - const Kokkos::DynRankView targetAtEvalPoints, - const typename BasisType::ScalarViewType evaluationPoints, + const Kokkos::DynRankView targetAtTargetEPoints, + const typename BasisType::ScalarViewType targetEPoints, const Kokkos::DynRankView orts, const BasisType* cellBasis, ProjectionStruct * projStruct){ - typedef typename Kokkos::Impl::is_space::host_mirror_space::execution_space host_space_type; typedef typename BasisType::scalarType scalarType; typedef Kokkos::DynRankView ScalarViewType; typedef Kokkos::pair range_type; const auto cellTopo = cellBasis->getBaseCellTopology(); ordinal_type dim = cellTopo.getDimension(); - ordinal_type numTotalEvaluationPoints(targetAtEvalPoints.extent(1)); + ordinal_type numTotalTargetEPoints(targetAtTargetEPoints.extent(1)); ordinal_type basisCardinality = cellBasis->getCardinality(); - ordinal_type numCells = targetAtEvalPoints.extent(0); + ordinal_type numCells = targetAtTargetEPoints.extent(0); const ordinal_type edgeDim = 1; const ordinal_type faceDim = 2; - const ordinal_type fieldDim = (targetAtEvalPoints.rank()==2) ? 1 : targetAtEvalPoints.extent(2); - - const std::string& name = cellBasis->getName(); + const ordinal_type fieldDim = (targetAtTargetEPoints.rank()==2) ? 1 : targetAtTargetEPoints.extent(2); ordinal_type numVertices = (cellBasis->getDofCount(0, 0) > 0) ? cellTopo.getVertexCount() : 0; ordinal_type numEdges = (cellBasis->getDofCount(1, 0) > 0) ? cellTopo.getEdgeCount() : 0; ordinal_type numFaces = (cellBasis->getDofCount(2, 0) > 0) ? cellTopo.getFaceCount() : 0; - Kokkos::View eOrt("eOrt", numEdges); - Kokkos::View fOrt("fOrt", numFaces); - ScalarViewType refEdgeTan("refEdgeTan", dim); - ScalarViewType refEdgeNormal("refEdgeNormal", dim); - ScalarViewType refFaceTangents("refFaceTangents", dim, 2); - ScalarViewType refFaceNormal("refFaceNormal", dim); - auto refFaceTanU = Kokkos::subview(refFaceTangents, Kokkos::ALL, 0); - auto refFaceTanV = Kokkos::subview(refFaceTangents, Kokkos::ALL, 1); + ScalarViewType refEdgesVec("refEdgesVec", numEdges, dim); + ScalarViewType refFacesTangents("refFaceTangents", numFaces, dim, 2); + ScalarViewType refFacesNormal("refFaceNormal", numFaces, dim); ordinal_type numVertexDofs = numVertices; @@ -209,376 +461,257 @@ ProjectionTools::getL2BasisCoeffs(Kokkos::DynRankViewgetDofCount(faceDim,iface); - Kokkos::View computedDofs("computedDofs",numVertexDofs+numEdgeDofs+numFaceDofs); + Kokkos::View computedDofs("computedDofs", numVertexDofs+numEdgeDofs+numFaceDofs); - ordinal_type computedDofsCount = 0; + auto targetEPointsRange = Kokkos::create_mirror_view_and_copy(typename SpT::memory_space(),projStruct->getTargetPointsRange()); + auto basisEPointsRange = Kokkos::create_mirror_view_and_copy(typename SpT::memory_space(),projStruct->getBasisPointsRange()); - ordinal_type numTotalCubPoints = projStruct->getNumBasisEvalPoints(); - ScalarViewType cubPoints("cubPoints",numCells,numTotalCubPoints, dim); - getL2EvaluationPoints(cubPoints, orts, cellBasis, projStruct, BASIS); + auto refTopologyKey = Kokkos::create_mirror_view_and_copy(typename SpT::memory_space(),projStruct->getTopologyKey()); - ScalarViewType basisAtCubPoints("basisAtCubPoints",numCells,basisCardinality, numTotalCubPoints, fieldDim); - ScalarViewType basisAtTargetCubPoints("basisAtTargetCubPoints",numCells,basisCardinality, numTotalEvaluationPoints, fieldDim); + ordinal_type numTotalBasisEPoints = projStruct->getNumBasisEvalPoints(); + ScalarViewType basisEPoints("basisEPoints",numCells,numTotalBasisEPoints, dim); + getL2EvaluationPoints(basisEPoints, orts, cellBasis, projStruct, EvalPointsType::BASIS); + + auto tagToOrdinal = Kokkos::create_mirror_view_and_copy(typename SpT::memory_space(), cellBasis->getAllDofOrdinal()); + + ScalarViewType basisAtBasisEPoints("basisAtBasisEPoints",numCells,basisCardinality, numTotalBasisEPoints, fieldDim); + ScalarViewType basisAtTargetEPoints("basisAtTargetEPoints",numCells,basisCardinality, numTotalTargetEPoints, fieldDim); { if(fieldDim == 1) { - ScalarViewType nonOrientedBasisAtCubPoints("nonOrientedBasisAtCubPoints",numCells,basisCardinality, numTotalCubPoints); - ScalarViewType nonOrientedBasisAtTargetCubPoints("nonOrientedBasisAtTargetCubPoints",numCells,basisCardinality, numTotalEvaluationPoints); + ScalarViewType nonOrientedBasisAtBasisEPoints("nonOrientedBasisAtBasisEPoints",numCells,basisCardinality, numTotalBasisEPoints); + ScalarViewType nonOrientedBasisAtTargetEPoints("nonOrientedBasisAtTargetEPoints",numCells,basisCardinality, numTotalTargetEPoints); for(ordinal_type ic=0; icgetValues(Kokkos::subview(nonOrientedBasisAtTargetCubPoints,ic,Kokkos::ALL(),Kokkos::ALL()), Kokkos::subview(evaluationPoints, ic, Kokkos::ALL(), Kokkos::ALL())); - cellBasis->getValues(Kokkos::subview(nonOrientedBasisAtCubPoints,ic,Kokkos::ALL(),Kokkos::ALL()), Kokkos::subview(cubPoints, ic, Kokkos::ALL(), Kokkos::ALL())); + cellBasis->getValues(Kokkos::subview(nonOrientedBasisAtTargetEPoints,ic,Kokkos::ALL(),Kokkos::ALL()), Kokkos::subview(targetEPoints, ic, Kokkos::ALL(), Kokkos::ALL())); + cellBasis->getValues(Kokkos::subview(nonOrientedBasisAtBasisEPoints,ic,Kokkos::ALL(),Kokkos::ALL()), Kokkos::subview(basisEPoints, ic, Kokkos::ALL(), Kokkos::ALL())); } - OrientationTools::modifyBasisByOrientation(Kokkos::subview(basisAtCubPoints, Kokkos::ALL(), Kokkos::ALL(), - Kokkos::ALL(),0), nonOrientedBasisAtCubPoints, orts, cellBasis); - OrientationTools::modifyBasisByOrientation(Kokkos::subview(basisAtTargetCubPoints, Kokkos::ALL(), - Kokkos::ALL(), Kokkos::ALL(),0), nonOrientedBasisAtTargetCubPoints, orts, cellBasis); - + OrientationTools::modifyBasisByOrientation(Kokkos::subview(basisAtBasisEPoints, Kokkos::ALL(), Kokkos::ALL(), + Kokkos::ALL(),0), nonOrientedBasisAtBasisEPoints, orts, cellBasis); + OrientationTools::modifyBasisByOrientation(Kokkos::subview(basisAtTargetEPoints, Kokkos::ALL(), + Kokkos::ALL(), Kokkos::ALL(),0), nonOrientedBasisAtTargetEPoints, orts, cellBasis); } else { - ScalarViewType nonOrientedBasisAtCubPoints("nonOrientedBasisAtCubPoints",numCells,basisCardinality, numTotalCubPoints,fieldDim); - ScalarViewType nonOrientedBasisAtTargetCubPoints("nonOrientedBasisAtTargetCubPoints",numCells,basisCardinality, numTotalEvaluationPoints,fieldDim); + ScalarViewType nonOrientedBasisAtBasisEPoints("nonOrientedBasisAtBasisEPoints",numCells,basisCardinality, numTotalBasisEPoints,fieldDim); + ScalarViewType nonOrientedBasisAtTargetEPoints("nonOrientedBasisAtTargetEPoints",numCells,basisCardinality, numTotalTargetEPoints,fieldDim); for(ordinal_type ic=0; icgetValues(Kokkos::subview(nonOrientedBasisAtTargetCubPoints,ic,Kokkos::ALL(),Kokkos::ALL(),Kokkos::ALL()), Kokkos::subview(evaluationPoints, ic, Kokkos::ALL(), Kokkos::ALL())); - cellBasis->getValues(Kokkos::subview(nonOrientedBasisAtCubPoints,ic,Kokkos::ALL(),Kokkos::ALL(),Kokkos::ALL()), Kokkos::subview(cubPoints, ic, Kokkos::ALL(), Kokkos::ALL())); + cellBasis->getValues(Kokkos::subview(nonOrientedBasisAtTargetEPoints,ic,Kokkos::ALL(),Kokkos::ALL(),Kokkos::ALL()), Kokkos::subview(targetEPoints, ic, Kokkos::ALL(), Kokkos::ALL())); + cellBasis->getValues(Kokkos::subview(nonOrientedBasisAtBasisEPoints,ic,Kokkos::ALL(),Kokkos::ALL(),Kokkos::ALL()), Kokkos::subview(basisEPoints, ic, Kokkos::ALL(), Kokkos::ALL())); } - OrientationTools::modifyBasisByOrientation(basisAtCubPoints, nonOrientedBasisAtCubPoints, orts, cellBasis); - OrientationTools::modifyBasisByOrientation(basisAtTargetCubPoints, nonOrientedBasisAtTargetCubPoints, orts, cellBasis); + OrientationTools::modifyBasisByOrientation(basisAtBasisEPoints, nonOrientedBasisAtBasisEPoints, orts, cellBasis); + OrientationTools::modifyBasisByOrientation(basisAtTargetEPoints, nonOrientedBasisAtTargetEPoints, orts, cellBasis); } } - for(ordinal_type iv=0; ivgetDofOrdinal(0, iv, 0); - computedDofs(computedDofsCount++) = idof; - for(ordinal_type ic=0; icgetDofCount(edgeDim,ie); + for(ordinal_type i=0; igetDofCount(faceDim,iface); + for(ordinal_type i=0; igetFunctionSpace() == FUNCTION_SPACE_HGRAD); + bool isHCurlBasis = (cellBasis->getFunctionSpace() == FUNCTION_SPACE_HCURL); + bool isHDivBasis = (cellBasis->getFunctionSpace() == FUNCTION_SPACE_HDIV); + ordinal_type faceDofDim = isHCurlBasis ? 2 : 1; + ScalarViewType edgeCoeff("edgeCoeff", fieldDim); - ordinal_type faceDofDim = isHCurlBAsis ? 2 : 1; - ScalarViewType edgeCoeff("edgeCoeff", fieldDim); + const Kokkos::RangePolicy policy(0, numCells); + + if(isHGradBasis) { + + typedef ComputeBasisCoeffsOnVertices_L2 functorType; + Kokkos::parallel_for(policy, functorType(basisCoeffs, tagToOrdinal, targetEPointsRange, + targetAtTargetEPoints, basisAtTargetEPoints, numVertices)); + } + for(ordinal_type ie=0; ie::getReferenceEdgeTangent(refEdgeTan,ie, cellTopo); - Kokkos::deep_copy(edgeCoeff,refEdgeTan); + if(isHCurlBasis) { + CellTools::getReferenceEdgeTangent(edgeVecHost,ie, cellTopo); + } else if(isHDivBasis) { + CellTools::getReferenceSideNormal(edgeVecHost, ie, cellTopo); } else { - CellTools::getReferenceSideNormal(refEdgeNormal, ie, cellTopo); - Kokkos::deep_copy(edgeCoeff,refEdgeNormal); + edgeVecHost(0) = 1; } + Kokkos::deep_copy(edgeVec,edgeVecHost); ordinal_type edgeCardinality = cellBasis->getDofCount(edgeDim,ie); - ordinal_type numCubPoints = projStruct->getNumBasisEvalPoints(edgeDim, ie); - ordinal_type numTargetCubPoints = projStruct->getNumTargetEvalPoints(edgeDim, ie); + ordinal_type numBasisEPoints = range_size(basisEPointsRange(edgeDim, ie)); + ordinal_type numTargetEPoints = range_size(targetEPointsRange(edgeDim, ie)); - ScalarViewType edgeBasisAtCubPoints("tanBasisAtElemCubPoints",numCells,edgeCardinality, numCubPoints); - ScalarViewType edgeTargetAtTargetCubPoints("tanBasisAtTargetCubPoints",numCells, numTargetCubPoints); - ScalarViewType weightedBasisAtElemCubPoints("weightedTanBasisAtElemCubPoints",numCells,edgeCardinality, numCubPoints); - ScalarViewType weightedBasisAtTargetCubPoints("weightedTanBasisAtTargetCubPoints",numCells,edgeCardinality, numTargetCubPoints); - ScalarViewType mComputedProjection("mComputedProjection", numCells, numCubPoints); + ScalarViewType basisDofAtBasisEPoints("BasisDofAtBasisEPoints",numCells,edgeCardinality, numBasisEPoints); + ScalarViewType tragetDofAtTargetEPoints("TargetDofAtTargetEPoints",numCells, numTargetEPoints); + ScalarViewType weightedBasisAtBasisEPoints("weightedTanBasisAtBasisEPoints",numCells,edgeCardinality, numBasisEPoints); + ScalarViewType weightedBasisAtTargetEPoints("weightedTanBasisAtTargetEPoints",numCells,edgeCardinality, numTargetEPoints); + ScalarViewType negPartialProj("negPartialProj", numCells, numBasisEPoints); - ScalarViewType targetEvalWeights = projStruct->getTargetEvalWeights(edgeDim, ie); - ScalarViewType basisEvalWeights = projStruct->getBasisEvalWeights(edgeDim, ie); + auto targetEWeights = Kokkos::create_mirror_view_and_copy(typename SpT::memory_space(),projStruct->getTargetEvalWeights(edgeDim,ie)); + auto basisEWeights = Kokkos::create_mirror_view_and_copy(typename SpT::memory_space(),projStruct->getBasisEvalWeights(edgeDim,ie)); //Note: we are not considering the jacobian of the orientation map since it is simply a scalar term for the integrals and it does not affect the projection - ordinal_type offsetBasis = projStruct->getBasisPointsRange(edgeDim, ie).first; - ordinal_type offsetTarget = projStruct->getTargetPointsRange(edgeDim, ie).first; - for(ordinal_type j=0; j getDofOrdinal(edgeDim, ie, j); - for(ordinal_type ic=0; ic functorTypeEdge; - ScalarViewType edgeMassMat_("edgeMassMat_", numCells, edgeCardinality, edgeCardinality), - edgeRhsMat_("rhsMat_", numCells, edgeCardinality); + Kokkos::parallel_for(policy, functorTypeEdge(basisCoeffs, negPartialProj, basisDofAtBasisEPoints, + basisAtBasisEPoints, basisEWeights, weightedBasisAtBasisEPoints, targetEWeights, + basisAtTargetEPoints, weightedBasisAtTargetEPoints, computedDofs, tagToOrdinal, + targetAtTargetEPoints,tragetDofAtTargetEPoints, refEdgesVec, fieldDim, + edgeCardinality, offsetBasis, offsetTarget, numVertexDofs, edgeDim, ie)); - ScalarViewType cubWeights_("cubWeights_", numCells, 1, basisEvalWeights.extent(0)), targetEvalWeights_("targetEvalWeights", numCells, 1, targetEvalWeights.extent(0)); - RealSpaceTools::clone(cubWeights_, basisEvalWeights); - RealSpaceTools::clone(targetEvalWeights_, targetEvalWeights); - FunctionSpaceTools::integrate(edgeMassMat_, edgeBasisAtCubPoints, weightedBasisAtElemCubPoints); - FunctionSpaceTools::integrate(edgeRhsMat_, edgeTargetAtTargetCubPoints, weightedBasisAtTargetCubPoints); - FunctionSpaceTools::integrate(edgeRhsMat_, mComputedProjection, weightedBasisAtElemCubPoints,true); + ScalarViewType edgeMassMat_("edgeMassMat_", numCells, edgeCardinality, edgeCardinality), + edgeRhsMat_("rhsMat_", numCells, edgeCardinality); + FunctionSpaceTools::integrate(edgeMassMat_, basisDofAtBasisEPoints, weightedBasisAtBasisEPoints); + FunctionSpaceTools::integrate(edgeRhsMat_, tragetDofAtTargetEPoints, weightedBasisAtTargetEPoints); + FunctionSpaceTools::integrate(edgeRhsMat_, negPartialProj, weightedBasisAtBasisEPoints,true); - Kokkos::View edgeMassMat("edgeMassMat", edgeCardinality,edgeCardinality); - Kokkos::View edgeRhsMat("edgeRhsMat",edgeCardinality, 1); - Teuchos::LAPACK lapack; - ordinal_type info = 0; - for(ordinal_type ic=0; ic WorkArrayViewType; + ScalarViewType t_("t",numCells, edgeCardinality); + WorkArrayViewType w_("w",numCells, edgeCardinality); - lapack.POSV('U', edgeCardinality, 1, - edgeMassMat.data(), - edgeMassMat.stride_1(), - edgeRhsMat.data(), - edgeRhsMat.stride_1(), - &info); - - if (info) { - std::stringstream ss; - ss << ">>> ERROR (Intrepid::ProjectionTools::getBasisCoeffs): " - << "LAPACK return with error code: " - << info; - INTREPID2_TEST_FOR_EXCEPTION( true, std::runtime_error, ss.str().c_str() ); - } + auto edgeDof = Kokkos::subview(tagToOrdinal, edgeDim, ie, Kokkos::ALL()); - for(ordinal_type i=0; igetDofOrdinal(edgeDim, ie, i); - basisCoeffs(ic,edge_dof) = edgeRhsMat(i,0); - } - } - for(ordinal_type i=0; igetDofOrdinal(edgeDim, ie, i); + ElemSystem edgeSystem("edgeSystem", false); + edgeSystem.solve(basisCoeffs, edgeMassMat_, edgeRhsMat_, t_, w_, edgeDof, edgeCardinality); } - ScalarViewType ortJacobian("ortJacobian", faceDim, faceDim); + ScalarViewType ortJacobian_("ortJacobian", numCells, faceDim, faceDim); - ScalarViewType faceCoeff("faceCoeff", fieldDim, faceDofDim); + ScalarViewType faceCoeff("faceCoeff", numCells, fieldDim, faceDofDim); for(ordinal_type iface=0; ifacegetTopologyKey(faceDim,iface); + const auto topoKey = refTopologyKey(faceDim,iface); ordinal_type faceCardinality = cellBasis->getDofCount(faceDim,iface); - ordinal_type numTargetCubPoints = projStruct->getNumTargetEvalPoints(faceDim, iface); - ordinal_type numCubPoints = projStruct->getNumBasisEvalPoints(faceDim, iface); - - if(fieldDim == 1) - faceCoeff(0,0) = 1; - else if(isHCurlBAsis) { - CellTools::getReferenceFaceTangents(refFaceTanU, refFaceTanV,iface, cellTopo); - } else { - CellTools::getReferenceFaceNormal(refFaceNormal, iface, cellTopo); - for(ordinal_type d=0; d ::getReferenceFaceTangents(refFaceTanUHost, refFaceTanVHost, iface, cellTopo); + Kokkos::deep_copy(refFaceTanU, refFaceTanUHost); + Kokkos::deep_copy(refFaceTanV, refFaceTanVHost); + } else if(isHDivBasis) { + auto faceNormal = Kokkos::subview(refFacesNormal,iface,Kokkos::ALL()); + auto faceNormalHost = Kokkos::create_mirror_view(faceNormal); + CellTools::getReferenceFaceNormal(faceNormalHost, iface, cellTopo); + Kokkos::deep_copy(faceNormal, faceNormalHost); } - ScalarViewType faceBasisDofAtCubPoints("normaBasisAtCubPoints",numCells,faceCardinality, numCubPoints,faceDofDim); - ScalarViewType wBasisDofAtCubPoints("weightedNormalBasisAtCubPoints",numCells,faceCardinality, numCubPoints,faceDofDim); + ScalarViewType faceBasisDofAtBasisEPoints("normaBasisAtBasisEPoints",numCells,faceCardinality, numBasisEPoints,faceDofDim); + ScalarViewType wBasisDofAtBasisEPoints("weightedNormalBasisAtBasisEPoints",numCells,faceCardinality, numBasisEPoints,faceDofDim); - ScalarViewType faceBasisAtTargetCubPoints("normalBasisAtTargetCubPoints",numCells,faceCardinality, numTargetCubPoints,faceDofDim); - ScalarViewType wBasisBasisAtTargetCubPoints("weightedNormalBasisAtTargetCubPoints",numCells,faceCardinality, numTargetCubPoints,faceDofDim); + ScalarViewType faceBasisAtTargetEPoints("normalBasisAtTargetEPoints",numCells,faceCardinality, numTargetEPoints,faceDofDim); + ScalarViewType wBasisDofAtTargetEPoints("weightedNormalBasisAtTargetEPoints",numCells,faceCardinality, numTargetEPoints,faceDofDim); - ScalarViewType targetAtTargetCubPoints("targetAtTargetCubPoints",numCells, numTargetCubPoints,faceDofDim); - ScalarViewType mComputedProjection("mNormalComputedProjection", numCells,numCubPoints,faceDofDim); + ScalarViewType targetDofAtTargetEPoints("targetDofAtTargetEPoints",numCells, numTargetEPoints,faceDofDim); + ScalarViewType negPartialProj("mNormalComputedProjection", numCells,numBasisEPoints,faceDofDim); - ordinal_type offsetBasis = projStruct->getBasisPointsRange(faceDim, iface).first; - ordinal_type offsetTarget = projStruct->getTargetPointsRange(faceDim, iface).first; - ScalarViewType targetCubWeights = projStruct->getTargetEvalWeights(faceDim, iface); - ScalarViewType CubWeights = projStruct->getBasisEvalWeights(faceDim, iface); + ordinal_type offsetBasis = basisEPointsRange(faceDim, iface).first; + ordinal_type offsetTarget = targetEPointsRange(faceDim, iface).first; + auto targetEWeights = Kokkos::create_mirror_view_and_copy(typename SpT::memory_space(),projStruct->getTargetEvalWeights(faceDim,iface)); + auto basisEWeights = Kokkos::create_mirror_view_and_copy(typename SpT::memory_space(),projStruct->getBasisEvalWeights(faceDim,iface)); - //Note: we are not considering the jacobian of the orientation map since it is simply a scalar term for the integrals and it does not affect the projection - for(ordinal_type ic=0; icgetDofOrdinal(faceDim, iface, j); - for(ordinal_type itan=0; itan functorTypeFace; + + Kokkos::parallel_for(policy, functorTypeFace(basisCoeffs, negPartialProj,faceBasisDofAtBasisEPoints, + basisAtBasisEPoints, basisEWeights, wBasisDofAtBasisEPoints, targetEWeights, + basisAtTargetEPoints, wBasisDofAtTargetEPoints, computedDofs, tagToOrdinal, + orts, targetAtTargetEPoints,targetDofAtTargetEPoints, ortJacobian_, faceCoeff, + refFacesTangents, refFacesNormal, fieldDim, faceCardinality, offsetBasis, + offsetTarget, numVertexDofs+numEdgeDofs, numFaces, faceDim,faceDofDim, + dim, iface, topoKey, isHCurlBasis, isHDivBasis)); + typedef Kokkos::DynRankView WorkArrayViewType; ScalarViewType faceMassMat_("faceMassMat_", numCells, faceCardinality, faceCardinality), faceRhsMat_("rhsMat_", numCells, faceCardinality); - FunctionSpaceTools::integrate(faceMassMat_, faceBasisDofAtCubPoints, wBasisDofAtCubPoints); - FunctionSpaceTools::integrate(faceRhsMat_, targetAtTargetCubPoints, wBasisBasisAtTargetCubPoints); - FunctionSpaceTools::integrate(faceRhsMat_, mComputedProjection, wBasisDofAtCubPoints,true); + FunctionSpaceTools::integrate(faceMassMat_, faceBasisDofAtBasisEPoints, wBasisDofAtBasisEPoints); + FunctionSpaceTools::integrate(faceRhsMat_, targetDofAtTargetEPoints, wBasisDofAtTargetEPoints); + FunctionSpaceTools::integrate(faceRhsMat_, negPartialProj, wBasisDofAtBasisEPoints,true); - Kokkos::View faceMassMat("faceMassMat", faceCardinality,faceCardinality); - Kokkos::View faceRhsMat("faceRhsMat",faceCardinality, 1); + ScalarViewType t_("t",numCells, faceCardinality); + WorkArrayViewType w_("w",numCells,faceCardinality); - Teuchos::LAPACK lapack; - ordinal_type info = 0; - for(ordinal_type ic=0; ic>> ERROR (Intrepid::ProjectionTools::getBasisCoeffs): " - << "LAPACK return with error code: " - << info; - INTREPID2_TEST_FOR_EXCEPTION( true, std::runtime_error, ss.str().c_str() ); - } - - for(ordinal_type i=0; igetDofOrdinal(faceDim, iface, i); - basisCoeffs(ic,face_dof) = faceRhsMat(i,0); - } - } + auto faceDof = Kokkos::subview(tagToOrdinal, faceDim, iface, Kokkos::ALL()); - for(ordinal_type i=0; igetDofOrdinal(faceDim, iface, i); + ElemSystem faceSystem("faceSystem", false); + faceSystem.solve(basisCoeffs, faceMassMat_, faceRhsMat_, t_, w_, faceDof, faceCardinality); } ordinal_type numElemDofs = cellBasis->getDofCount(dim,0); + if(numElemDofs>0) { - range_type cellPointsRange = projStruct->getTargetPointsRange(dim, 0); + auto cellDofs = Kokkos::subview(tagToOrdinal, dim, 0, Kokkos::ALL()); - ordinal_type numTargetCubPoints = projStruct->getNumTargetEvalPoints(dim,0); - ordinal_type numCubPoints = projStruct->getNumBasisEvalPoints(dim,0); + range_type cellPointsRange = targetEPointsRange(dim, 0); - ScalarViewType internalBasisAtCubPoints("internalBasisAtCubPoints",numCells,numElemDofs, numCubPoints, fieldDim); - ScalarViewType mComputedProjection("mComputedProjection", numCells, numCubPoints, fieldDim); + ordinal_type numTargetEPoints = range_size(targetEPointsRange(dim,0)); + ordinal_type numBasisEPoints = range_size(basisEPointsRange(dim,0)); - ScalarViewType targetCubWeights = projStruct->getTargetEvalWeights(dim, 0); - ScalarViewType cubWeights = projStruct->getBasisEvalWeights(dim, 0); - ordinal_type offsetBasis = projStruct->getBasisPointsRange(dim, 0).first; - ordinal_type offsetTarget = projStruct->getTargetPointsRange(dim, 0).first; + ScalarViewType internalBasisAtBasisEPoints("internalBasisAtBasisEPoints",numCells,numElemDofs, numBasisEPoints, fieldDim); + ScalarViewType negPartialProj("negPartialProj", numCells, numBasisEPoints, fieldDim); + auto targetEWeights = Kokkos::create_mirror_view_and_copy(typename SpT::memory_space(),projStruct->getTargetEvalWeights(dim,0)); + auto basisEWeights = Kokkos::create_mirror_view_and_copy(typename SpT::memory_space(),projStruct->getBasisEvalWeights(dim,0)); + ordinal_type offsetBasis = basisEPointsRange(dim, 0).first; + ordinal_type offsetTarget = targetEPointsRange(dim, 0).first; - ScalarViewType wBasisAtCubPoints("weightedBasisAtCubPoints",numCells,numElemDofs, numCubPoints,fieldDim); - ScalarViewType wBasisBasisAtTargetCubPoints("weightedBasisAtTargetCubPoints",numCells,numElemDofs, numTargetCubPoints,fieldDim); - for(ordinal_type j=0; j getDofOrdinal(dim, 0, j); - for(ordinal_type ic=0; ic functorType; + Kokkos::parallel_for(policy, functorType( basisCoeffs, negPartialProj, internalBasisAtBasisEPoints, + basisAtBasisEPoints, basisEWeights, wBasisAtBasisEPoints, targetEWeights, basisAtTargetEPoints, wBasisDofAtTargetEPoints, + computedDofs, cellDofs, fieldDim, numElemDofs, offsetBasis, offsetTarget, numVertexDofs+numEdgeDofs+numFaceDofs)); + typedef Kokkos::DynRankView WorkArrayViewType; ScalarViewType cellMassMat_("cellMassMat_", numCells, numElemDofs, numElemDofs), cellRhsMat_("rhsMat_", numCells, numElemDofs); - FunctionSpaceTools::integrate(cellMassMat_, internalBasisAtCubPoints, wBasisAtCubPoints); + FunctionSpaceTools::integrate(cellMassMat_, internalBasisAtBasisEPoints, wBasisAtBasisEPoints); if(fieldDim==1) - FunctionSpaceTools::integrate(cellRhsMat_, Kokkos::subview(targetAtEvalPoints,Kokkos::ALL(),cellPointsRange,Kokkos::ALL()), - Kokkos::subview(wBasisBasisAtTargetCubPoints,Kokkos::ALL(),Kokkos::ALL(),Kokkos::ALL(),0)); + FunctionSpaceTools::integrate(cellRhsMat_, Kokkos::subview(targetAtTargetEPoints,Kokkos::ALL(),cellPointsRange,Kokkos::ALL()), + Kokkos::subview(wBasisDofAtTargetEPoints,Kokkos::ALL(),Kokkos::ALL(),Kokkos::ALL(),0)); else - FunctionSpaceTools::integrate(cellRhsMat_, Kokkos::subview(targetAtEvalPoints,Kokkos::ALL(),cellPointsRange,Kokkos::ALL()), wBasisBasisAtTargetCubPoints); - FunctionSpaceTools::integrate(cellRhsMat_, mComputedProjection, wBasisAtCubPoints, true); - - Kokkos::View cellMassMat("cellMassMat", numElemDofs,numElemDofs); - Kokkos::View cellRhsMat("cellRhsMat",numElemDofs, 1); - - Teuchos::LAPACK lapack; - ordinal_type info = 0; - for(ordinal_type ic=0; ic::integrate(cellRhsMat_, Kokkos::subview(targetAtTargetEPoints,Kokkos::ALL(),cellPointsRange,Kokkos::ALL()), wBasisDofAtTargetEPoints); + FunctionSpaceTools::integrate(cellRhsMat_, negPartialProj, wBasisAtBasisEPoints, true); - lapack.POSV('U', numElemDofs, 1, - cellMassMat.data(), - cellMassMat.stride_1(), - cellRhsMat.data(), - cellRhsMat.stride_1(), - &info); - - for(ordinal_type i=0; igetDofOrdinal(dim, 0, i); - basisCoeffs(ic,idof) = cellRhsMat(i,0); - } - - if (info) { - std::stringstream ss; - ss << ">>> ERROR (Intrepid::ProjectionTools::getBasisCoeffs): " - << "LAPACK return with error code: " - << info; - INTREPID2_TEST_FOR_EXCEPTION( true, std::runtime_error, ss.str().c_str() ); - } - } + ScalarViewType t_("t",numCells, numElemDofs); + WorkArrayViewType w_("w",numCells,numElemDofs); + ElemSystem cellSystem("cellSystem", true); + cellSystem.solve(basisCoeffs, cellMassMat_, cellRhsMat_, t_, w_, cellDofs, numElemDofs); } } } diff --git a/packages/intrepid2/unit-test/Discretization/Basis/BasisEquivalenceTests.cpp b/packages/intrepid2/unit-test/Discretization/Basis/BasisEquivalenceTests.cpp index 5d1959fe702a..342c676df5a0 100644 --- a/packages/intrepid2/unit-test/Discretization/Basis/BasisEquivalenceTests.cpp +++ b/packages/intrepid2/unit-test/Discretization/Basis/BasisEquivalenceTests.cpp @@ -108,7 +108,7 @@ namespace // since A is SPD, col/row major has no effect on the data // but B's data may be transposed relative to what LAPACK expects (column-major order) // so we allocate our own storage for B to make sure of the ordering - double B[N*M]; + std::vector B(N*M); for (int j=0; jgetCubature(refPoints, weights); - + using basisType = Basis; + using CG_NBasis = NodalBasisFamily; + using CG_HBasis = HierarchicalBasisFamily; + //using CG_DNBasis = DerivedNodalBasisFamily; *outStream @@ -386,180 +390,188 @@ int ConvergenceHex(const bool verbose) { Kokkos::DynRankView elemOrts("elemOrts", numElems); ots::getOrientation(elemOrts, elemNodes, hexa); - Basis_HGRAD_HEX_Cn_FEM basis(order); - ordinal_type basisCardinality = basis.getCardinality(); - - //Compute physical Dof Coordinates and Reference coordinates - DynRankView ConstructWithLabel(physRefCoords, numElems, numRefCoords, dim); - { - Basis_HGRAD_HEX_C1_FEM hexaLinearBasis; //used for computing physical coordinates - DynRankView ConstructWithLabel(hexaLinearBasisValuesAtRefCoords, hexa.getNodeCount(), numRefCoords); - hexaLinearBasis.getValues(hexaLinearBasisValuesAtRefCoords, refPoints); - for(ordinal_type i=0; i basis_set; + basis_set.push_back(new typename CG_NBasis::HGRAD_HEX(order)); + basis_set.push_back(new typename CG_HBasis::HGRAD_HEX(order)); + + for (auto basisPtr:basis_set) { + auto& basis = *basisPtr; + *outStream << " " << basis.getName() << std::endl; - Fun fun; - GradFun gradFun; - DynRankView ConstructWithLabel(funAtRefCoords, numElems, numRefCoords); - DynRankView ConstructWithLabel(funGradAtPhysRefCoords, numElems, numRefCoords, dim); - for(ordinal_type i=0; i hexaLinearBasis; //used for computing physical coordinates + DynRankView ConstructWithLabel(hexaLinearBasisValuesAtRefCoords, hexa.getNodeCount(), numRefCoords); + hexaLinearBasis.getValues(hexaLinearBasisValuesAtRefCoords, refPoints); + for(ordinal_type i=0; i projStruct; - projStruct.createHGradProjectionStruct(&basis, targetCubDegree, targetDerivCubDegree); + // compute projection-based interpolation of fun into HGRAD + DynRankView ConstructWithLabel(basisCoeffsHGrad, numElems, basisCardinality); + { + ordinal_type targetCubDegree(basis.getDegree()),targetDerivCubDegree(basis.getDegree()); - ordinal_type numPoints = projStruct.getNumTargetEvalPoints(), numGradPoints = projStruct.getNumTargetDerivEvalPoints(); + Experimental::ProjectionStruct projStruct; + projStruct.createHGradProjectionStruct(&basis, targetCubDegree, targetDerivCubDegree); - DynRankView ConstructWithLabel(evaluationPoints, numElems, numPoints, dim); - DynRankView ConstructWithLabel(evaluationGradPoints, numElems, numGradPoints, dim); + ordinal_type numPoints = projStruct.getNumTargetEvalPoints(), numGradPoints = projStruct.getNumTargetDerivEvalPoints(); + DynRankView ConstructWithLabel(evaluationPoints, numElems, numPoints, dim); + DynRankView ConstructWithLabel(evaluationGradPoints, numElems, numGradPoints, dim); - pts::getHGradEvaluationPoints(evaluationPoints, - evaluationGradPoints, - elemOrts, - &basis, - &projStruct); + pts::getHGradEvaluationPoints(evaluationPoints, + evaluationGradPoints, + elemOrts, + &basis, + &projStruct); - DynRankView ConstructWithLabel(targetAtEvalPoints, numElems, numPoints); - DynRankView ConstructWithLabel(targetGradAtEvalPoints, numElems, numGradPoints, dim); - DynRankView ConstructWithLabel(physEvalPoints, numElems, numPoints, dim); - DynRankView ConstructWithLabel(physEvalGradPoints, numElems, numGradPoints, dim); - { - Basis_HGRAD_HEX_C1_FEM hexLinearBasis; //used for computing physical coordinates - DynRankView ConstructWithLabel(hexLinearBasisValuesAtEvalPoints, hexa.getNodeCount(), numPoints); - DynRankView ConstructWithLabel(hexLinearBasisValuesAtEvalGradPoints, hexa.getNodeCount(), numGradPoints); - - for(ordinal_type i=0; i0) - hexLinearBasis.getValues(hexLinearBasisValuesAtEvalGradPoints, Kokkos::subview(evaluationGradPoints,i,Kokkos::ALL(),Kokkos::ALL())); - for(ordinal_type d=0; d hexLinearBasis; //used for computing physical coordinates + DynRankView ConstructWithLabel(hexLinearBasisValuesAtEvalPoints, hexa.getNodeCount(), numPoints); + DynRankView ConstructWithLabel(hexLinearBasisValuesAtEvalGradPoints, hexa.getNodeCount(), numGradPoints); + + for(ordinal_type i=0; i0) + hexLinearBasis.getValues(hexLinearBasisValuesAtEvalGradPoints, Kokkos::subview(evaluationGradPoints,i,Kokkos::ALL(),Kokkos::ALL())); + for(ordinal_type d=0; d0) - ct::setJacobian(jacobian, evaluationGradPoints, physVertexes, hexa); + //transform the target function and its derivative to the reference element (inverse of pullback operator) + DynRankView ConstructWithLabel(jacobian, numElems, numGradPoints, dim, dim); + if(numGradPoints>0) + ct::setJacobian(jacobian, evaluationGradPoints, physVertexes, hexa); + + GradFun gradFun; + Kokkos::deep_copy(targetGradAtEvalPoints,0.); + for(int ic=0; ic relTol){ - errorFlag++; - *outStream << std::setw(70) << "^^^^----FAILURE!" << "\n"; - *outStream << "For N = " << NX << ", computed error (" << hgradNorm[iter] << ") is different than expected one (" << expected_error << ")"; - *outStream << std::endl; + hgradNorm[iter] = std::sqrt(norm2); + auto expected_error = hgrad_errors[iter]; + if(std::abs(hgradNorm[iter]-expected_error)/expected_error > relTol){ + errorFlag++; + *outStream << std::setw(70) << "^^^^----FAILURE!" << "\n"; + *outStream << "For N = " << NX << ", computed error (" << hgradNorm[iter] << ") is different than expected one (" << expected_error << ")"; + *outStream << std::endl; + } + delete basisPtr; } *outStream << "HGRAD Error: " << hgradNorm[iter] < elemOrts("elemOrts", numElems); ots::getOrientation(elemOrts, elemNodes, hexa); - Basis_HCURL_HEX_In_FEM basis(order); - ordinal_type basisCardinality = basis.getCardinality(); - - //Compute physical Dof Coordinates and Reference coordinates - DynRankView ConstructWithLabel(physRefCoords, numElems, numRefCoords, dim); - { - Basis_HGRAD_HEX_C1_FEM hexaLinearBasis; //used for computing physical coordinates - DynRankView ConstructWithLabel(hexaLinearBasisValuesAtRefCoords, hexa.getNodeCount(), numRefCoords); - hexaLinearBasis.getValues(hexaLinearBasisValuesAtRefCoords, refPoints); - for(ordinal_type i=0; i projStruct; - projStruct.createHCurlProjectionStruct(&basis, targetCubDegree, targetDerivCubDegree); - - ordinal_type numPoints = projStruct.getNumTargetEvalPoints(), numCurlPoints = projStruct.getNumTargetDerivEvalPoints(); - DynRankView ConstructWithLabel(evaluationPoints, numElems, numPoints, dim); - DynRankView ConstructWithLabel(evaluationCurlPoints, numElems, numCurlPoints, dim); - pts::getHCurlEvaluationPoints(evaluationPoints, - evaluationCurlPoints, - elemOrts, - &basis, - &projStruct); + std::vector basis_set; + basis_set.push_back(new typename CG_NBasis::HCURL_HEX(order)); + basis_set.push_back(new typename CG_HBasis::HCURL_HEX(order)); + for (auto basisPtr:basis_set) { + auto& basis = *basisPtr; + *outStream << " " << basis.getName() << std::endl; - DynRankView ConstructWithLabel(targetAtEvalPoints, numElems, numPoints, dim); - DynRankView ConstructWithLabel(targetCurlAtEvalPoints, numElems, numCurlPoints, dim); + ordinal_type basisCardinality = basis.getCardinality(); - - DynRankView ConstructWithLabel(physEvalPoints, numElems, numPoints, dim); - DynRankView ConstructWithLabel(physEvalCurlPoints, numElems, numCurlPoints, dim); + //Compute physical Dof Coordinates and Reference coordinates + DynRankView ConstructWithLabel(physRefCoords, numElems, numRefCoords, dim); { - Basis_HGRAD_HEX_C1_FEM hexLinearBasis; //used for computing physical coordinates - DynRankView ConstructWithLabel(hexLinearBasisValuesAtEvalPoints, hexa.getNodeCount(), numPoints); - DynRankView ConstructWithLabel(hexLinearBasisValuesAtEvalCurlPoints, hexa.getNodeCount(), numCurlPoints); + Basis_HGRAD_HEX_C1_FEM hexaLinearBasis; //used for computing physical coordinates + DynRankView ConstructWithLabel(hexaLinearBasisValuesAtRefCoords, hexa.getNodeCount(), numRefCoords); + hexaLinearBasis.getValues(hexaLinearBasisValuesAtRefCoords, refPoints); + for(ordinal_type i=0; i projStruct; + projStruct.createHCurlProjectionStruct(&basis, targetCubDegree, targetDerivCubDegree); + + ordinal_type numPoints = projStruct.getNumTargetEvalPoints(), numCurlPoints = projStruct.getNumTargetDerivEvalPoints(); + DynRankView ConstructWithLabel(evaluationPoints, numElems, numPoints, dim); + DynRankView ConstructWithLabel(evaluationCurlPoints, numElems, numCurlPoints, dim); + pts::getHCurlEvaluationPoints(evaluationPoints, + evaluationCurlPoints, + elemOrts, + &basis, + &projStruct); + + + DynRankView ConstructWithLabel(targetAtEvalPoints, numElems, numPoints, dim); + DynRankView ConstructWithLabel(targetCurlAtEvalPoints, numElems, numCurlPoints, dim); + + + DynRankView ConstructWithLabel(physEvalPoints, numElems, numPoints, dim); + DynRankView ConstructWithLabel(physEvalCurlPoints, numElems, numCurlPoints, dim); + { + Basis_HGRAD_HEX_C1_FEM hexLinearBasis; //used for computing physical coordinates + DynRankView ConstructWithLabel(hexLinearBasisValuesAtEvalPoints, hexa.getNodeCount(), numPoints); + DynRankView ConstructWithLabel(hexLinearBasisValuesAtEvalCurlPoints, hexa.getNodeCount(), numCurlPoints); + + for(ordinal_type i=0; i relTol){ - errorFlag++; - *outStream << std::setw(70) << "^^^^----FAILURE!" << "\n"; - *outStream << "For N = " << NX << ", computed error (" << hcurlNorm[iter] << ") is different than expected one (" << expected_error << ")"; - *outStream << std::endl; + } + hcurlNorm[iter] = std::sqrt(norm2); + auto expected_error = hcurl_errors[iter]; + if(std::abs(hcurlNorm[iter]-expected_error)/expected_error > relTol){ + errorFlag++; + *outStream << std::setw(70) << "^^^^----FAILURE!" << "\n"; + *outStream << "For N = " << NX << ", computed error (" << hcurlNorm[iter] << ") is different than expected one (" << expected_error << ")"; + *outStream << std::endl; + } + delete basisPtr; } *outStream << "HCURL Error: " << hcurlNorm[iter] < elemOrts("elemOrts", numElems); ots::getOrientation(elemOrts, elemNodes, hexa); - Basis_HDIV_HEX_In_FEM basis(order); - ordinal_type basisCardinality = basis.getCardinality(); - - //Compute physical Dof Coordinates and Reference coordinates - DynRankView ConstructWithLabel(physRefCoords, numElems, numRefCoords, dim); - DynRankView ConstructWithLabel(physDofCoords, numElems, basisCardinality, dim); - { - Basis_HGRAD_HEX_C1_FEM hexaLinearBasis; //used for computing physical coordinates - DynRankView ConstructWithLabel(hexaLinearBasisValuesAtRefCoords, hexa.getNodeCount(), numRefCoords); - hexaLinearBasis.getValues(hexaLinearBasisValuesAtRefCoords, refPoints); - for(ordinal_type i=0; i basis_set; + basis_set.push_back(new typename CG_NBasis::HDIV_HEX(order)); + basis_set.push_back(new typename CG_HBasis::HDIV_HEX(order)); - FunDiv fun; - DivFunDiv funDiv; - DynRankView ConstructWithLabel(funAtRefCoords, numElems, numRefCoords, dim); - DynRankView ConstructWithLabel(funDivAtPhysRefCoords, numElems, numRefCoords); - for(ordinal_type i=0; i projStruct; - projStruct.createHDivProjectionStruct(&basis, targetCubDegree, targetDerivCubDegree); - - ordinal_type numPoints = projStruct.getNumTargetEvalPoints(), numDivPoints = projStruct.getNumTargetDerivEvalPoints(); + for (auto basisPtr:basis_set) { + auto& basis = *basisPtr; + *outStream << " " << basis.getName() << std::endl; - DynRankView ConstructWithLabel(evaluationPoints, numElems, numPoints, dim); - DynRankView ConstructWithLabel(evaluationDivPoints, numElems, numDivPoints, dim); + ordinal_type basisCardinality = basis.getCardinality(); - pts::getHDivEvaluationPoints(evaluationPoints, - evaluationDivPoints, - elemOrts, - &basis, - &projStruct); - - DynRankView ConstructWithLabel(targetAtEvalPoints, numElems, numPoints, dim); - DynRankView ConstructWithLabel(targetDivAtEvalPoints, numElems, numDivPoints); + //Compute physical Dof Coordinates and Reference coordinates + DynRankView ConstructWithLabel(physRefCoords, numElems, numRefCoords, dim); + DynRankView ConstructWithLabel(physDofCoords, numElems, basisCardinality, dim); + { + Basis_HGRAD_HEX_C1_FEM hexaLinearBasis; //used for computing physical coordinates + DynRankView ConstructWithLabel(hexaLinearBasisValuesAtRefCoords, hexa.getNodeCount(), numRefCoords); + hexaLinearBasis.getValues(hexaLinearBasisValuesAtRefCoords, refPoints); + for(ordinal_type i=0; i hexLinearBasis; //used for computing physical coordinates - DynRankView ConstructWithLabel(hexLinearBasisValuesAtEvalPoints, hexa.getNodeCount(), numPoints); - DynRankView ConstructWithLabel(hexLinearBasisValuesAtEvalDivPoints, hexa.getNodeCount(), numDivPoints); - - for(ordinal_type i=0; i projStruct; + projStruct.createHDivProjectionStruct(&basis, targetCubDegree, targetDerivCubDegree); + + ordinal_type numPoints = projStruct.getNumTargetEvalPoints(), numDivPoints = projStruct.getNumTargetDerivEvalPoints(); + + DynRankView ConstructWithLabel(evaluationPoints, numElems, numPoints, dim); + DynRankView ConstructWithLabel(evaluationDivPoints, numElems, numDivPoints, dim); + + pts::getHDivEvaluationPoints(evaluationPoints, + evaluationDivPoints, + elemOrts, + &basis, + &projStruct); + + DynRankView ConstructWithLabel(targetAtEvalPoints, numElems, numPoints, dim); + DynRankView ConstructWithLabel(targetDivAtEvalPoints, numElems, numDivPoints); + + + DynRankView ConstructWithLabel(physEvalPoints, numElems, numPoints, dim); + DynRankView ConstructWithLabel(physEvalDivPoints, numElems, numDivPoints, dim); + { + Basis_HGRAD_HEX_C1_FEM hexLinearBasis; //used for computing physical coordinates + DynRankView ConstructWithLabel(hexLinearBasisValuesAtEvalPoints, hexa.getNodeCount(), numPoints); + DynRankView ConstructWithLabel(hexLinearBasisValuesAtEvalDivPoints, hexa.getNodeCount(), numDivPoints); + + for(ordinal_type i=0; i relTol){ - errorFlag++; - *outStream << std::setw(70) << "^^^^----FAILURE!" << "\n"; - *outStream << "For N = " << NX << ", computed error (" << hdivNorm[iter] << ") is different than expected one (" << expected_error << ")"; - *outStream << std::endl; + hdivNorm[iter] = std::sqrt(norm2); + auto expected_error = hdiv_errors[iter]; + if(std::abs(hdivNorm[iter]-expected_error)/expected_error > relTol){ + errorFlag++; + *outStream << std::setw(70) << "^^^^----FAILURE!" << "\n"; + *outStream << "For N = " << NX << ", computed error (" << hdivNorm[iter] << ") is different than expected one (" << expected_error << ")"; + *outStream << std::endl; + } + delete basisPtr; } *outStream << "HDIV Error: " << hdivNorm[iter] < elemOrts("elemOrts", numElems); ots::getOrientation(elemOrts, elemNodes, hexa); - Basis_HVOL_HEX_Cn_FEM basis(order-1); - ordinal_type basisCardinality = basis.getCardinality(); - - //Compute physical Dof Coordinates and Reference coordinates - DynRankView ConstructWithLabel(physRefCoords, numElems, numRefCoords, dim); - { - Basis_HGRAD_HEX_C1_FEM hexaLinearBasis; //used for computing physical coordinates - DynRankView ConstructWithLabel(hexaLinearBasisValuesAtRefCoords, hexa.getNodeCount(), numRefCoords); - hexaLinearBasis.getValues(hexaLinearBasisValuesAtRefCoords, refPoints); - for(ordinal_type i=0; i basis_set; + basis_set.push_back(new typename CG_NBasis::HVOL_HEX(order-1)); + basis_set.push_back(new typename CG_HBasis::HVOL_HEX(order-1)); - // compute projection-based interpolation of fun into HVOL - DynRankView ConstructWithLabel(basisCoeffsHVol, numElems, basisCardinality); - { - ordinal_type targetCubDegree(basis.getDegree()); + for (auto basisPtr:basis_set) { + auto& basis = *basisPtr; + *outStream << " " << basis.getName() << std::endl; - Experimental::ProjectionStruct projStruct; - projStruct.createHVolProjectionStruct(&basis, targetCubDegree); + ordinal_type basisCardinality = basis.getCardinality(); - ordinal_type numPoints = projStruct.getNumTargetEvalPoints(); + //Compute physical Dof Coordinates and Reference coordinates + DynRankView ConstructWithLabel(physRefCoords, numElems, numRefCoords, dim); + { + Basis_HGRAD_HEX_C1_FEM hexaLinearBasis; //used for computing physical coordinates + DynRankView ConstructWithLabel(hexaLinearBasisValuesAtRefCoords, hexa.getNodeCount(), numRefCoords); + hexaLinearBasis.getValues(hexaLinearBasisValuesAtRefCoords, refPoints); + for(ordinal_type i=0; i projStruct; + projStruct.createHVolProjectionStruct(&basis, targetCubDegree); + ordinal_type numPoints = projStruct.getNumTargetEvalPoints(); - DynRankView ConstructWithLabel(physEvalPoints, numElems, numPoints, dim); - { - Basis_HGRAD_HEX_C1_FEM hexLinearBasis; //used for computing physical coordinates - DynRankView ConstructWithLabel(hexLinearBasisValuesAtEvalPoints, hexa.getNodeCount(), numPoints); + DynRankView ConstructWithLabel(evaluationPoints, numElems, numPoints, dim); - for(ordinal_type i=0; i hexLinearBasis; //used for computing physical coordinates + DynRankView ConstructWithLabel(hexLinearBasisValuesAtEvalPoints, hexa.getNodeCount(), numPoints); + + for(ordinal_type i=0; i relTol){ - errorFlag++; - *outStream << std::setw(70) << "^^^^----FAILURE!" << "\n"; - *outStream << "For N = " << NX << ", computed error (" << hvolNorm[iter] << ") is different than expected one (" << expected_error << ")"; - *outStream << std::endl; + hvolNorm[iter] = std::sqrt(norm2); + auto expected_error = hvol_errors[iter]; + if(std::abs(hvolNorm[iter]-expected_error)/expected_error > relTol){ + errorFlag++; + *outStream << std::setw(70) << "^^^^----FAILURE!" << "\n"; + *outStream << "For N = " << NX << ", computed error (" << hvolNorm[iter] << ") is different than expected one (" << expected_error << ")"; + *outStream << std::endl; + } + delete basisPtr; } *outStream << "HVOL Error: " << hvolNorm[iter] <getCubature(refPoints, weights); - + using basisType = Basis; + using CG_NBasis = NodalBasisFamily; + using CG_HBasis = HierarchicalBasisFamily; + //using CG_DNBasis = DerivedNodalBasisFamily; *outStream @@ -345,180 +349,188 @@ int ConvergenceQuad(const bool verbose) { Kokkos::DynRankView elemOrts("elemOrts", numElems); ots::getOrientation(elemOrts, elemNodes, quad); - Basis_HGRAD_QUAD_Cn_FEM basis(order); - ordinal_type basisCardinality = basis.getCardinality(); - - //Compute physical Dof Coordinates and Reference coordinates - DynRankView ConstructWithLabel(physRefCoords, numElems, numRefCoords, dim); - { - Basis_HGRAD_QUAD_C1_FEM quadLinearBasis; //used for computing physical coordinates - DynRankView ConstructWithLabel(quadLinearBasisValuesAtRefCoords, quad.getNodeCount(), numRefCoords); - quadLinearBasis.getValues(quadLinearBasisValuesAtRefCoords, refPoints); - for(ordinal_type i=0; i basis_set; + basis_set.push_back(new typename CG_NBasis::HGRAD_QUAD(order)); + basis_set.push_back(new typename CG_HBasis::HGRAD_QUAD(order)); + + for (auto basisPtr:basis_set) { + auto& basis = *basisPtr; + *outStream << " " << basis.getName() << std::endl; + ordinal_type basisCardinality = basis.getCardinality(); + + //Compute physical Dof Coordinates and Reference coordinates + DynRankView ConstructWithLabel(physRefCoords, numElems, numRefCoords, dim); + { + Basis_HGRAD_QUAD_C1_FEM quadLinearBasis; //used for computing physical coordinates + DynRankView ConstructWithLabel(quadLinearBasisValuesAtRefCoords, quad.getNodeCount(), numRefCoords); + quadLinearBasis.getValues(quadLinearBasisValuesAtRefCoords, refPoints); + for(ordinal_type i=0; i projStruct; - projStruct.createHGradProjectionStruct(&basis, targetCubDegree, targetDerivCubDegree); + Experimental::ProjectionStruct projStruct; + projStruct.createHGradProjectionStruct(&basis, targetCubDegree, targetDerivCubDegree); - ordinal_type numPoints = projStruct.getNumTargetEvalPoints(), numGradPoints = projStruct.getNumTargetDerivEvalPoints(); + ordinal_type numPoints = projStruct.getNumTargetEvalPoints(), numGradPoints = projStruct.getNumTargetDerivEvalPoints(); - DynRankView ConstructWithLabel(evaluationPoints, numElems, numPoints, dim); - DynRankView ConstructWithLabel(evaluationGradPoints, numElems, numGradPoints, dim); + DynRankView ConstructWithLabel(evaluationPoints, numElems, numPoints, dim); + DynRankView ConstructWithLabel(evaluationGradPoints, numElems, numGradPoints, dim); - pts::getHGradEvaluationPoints(evaluationPoints, - evaluationGradPoints, - elemOrts, - &basis, - &projStruct); + pts::getHGradEvaluationPoints(evaluationPoints, + evaluationGradPoints, + elemOrts, + &basis, + &projStruct); - DynRankView ConstructWithLabel(targetAtEvalPoints, numElems, numPoints); - DynRankView ConstructWithLabel(targetGradAtEvalPoints, numElems, numGradPoints, dim); + DynRankView ConstructWithLabel(targetAtEvalPoints, numElems, numPoints); + DynRankView ConstructWithLabel(targetGradAtEvalPoints, numElems, numGradPoints, dim); - DynRankView ConstructWithLabel(physEvalPoints, numElems, numPoints, dim); - DynRankView ConstructWithLabel(physEvalGradPoints, numElems, numGradPoints, dim); - { - Basis_HGRAD_QUAD_C1_FEM quadLinearBasis; //used for computing physical coordinates - DynRankView ConstructWithLabel(quadLinearBasisValuesAtEvalPoints, quad.getNodeCount(), numPoints); - DynRankView ConstructWithLabel(quadLinearBasisValuesAtEvalGradPoints, quad.getNodeCount(), numGradPoints); + DynRankView ConstructWithLabel(physEvalPoints, numElems, numPoints, dim); + DynRankView ConstructWithLabel(physEvalGradPoints, numElems, numGradPoints, dim); + { + Basis_HGRAD_QUAD_C1_FEM quadLinearBasis; //used for computing physical coordinates + DynRankView ConstructWithLabel(quadLinearBasisValuesAtEvalPoints, quad.getNodeCount(), numPoints); + DynRankView ConstructWithLabel(quadLinearBasisValuesAtEvalGradPoints, quad.getNodeCount(), numGradPoints); - for(ordinal_type i=0; i0) - quadLinearBasis.getValues(quadLinearBasisValuesAtEvalGradPoints, Kokkos::subview(evaluationGradPoints,i,Kokkos::ALL(),Kokkos::ALL())); - for(ordinal_type d=0; d0) + quadLinearBasis.getValues(quadLinearBasisValuesAtEvalGradPoints, Kokkos::subview(evaluationGradPoints,i,Kokkos::ALL(),Kokkos::ALL())); + for(ordinal_type d=0; d0) - ct::setJacobian(jacobian, evaluationGradPoints, physVertexes, quad); + //transform the target function and its derivative to the reference element (inverse of pullback operator) + DynRankView ConstructWithLabel(jacobian, numElems, numGradPoints, dim, dim); + if(numGradPoints>0) + ct::setJacobian(jacobian, evaluationGradPoints, physVertexes, quad); + + GradFun gradFun; + Kokkos::deep_copy(targetGradAtEvalPoints,0.); + for(int ic=0; ic relTol){ - errorFlag++; - *outStream << std::setw(70) << "^^^^----FAILURE!" << "\n"; - *outStream << "For N = " << NX << ", computed error (" << hgradNorm[iter] << ") is different than expected one (" << expected_error << ")"; - *outStream << std::endl; + hgradNorm[iter] = std::sqrt(norm2); + auto expected_error = hgrad_errors[iter]; + if(std::abs(hgradNorm[iter]-expected_error)/expected_error > relTol){ + errorFlag++; + *outStream << std::setw(70) << "^^^^----FAILURE!" << "\n"; + *outStream << "For N = " << NX << ", computed error (" << hgradNorm[iter] << ") is different than expected one (" << expected_error << ")"; + *outStream << std::endl; + } + delete basisPtr; } *outStream << "HGRAD Error: " << hgradNorm[iter] < elemOrts("elemOrts", numElems); ots::getOrientation(elemOrts, elemNodes, quad); - Basis_HCURL_QUAD_In_FEM basis(order); - ordinal_type basisCardinality = basis.getCardinality(); - - //Compute physical Dof Coordinates and Reference coordinates - DynRankView ConstructWithLabel(physRefCoords, numElems, numRefCoords, dim); - { - Basis_HGRAD_QUAD_C1_FEM quadLinearBasis; //used for computing physical coordinates - DynRankView ConstructWithLabel(quadLinearBasisValuesAtRefCoords, quad.getNodeCount(), numRefCoords); - quadLinearBasis.getValues(quadLinearBasisValuesAtRefCoords, refPoints); - for(ordinal_type i=0; i projStruct; - projStruct.createHCurlProjectionStruct(&basis, targetCubDegree, targetDerivCubDegree); - - ordinal_type numPoints = projStruct.getNumTargetEvalPoints(), numCurlPoints = projStruct.getNumTargetDerivEvalPoints(); - DynRankView ConstructWithLabel(evaluationPoints, numElems, numPoints, dim); - DynRankView ConstructWithLabel(evaluationCurlPoints, numElems, numCurlPoints, dim); - pts::getHCurlEvaluationPoints(evaluationPoints, - evaluationCurlPoints, - elemOrts, - &basis, - &projStruct); - + std::vector basis_set; + basis_set.push_back(new typename CG_NBasis::HCURL_QUAD(order)); + basis_set.push_back(new typename CG_HBasis::HCURL_QUAD(order)); - DynRankView ConstructWithLabel(targetAtEvalPoints, numElems, numPoints, dim); - DynRankView ConstructWithLabel(targetCurlAtEvalPoints, numElems, numCurlPoints); + for (auto basisPtr:basis_set) { + auto& basis = *basisPtr; + *outStream << " " << basis.getName() << std::endl; + ordinal_type basisCardinality = basis.getCardinality(); - DynRankView ConstructWithLabel(physEvalPoints, numElems, numPoints, dim); - DynRankView ConstructWithLabel(physEvalCurlPoints, numElems, numCurlPoints, dim); + //Compute physical Dof Coordinates and Reference coordinates + DynRankView ConstructWithLabel(physRefCoords, numElems, numRefCoords, dim); { Basis_HGRAD_QUAD_C1_FEM quadLinearBasis; //used for computing physical coordinates - DynRankView ConstructWithLabel(quadLinearBasisValuesAtEvalPoints, quad.getNodeCount(), numPoints); - DynRankView ConstructWithLabel(quadLinearBasisValuesAtEvalCurlPoints, quad.getNodeCount(), numCurlPoints); - - for(ordinal_type i=0; i projStruct; + projStruct.createHCurlProjectionStruct(&basis, targetCubDegree, targetDerivCubDegree); + + ordinal_type numPoints = projStruct.getNumTargetEvalPoints(), numCurlPoints = projStruct.getNumTargetDerivEvalPoints(); + DynRankView ConstructWithLabel(evaluationPoints, numElems, numPoints, dim); + DynRankView ConstructWithLabel(evaluationCurlPoints, numElems, numCurlPoints, dim); + pts::getHCurlEvaluationPoints(evaluationPoints, + evaluationCurlPoints, + elemOrts, + &basis, + &projStruct); + + + DynRankView ConstructWithLabel(targetAtEvalPoints, numElems, numPoints, dim); + DynRankView ConstructWithLabel(targetCurlAtEvalPoints, numElems, numCurlPoints); + + + DynRankView ConstructWithLabel(physEvalPoints, numElems, numPoints, dim); + DynRankView ConstructWithLabel(physEvalCurlPoints, numElems, numCurlPoints, dim); + { + Basis_HGRAD_QUAD_C1_FEM quadLinearBasis; //used for computing physical coordinates + DynRankView ConstructWithLabel(quadLinearBasisValuesAtEvalPoints, quad.getNodeCount(), numPoints); + DynRankView ConstructWithLabel(quadLinearBasisValuesAtEvalCurlPoints, quad.getNodeCount(), numCurlPoints); + + for(ordinal_type i=0; i relTol){ - errorFlag++; - *outStream << std::setw(70) << "^^^^----FAILURE!" << "\n"; - *outStream << "For N = " << NX << ", computed error (" << hcurlNorm[iter] << ") is different than expected one (" << expected_error << ")"; - *outStream << std::endl; + hcurlNorm[iter] = std::sqrt(norm2); + auto expected_error = hcurl_errors[iter]; + if(std::abs(hcurlNorm[iter]-expected_error)/expected_error > relTol){ + errorFlag++; + *outStream << std::setw(70) << "^^^^----FAILURE!" << "\n"; + *outStream << "For N = " << NX << ", computed error (" << hcurlNorm[iter] << ") is different than expected one (" << expected_error << ")"; + *outStream << std::endl; + } + delete basisPtr; } *outStream << "HCURL Error: " << hcurlNorm[iter] < elemOrts("elemOrts", numElems); ots::getOrientation(elemOrts, elemNodes, quad); - Basis_HDIV_QUAD_In_FEM basis(order); - ordinal_type basisCardinality = basis.getCardinality(); - - //Compute physical Dof Coordinates and Reference coordinates - DynRankView ConstructWithLabel(physRefCoords, numElems, numRefCoords, dim); - DynRankView ConstructWithLabel(physDofCoords, numElems, basisCardinality, dim); - { - Basis_HGRAD_QUAD_C1_FEM quadLinearBasis; //used for computing physical coordinates - DynRankView ConstructWithLabel(quadLinearBasisValuesAtRefCoords, quad.getNodeCount(), numRefCoords); - quadLinearBasis.getValues(quadLinearBasisValuesAtRefCoords, refPoints); - for(ordinal_type i=0; i projStruct; - projStruct.createHDivProjectionStruct(&basis, targetCubDegree, targetDerivCubDegree); + std::vector basis_set; + basis_set.push_back(new typename CG_NBasis::HDIV_QUAD(order)); + basis_set.push_back(new typename CG_HBasis::HDIV_QUAD(order)); - ordinal_type numPoints = projStruct.getNumTargetEvalPoints(), numDivPoints = projStruct.getNumTargetDerivEvalPoints(); + for (auto basisPtr:basis_set) { + auto& basis = *basisPtr; + *outStream << " " << basis.getName() << std::endl; + ordinal_type basisCardinality = basis.getCardinality(); - DynRankView ConstructWithLabel(evaluationPoints, numElems, numPoints, dim); - DynRankView ConstructWithLabel(evaluationDivPoints, numElems, numDivPoints, dim); - - pts::getHDivEvaluationPoints(evaluationPoints, - evaluationDivPoints, - elemOrts, - &basis, - &projStruct); - - DynRankView ConstructWithLabel(targetAtEvalPoints, numElems, numPoints, dim); - DynRankView ConstructWithLabel(targetDivAtEvalPoints, numElems, numDivPoints); - - - DynRankView ConstructWithLabel(physEvalPoints, numElems, numPoints, dim); - DynRankView ConstructWithLabel(physEvalDivPoints, numElems, numDivPoints, dim); + //Compute physical Dof Coordinates and Reference coordinates + DynRankView ConstructWithLabel(physRefCoords, numElems, numRefCoords, dim); + DynRankView ConstructWithLabel(physDofCoords, numElems, basisCardinality, dim); { Basis_HGRAD_QUAD_C1_FEM quadLinearBasis; //used for computing physical coordinates - DynRankView ConstructWithLabel(quadLinearBasisValuesAtEvalPoints, quad.getNodeCount(), numPoints); - DynRankView ConstructWithLabel(quadLinearBasisValuesAtEvalDivPoints, quad.getNodeCount(), numDivPoints); + DynRankView ConstructWithLabel(quadLinearBasisValuesAtRefCoords, quad.getNodeCount(), numRefCoords); + quadLinearBasis.getValues(quadLinearBasisValuesAtRefCoords, refPoints); + for(ordinal_type i=0; i projStruct; + projStruct.createHDivProjectionStruct(&basis, targetCubDegree, targetDerivCubDegree); + + ordinal_type numPoints = projStruct.getNumTargetEvalPoints(), numDivPoints = projStruct.getNumTargetDerivEvalPoints(); + + DynRankView ConstructWithLabel(evaluationPoints, numElems, numPoints, dim); + DynRankView ConstructWithLabel(evaluationDivPoints, numElems, numDivPoints, dim); + + pts::getHDivEvaluationPoints(evaluationPoints, + evaluationDivPoints, + elemOrts, + &basis, + &projStruct); + + DynRankView ConstructWithLabel(targetAtEvalPoints, numElems, numPoints, dim); + DynRankView ConstructWithLabel(targetDivAtEvalPoints, numElems, numDivPoints); + + + DynRankView ConstructWithLabel(physEvalPoints, numElems, numPoints, dim); + DynRankView ConstructWithLabel(physEvalDivPoints, numElems, numDivPoints, dim); + { + Basis_HGRAD_QUAD_C1_FEM quadLinearBasis; //used for computing physical coordinates + DynRankView ConstructWithLabel(quadLinearBasisValuesAtEvalPoints, quad.getNodeCount(), numPoints); + DynRankView ConstructWithLabel(quadLinearBasisValuesAtEvalDivPoints, quad.getNodeCount(), numDivPoints); + + for(ordinal_type i=0; i relTol){ - errorFlag++; - *outStream << std::setw(70) << "^^^^----FAILURE!" << "\n"; - *outStream << "For N = " << NX << ", computed error (" << hdivNorm[iter] << ") is different than expected one (" << expected_error << ")"; - *outStream << std::endl; + hdivNorm[iter] = std::sqrt(norm2); + auto expected_error = hdiv_errors[iter]; + if(std::abs(hdivNorm[iter]-expected_error)/expected_error > relTol){ + errorFlag++; + *outStream << std::setw(70) << "^^^^----FAILURE!" << "\n"; + *outStream << "For N = " << NX << ", computed error (" << hdivNorm[iter] << ") is different than expected one (" << expected_error << ")"; + *outStream << std::endl; + } + delete basisPtr; } *outStream << "HDIV Error: " << hdivNorm[iter] < elemOrts("elemOrts", numElems); ots::getOrientation(elemOrts, elemNodes, quad); - Basis_HVOL_QUAD_Cn_FEM basis(order-1); - ordinal_type basisCardinality = basis.getCardinality(); - - //Compute physical Dof Coordinates and Reference coordinates - DynRankView ConstructWithLabel(physRefCoords, numElems, numRefCoords, dim); - { - Basis_HGRAD_QUAD_C1_FEM quadLinearBasis; //used for computing physical coordinates - DynRankView ConstructWithLabel(quadLinearBasisValuesAtRefCoords, quad.getNodeCount(), numRefCoords); - quadLinearBasis.getValues(quadLinearBasisValuesAtRefCoords, refPoints); - for(ordinal_type i=0; i basis_set; + basis_set.push_back(new typename CG_NBasis::HVOL_QUAD(order-1)); + basis_set.push_back(new typename CG_HBasis::HVOL_QUAD(order-1)); - //check function reproducibility - Fun fun; - DynRankView ConstructWithLabel(funAtRefCoords, numElems, numRefCoords); - for(ordinal_type i=0; i quadLinearBasis; //used for computing physical coordinates + DynRankView ConstructWithLabel(quadLinearBasisValuesAtRefCoords, quad.getNodeCount(), numRefCoords); + quadLinearBasis.getValues(quadLinearBasisValuesAtRefCoords, refPoints); + for(ordinal_type i=0; i projStruct; - projStruct.createHVolProjectionStruct(&basis, targetCubDegree); + Experimental::ProjectionStruct projStruct; + projStruct.createHVolProjectionStruct(&basis, targetCubDegree); - ordinal_type numPoints = projStruct.getNumTargetEvalPoints(); + ordinal_type numPoints = projStruct.getNumTargetEvalPoints(); - DynRankView ConstructWithLabel(evaluationPoints, numElems, numPoints, dim); + DynRankView ConstructWithLabel(evaluationPoints, numElems, numPoints, dim); - pts::getHVolEvaluationPoints(evaluationPoints, - elemOrts, - &basis, - &projStruct); + pts::getHVolEvaluationPoints(evaluationPoints, + elemOrts, + &basis, + &projStruct); - DynRankView ConstructWithLabel(targetAtEvalPoints, numElems, numPoints); + DynRankView ConstructWithLabel(targetAtEvalPoints, numElems, numPoints); - DynRankView ConstructWithLabel(physEvalPoints, numElems, numPoints, dim); - { - Basis_HGRAD_QUAD_C1_FEM quadLinearBasis; //used for computing physical coordinates - DynRankView ConstructWithLabel(quadLinearBasisValuesAtEvalPoints, quad.getNodeCount(), numPoints); + DynRankView ConstructWithLabel(physEvalPoints, numElems, numPoints, dim); + { + Basis_HGRAD_QUAD_C1_FEM quadLinearBasis; //used for computing physical coordinates + DynRankView ConstructWithLabel(quadLinearBasisValuesAtEvalPoints, quad.getNodeCount(), numPoints); - for(ordinal_type i=0; i relTol){ - errorFlag++; - *outStream << std::setw(70) << "^^^^----FAILURE!" << "\n"; - *outStream << "For N = " << NX << ", computed error (" << hvolNorm[iter] << ") is different than expected one (" << expected_error << ")"; - *outStream << std::endl; + hvolNorm[iter] = std::sqrt(norm2); + auto expected_error = hvol_errors[iter]; + if(std::abs(hvolNorm[iter]-expected_error)/expected_error > relTol){ + errorFlag++; + *outStream << std::setw(70) << "^^^^----FAILURE!" << "\n"; + *outStream << "For N = " << NX << ", computed error (" << hvolNorm[iter] << ") is different than expected one (" << expected_error << ")"; + *outStream << std::endl; + } + delete basisPtr; } *outStream << "HVOL Error: " << hvolNorm[iter] <getCubature(refPoints, weights); - + using basisType = Basis; + using CG_NBasis = NodalBasisFamily; + using CG_HBasis = HierarchicalBasisFamily; + //using CG_DNBasis = DerivedNodalBasisFamily; *outStream @@ -418,180 +420,187 @@ int ConvergenceTet(const bool verbose) { Kokkos::DynRankView elemOrts("elemOrts", numElems); ots::getOrientation(elemOrts, elemNodes, tet); - Basis_HGRAD_TET_Cn_FEM basis(order); - ordinal_type basisCardinality = basis.getCardinality(); - - //Compute Reference coordinates - DynRankView ConstructWithLabel(physRefCoords, numElems, numRefCoords, dim); - { - Basis_HGRAD_TET_C1_FEM tetLinearBasis; //used for computing physical coordinates - DynRankView ConstructWithLabel(tetLinearBasisValuesAtRefCoords, tet.getNodeCount(), numRefCoords); - tetLinearBasis.getValues(tetLinearBasisValuesAtRefCoords, refPoints); - for(ordinal_type i=0; i basis_set; + basis_set.push_back(new typename CG_NBasis::HGRAD_TET(order)); + basis_set.push_back(new typename CG_HBasis::HGRAD_TET(order)); + + for (auto basisPtr:basis_set) { + auto& basis = *basisPtr; + *outStream << " " << basis.getName() << " " << basis.requireOrientation() << std::endl; + ordinal_type basisCardinality = basis.getCardinality(); - Fun fun; - GradFun gradFun; - DynRankView ConstructWithLabel(funAtRefCoords, numElems, numRefCoords); - DynRankView ConstructWithLabel(funGradAtPhysRefCoords, numElems, numRefCoords, dim); - for(ordinal_type i=0; i tetLinearBasis; //used for computing physical coordinates + DynRankView ConstructWithLabel(tetLinearBasisValuesAtRefCoords, tet.getNodeCount(), numRefCoords); + tetLinearBasis.getValues(tetLinearBasisValuesAtRefCoords, refPoints); + for(ordinal_type i=0; i projStruct; - projStruct.createHGradProjectionStruct(&basis, targetCubDegree, targetDerivCubDegree); + // compute projection-based interpolation of fun into HGRAD + DynRankView ConstructWithLabel(basisCoeffsHGrad, numElems, basisCardinality); + { + ordinal_type targetCubDegree(basis.getDegree()),targetDerivCubDegree(basis.getDegree()); - ordinal_type numPoints = projStruct.getNumTargetEvalPoints(), numGradPoints = projStruct.getNumTargetDerivEvalPoints(); + Experimental::ProjectionStruct projStruct; + projStruct.createHGradProjectionStruct(&basis, targetCubDegree, targetDerivCubDegree); - DynRankView ConstructWithLabel(evaluationPoints, numElems, numPoints, dim); - DynRankView ConstructWithLabel(evaluationGradPoints, numElems, numGradPoints, dim); + ordinal_type numPoints = projStruct.getNumTargetEvalPoints(), numGradPoints = projStruct.getNumTargetDerivEvalPoints(); + DynRankView ConstructWithLabel(evaluationPoints, numElems, numPoints, dim); + DynRankView ConstructWithLabel(evaluationGradPoints, numElems, numGradPoints, dim); - pts::getHGradEvaluationPoints(evaluationPoints, - evaluationGradPoints, - elemOrts, - &basis, - &projStruct); + pts::getHGradEvaluationPoints(evaluationPoints, + evaluationGradPoints, + elemOrts, + &basis, + &projStruct); - DynRankView ConstructWithLabel(targetAtEvalPoints, numElems, numPoints); - DynRankView ConstructWithLabel(targetGradAtEvalPoints, numElems, numGradPoints, dim); - DynRankView ConstructWithLabel(physEvalPoints, numElems, numPoints, dim); - DynRankView ConstructWithLabel(physEvalGradPoints, numElems, numGradPoints, dim); - { - Basis_HGRAD_TET_C1_FEM hexLinearBasis; //used for computing physical coordinates - DynRankView ConstructWithLabel(hexLinearBasisValuesAtEvalPoints, tet.getNodeCount(), numPoints); - DynRankView ConstructWithLabel(hexLinearBasisValuesAtEvalGradPoints, tet.getNodeCount(), numGradPoints); - - for(ordinal_type i=0; i0) - hexLinearBasis.getValues(hexLinearBasisValuesAtEvalGradPoints, Kokkos::subview(evaluationGradPoints,i,Kokkos::ALL(),Kokkos::ALL())); - for(ordinal_type d=0; d hexLinearBasis; //used for computing physical coordinates + DynRankView ConstructWithLabel(hexLinearBasisValuesAtEvalPoints, tet.getNodeCount(), numPoints); + DynRankView ConstructWithLabel(hexLinearBasisValuesAtEvalGradPoints, tet.getNodeCount(), numGradPoints); + + for(ordinal_type i=0; i0) + hexLinearBasis.getValues(hexLinearBasisValuesAtEvalGradPoints, Kokkos::subview(evaluationGradPoints,i,Kokkos::ALL(),Kokkos::ALL())); + for(ordinal_type d=0; d0) - ct::setJacobian(jacobian, evaluationGradPoints, physVertexes, tet); + //transform the target function and its derivative to the reference element (inverse of pullback operator) + DynRankView ConstructWithLabel(jacobian, numElems, numGradPoints, dim, dim); + if(numGradPoints>0) + ct::setJacobian(jacobian, evaluationGradPoints, physVertexes, tet); + + GradFun gradFun; + Kokkos::deep_copy(targetGradAtEvalPoints,0.); + for(int ic=0; ic relTol){ - errorFlag++; - *outStream << std::setw(70) << "^^^^----FAILURE!" << "\n"; - *outStream << "For N = " << NX << ", computed error (" << hgradNorm[iter] << ") is different than expected one (" << expected_error << ")"; - *outStream << std::endl; + hgradNorm[iter] = std::sqrt(norm2); + auto expected_error = hgrad_errors[iter]; + if(std::abs(hgradNorm[iter]-expected_error)/expected_error > relTol){ + errorFlag++; + *outStream << std::setw(70) << "^^^^----FAILURE!" << "\n"; + *outStream << "For N = " << NX << ", computed error (" << hgradNorm[iter] << ") is different than expected one (" << expected_error << ")"; + *outStream << std::endl; + } + delete basisPtr; } *outStream << "HGRAD Error: " << hgradNorm[iter] < elemOrts("elemOrts", numElems); ots::getOrientation(elemOrts, elemNodes, tet); - Basis_HCURL_TET_In_FEM basis(order); - ordinal_type basisCardinality = basis.getCardinality(); - - //Compute physical Dof Coordinates and Reference coordinates - DynRankView ConstructWithLabel(physRefCoords, numElems, numRefCoords, dim); - { - Basis_HGRAD_TET_C1_FEM tetLinearBasis; //used for computing physical coordinates - DynRankView ConstructWithLabel(tetLinearBasisValuesAtRefCoords, tet.getNodeCount(), numRefCoords); - tetLinearBasis.getValues(tetLinearBasisValuesAtRefCoords, refPoints); - for(ordinal_type i=0; i projStruct; - projStruct.createHCurlProjectionStruct(&basis, targetCubDegree, targetDerivCubDegree); - - ordinal_type numPoints = projStruct.getNumTargetEvalPoints(), numCurlPoints = projStruct.getNumTargetDerivEvalPoints(); - DynRankView ConstructWithLabel(evaluationPoints, numElems, numPoints, dim); - DynRankView ConstructWithLabel(evaluationCurlPoints, numElems, numCurlPoints, dim); - pts::getHCurlEvaluationPoints(evaluationPoints, - evaluationCurlPoints, - elemOrts, - &basis, - &projStruct); + std::vector basis_set; + basis_set.push_back(new typename CG_NBasis::HCURL_TET(order)); + //basis_set.push_back(new typename CG_HBasis::HCURL_TET(order)); + for (auto basisPtr:basis_set) { + auto& basis = *basisPtr; + *outStream << " " << basis.getName() << std::endl; + ordinal_type basisCardinality = basis.getCardinality(); - DynRankView ConstructWithLabel(targetAtEvalPoints, numElems, numPoints, dim); - DynRankView ConstructWithLabel(targetCurlAtEvalPoints, numElems, numCurlPoints, dim); - - - DynRankView ConstructWithLabel(physEvalPoints, numElems, numPoints, dim); - DynRankView ConstructWithLabel(physEvalCurlPoints, numElems, numCurlPoints, dim); + //Compute physical Dof Coordinates and Reference coordinates + DynRankView ConstructWithLabel(physRefCoords, numElems, numRefCoords, dim); { - Basis_HGRAD_TET_C1_FEM hexLinearBasis; //used for computing physical coordinates - DynRankView ConstructWithLabel(hexLinearBasisValuesAtEvalPoints, tet.getNodeCount(), numPoints); - DynRankView ConstructWithLabel(hexLinearBasisValuesAtEvalCurlPoints, tet.getNodeCount(), numCurlPoints); + Basis_HGRAD_TET_C1_FEM tetLinearBasis; //used for computing physical coordinates + DynRankView ConstructWithLabel(tetLinearBasisValuesAtRefCoords, tet.getNodeCount(), numRefCoords); + tetLinearBasis.getValues(tetLinearBasisValuesAtRefCoords, refPoints); + for(ordinal_type i=0; i projStruct; + projStruct.createHCurlProjectionStruct(&basis, targetCubDegree, targetDerivCubDegree); + + ordinal_type numPoints = projStruct.getNumTargetEvalPoints(), numCurlPoints = projStruct.getNumTargetDerivEvalPoints(); + DynRankView ConstructWithLabel(evaluationPoints, numElems, numPoints, dim); + DynRankView ConstructWithLabel(evaluationCurlPoints, numElems, numCurlPoints, dim); + pts::getHCurlEvaluationPoints(evaluationPoints, + evaluationCurlPoints, + elemOrts, + &basis, + &projStruct); + + + DynRankView ConstructWithLabel(targetAtEvalPoints, numElems, numPoints, dim); + DynRankView ConstructWithLabel(targetCurlAtEvalPoints, numElems, numCurlPoints, dim); + + + DynRankView ConstructWithLabel(physEvalPoints, numElems, numPoints, dim); + DynRankView ConstructWithLabel(physEvalCurlPoints, numElems, numCurlPoints, dim); + { + Basis_HGRAD_TET_C1_FEM hexLinearBasis; //used for computing physical coordinates + DynRankView ConstructWithLabel(hexLinearBasisValuesAtEvalPoints, tet.getNodeCount(), numPoints); + DynRankView ConstructWithLabel(hexLinearBasisValuesAtEvalCurlPoints, tet.getNodeCount(), numCurlPoints); + + for(ordinal_type i=0; i relTol){ - errorFlag++; - *outStream << std::setw(70) << "^^^^----FAILURE!" << "\n"; - *outStream << "For N = " << NX << ", computed error (" << hcurlNorm[iter] << ") is different than expected one (" << expected_error << ")"; - *outStream << std::endl; + } + hcurlNorm[iter] = std::sqrt(norm2); + auto expected_error = hcurl_errors[iter]; + if(std::abs(hcurlNorm[iter]-expected_error)/expected_error > relTol){ + errorFlag++; + *outStream << std::setw(70) << "^^^^----FAILURE!" << "\n"; + *outStream << "For N = " << NX << ", computed error (" << hcurlNorm[iter] << ") is different than expected one (" << expected_error << ")"; + *outStream << std::endl; + } + delete basisPtr; } *outStream << "HCURL Error: " << hcurlNorm[iter] < elemOrts("elemOrts", numElems); ots::getOrientation(elemOrts, elemNodes, tet); - Basis_HDIV_TET_In_FEM basis(order); - ordinal_type basisCardinality = basis.getCardinality(); - - //Compute physical Dof Coordinates and Reference coordinates - DynRankView ConstructWithLabel(physRefCoords, numElems, numRefCoords, dim); - DynRankView ConstructWithLabel(physDofCoords, numElems, basisCardinality, dim); - { - Basis_HGRAD_TET_C1_FEM tetLinearBasis; //used for computing physical coordinates - DynRankView ConstructWithLabel(tetLinearBasisValuesAtRefCoords, tet.getNodeCount(), numRefCoords); - tetLinearBasis.getValues(tetLinearBasisValuesAtRefCoords, refPoints); - for(ordinal_type i=0; i basis_set; + basis_set.push_back(new typename CG_NBasis::HDIV_TET(order)); + //basis_set.push_back(new typename CG_HBasis::HDIV_TET(order)); - FunDiv fun; - DivFunDiv funDiv; - DynRankView ConstructWithLabel(funAtRefCoords, numElems, numRefCoords, dim); - DynRankView ConstructWithLabel(funDivAtPhysRefCoords, numElems, numRefCoords); - for(ordinal_type i=0; i projStruct; - projStruct.createHDivProjectionStruct(&basis, targetCubDegree, targetDerivCubDegree); - - ordinal_type numPoints = projStruct.getNumTargetEvalPoints(), numDivPoints = projStruct.getNumTargetDerivEvalPoints(); + for (auto basisPtr:basis_set) { + auto& basis = *basisPtr; + *outStream << " " << basis.getName() << std::endl; ordinal_type basisCardinality = basis.getCardinality(); - DynRankView ConstructWithLabel(evaluationPoints, numElems, numPoints, dim); - DynRankView ConstructWithLabel(evaluationDivPoints, numElems, numDivPoints, dim); - - pts::getHDivEvaluationPoints(evaluationPoints, - evaluationDivPoints, - elemOrts, - &basis, - &projStruct); - - DynRankView ConstructWithLabel(targetAtEvalPoints, numElems, numPoints, dim); - DynRankView ConstructWithLabel(targetDivAtEvalPoints, numElems, numDivPoints); + //Compute physical Dof Coordinates and Reference coordinates + DynRankView ConstructWithLabel(physRefCoords, numElems, numRefCoords, dim); + DynRankView ConstructWithLabel(physDofCoords, numElems, basisCardinality, dim); + { + Basis_HGRAD_TET_C1_FEM tetLinearBasis; //used for computing physical coordinates + DynRankView ConstructWithLabel(tetLinearBasisValuesAtRefCoords, tet.getNodeCount(), numRefCoords); + tetLinearBasis.getValues(tetLinearBasisValuesAtRefCoords, refPoints); + for(ordinal_type i=0; i hexLinearBasis; //used for computing physical coordinates - DynRankView ConstructWithLabel(hexLinearBasisValuesAtEvalPoints, tet.getNodeCount(), numPoints); - DynRankView ConstructWithLabel(hexLinearBasisValuesAtEvalDivPoints, tet.getNodeCount(), numDivPoints); - - for(ordinal_type i=0; i projStruct; + projStruct.createHDivProjectionStruct(&basis, targetCubDegree, targetDerivCubDegree); + + ordinal_type numPoints = projStruct.getNumTargetEvalPoints(), numDivPoints = projStruct.getNumTargetDerivEvalPoints(); + + DynRankView ConstructWithLabel(evaluationPoints, numElems, numPoints, dim); + DynRankView ConstructWithLabel(evaluationDivPoints, numElems, numDivPoints, dim); + + pts::getHDivEvaluationPoints(evaluationPoints, + evaluationDivPoints, + elemOrts, + &basis, + &projStruct); + + DynRankView ConstructWithLabel(targetAtEvalPoints, numElems, numPoints, dim); + DynRankView ConstructWithLabel(targetDivAtEvalPoints, numElems, numDivPoints); + + + DynRankView ConstructWithLabel(physEvalPoints, numElems, numPoints, dim); + DynRankView ConstructWithLabel(physEvalDivPoints, numElems, numDivPoints, dim); + { + Basis_HGRAD_TET_C1_FEM hexLinearBasis; //used for computing physical coordinates + DynRankView ConstructWithLabel(hexLinearBasisValuesAtEvalPoints, tet.getNodeCount(), numPoints); + DynRankView ConstructWithLabel(hexLinearBasisValuesAtEvalDivPoints, tet.getNodeCount(), numDivPoints); + + for(ordinal_type i=0; i relTol){ - errorFlag++; - *outStream << std::setw(70) << "^^^^----FAILURE!" << "\n"; - *outStream << "For N = " << NX << ", computed error (" << hdivNorm[iter] << ") is different than expected one (" << expected_error << ")"; - *outStream << std::endl; + hdivNorm[iter] = std::sqrt(norm2); + auto expected_error = hdiv_errors[iter]; + if(std::abs(hdivNorm[iter]-expected_error)/expected_error > relTol){ + errorFlag++; + *outStream << std::setw(70) << "^^^^----FAILURE!" << "\n"; + *outStream << "For N = " << NX << ", computed error (" << hdivNorm[iter] << ") is different than expected one (" << expected_error << ")"; + *outStream << std::endl; + } + delete basisPtr; } *outStream << "HDIV Error: " << hdivNorm[iter] < elemOrts("elemOrts", numElems); ots::getOrientation(elemOrts, elemNodes, tet); - Basis_HVOL_TET_Cn_FEM basis(order-1); - ordinal_type basisCardinality = basis.getCardinality(); - - //Compute physical Dof Coordinates and Reference coordinates - DynRankView ConstructWithLabel(physRefCoords, numElems, numRefCoords, dim); - { - Basis_HGRAD_TET_C1_FEM tetLinearBasis; //used for computing physical coordinates - DynRankView ConstructWithLabel(tetLinearBasisValuesAtRefCoords, tet.getNodeCount(), numRefCoords); - tetLinearBasis.getValues(tetLinearBasisValuesAtRefCoords, refPoints); - for(ordinal_type i=0; i basis_set; + basis_set.push_back(new typename CG_NBasis::HVOL_TET(order-1)); + //basis_set.push_back(new typename CG_HBasis::HVOL_TET(order-1)); - //check function reproducibility - Fun fun; - DynRankView ConstructWithLabel(funAtRefCoords, numElems, numRefCoords); - for(ordinal_type i=0; i tetLinearBasis; //used for computing physical coordinates + DynRankView ConstructWithLabel(tetLinearBasisValuesAtRefCoords, tet.getNodeCount(), numRefCoords); + tetLinearBasis.getValues(tetLinearBasisValuesAtRefCoords, refPoints); + for(ordinal_type i=0; i projStruct; - projStruct.createHVolProjectionStruct(&basis, targetCubDegree); + // compute projection-based interpolation of fun into HVOL + DynRankView ConstructWithLabel(basisCoeffsHVol, numElems, basisCardinality); + { + ordinal_type targetCubDegree(basis.getDegree()); - ordinal_type numPoints = projStruct.getNumTargetEvalPoints(); + Experimental::ProjectionStruct projStruct; + projStruct.createHVolProjectionStruct(&basis, targetCubDegree); - DynRankView ConstructWithLabel(evaluationPoints, numElems, numPoints, dim); + ordinal_type numPoints = projStruct.getNumTargetEvalPoints(); - pts::getHVolEvaluationPoints(evaluationPoints, - elemOrts, - &basis, - &projStruct); + DynRankView ConstructWithLabel(evaluationPoints, numElems, numPoints, dim); - DynRankView ConstructWithLabel(targetAtEvalPoints, numElems, numPoints); + pts::getHVolEvaluationPoints(evaluationPoints, + elemOrts, + &basis, + &projStruct); + DynRankView ConstructWithLabel(targetAtEvalPoints, numElems, numPoints); - DynRankView ConstructWithLabel(physEvalPoints, numElems, numPoints, dim); - { - Basis_HGRAD_TET_C1_FEM hexLinearBasis; //used for computing physical coordinates - DynRankView ConstructWithLabel(hexLinearBasisValuesAtEvalPoints, tet.getNodeCount(), numPoints); - for(ordinal_type i=0; i hexLinearBasis; //used for computing physical coordinates + DynRankView ConstructWithLabel(hexLinearBasisValuesAtEvalPoints, tet.getNodeCount(), numPoints); + + for(ordinal_type i=0; i relTol){ - errorFlag++; - *outStream << std::setw(70) << "^^^^----FAILURE!" << "\n"; - *outStream << "For N = " << NX << ", computed error (" << hvolNorm[iter] << ") is different than expected one (" << expected_error << ")"; - *outStream << std::endl; + hvolNorm[iter] = std::sqrt(norm2); + auto expected_error = hvol_errors[iter]; + if(std::abs(hvolNorm[iter]-expected_error)/expected_error > relTol){ + errorFlag++; + *outStream << std::setw(70) << "^^^^----FAILURE!" << "\n"; + *outStream << "For N = " << NX << ", computed error (" << hvolNorm[iter] << ") is different than expected one (" << expected_error << ")"; + *outStream << std::endl; + } + delete basisPtr; } *outStream << "HVOL Error: " << hvolNorm[iter] <getCubature(refPoints, weights); - + using basisType = Basis; + using CG_NBasis = NodalBasisFamily; + using CG_HBasis = HierarchicalBasisFamily; + //using CG_DNBasis = DerivedNodalBasisFamily; *outStream @@ -355,180 +359,187 @@ int ConvergenceTri(const bool verbose) { Kokkos::DynRankView elemOrts("elemOrts", numElems); ots::getOrientation(elemOrts, elemNodes, tri); - Basis_HGRAD_TRI_Cn_FEM basis(order); - ordinal_type basisCardinality = basis.getCardinality(); - - //Compute physical Dof Coordinates and Reference coordinates - DynRankView ConstructWithLabel(physRefCoords, numElems, numRefCoords, dim); - { - Basis_HGRAD_TRI_C1_FEM triLinearBasis; //used for computing physical coordinates - DynRankView ConstructWithLabel(triLinearBasisValuesAtRefCoords, tri.getNodeCount(), numRefCoords); - triLinearBasis.getValues(triLinearBasisValuesAtRefCoords, refPoints); - for(ordinal_type i=0; i basis_set; + basis_set.push_back(new typename CG_NBasis::HGRAD_TRI(order)); + basis_set.push_back(new typename CG_HBasis::HGRAD_TRI(order)); + + for (auto basisPtr:basis_set) { + auto& basis = *basisPtr; + *outStream << " " << basis.getName() << std::endl; + ordinal_type basisCardinality = basis.getCardinality(); - Fun fun; - GradFun gradFun; - DynRankView ConstructWithLabel(funAtRefCoords, numElems, numRefCoords); - DynRankView ConstructWithLabel(funGradAtPhysRefCoords, numElems, numRefCoords, dim); - for(ordinal_type i=0; i triLinearBasis; //used for computing physical coordinates + DynRankView ConstructWithLabel(triLinearBasisValuesAtRefCoords, tri.getNodeCount(), numRefCoords); + triLinearBasis.getValues(triLinearBasisValuesAtRefCoords, refPoints); + for(ordinal_type i=0; i projStruct; - projStruct.createHGradProjectionStruct(&basis, targetCubDegree, targetDerivCubDegree); + Experimental::ProjectionStruct projStruct; + projStruct.createHGradProjectionStruct(&basis, targetCubDegree, targetDerivCubDegree); - ordinal_type numPoints = projStruct.getNumTargetEvalPoints(), numGradPoints = projStruct.getNumTargetDerivEvalPoints(); + ordinal_type numPoints = projStruct.getNumTargetEvalPoints(), numGradPoints = projStruct.getNumTargetDerivEvalPoints(); - DynRankView ConstructWithLabel(evaluationPoints, numElems, numPoints, dim); - DynRankView ConstructWithLabel(evaluationGradPoints, numElems, numGradPoints, dim); + DynRankView ConstructWithLabel(evaluationPoints, numElems, numPoints, dim); + DynRankView ConstructWithLabel(evaluationGradPoints, numElems, numGradPoints, dim); - pts::getHGradEvaluationPoints(evaluationPoints, - evaluationGradPoints, - elemOrts, - &basis, - &projStruct); + pts::getHGradEvaluationPoints(evaluationPoints, + evaluationGradPoints, + elemOrts, + &basis, + &projStruct); - DynRankView ConstructWithLabel(targetAtEvalPoints, numElems, numPoints); - DynRankView ConstructWithLabel(targetGradAtEvalPoints, numElems, numGradPoints, dim); + DynRankView ConstructWithLabel(targetAtEvalPoints, numElems, numPoints); + DynRankView ConstructWithLabel(targetGradAtEvalPoints, numElems, numGradPoints, dim); - DynRankView ConstructWithLabel(physEvalPoints, numElems, numPoints, dim); - DynRankView ConstructWithLabel(physEvalGradPoints, numElems, numGradPoints, dim); - { - Basis_HGRAD_TRI_C1_FEM triLinearBasis; //used for computing physical coordinates - DynRankView ConstructWithLabel(triLinearBasisValuesAtEvalPoints, tri.getNodeCount(), numPoints); - DynRankView ConstructWithLabel(triLinearBasisValuesAtEvalGradPoints, tri.getNodeCount(), numGradPoints); + DynRankView ConstructWithLabel(physEvalPoints, numElems, numPoints, dim); + DynRankView ConstructWithLabel(physEvalGradPoints, numElems, numGradPoints, dim); + { + Basis_HGRAD_TRI_C1_FEM triLinearBasis; //used for computing physical coordinates + DynRankView ConstructWithLabel(triLinearBasisValuesAtEvalPoints, tri.getNodeCount(), numPoints); + DynRankView ConstructWithLabel(triLinearBasisValuesAtEvalGradPoints, tri.getNodeCount(), numGradPoints); - for(ordinal_type i=0; i0) - triLinearBasis.getValues(triLinearBasisValuesAtEvalGradPoints, Kokkos::subview(evaluationGradPoints,i,Kokkos::ALL(),Kokkos::ALL())); - for(ordinal_type d=0; d0) + triLinearBasis.getValues(triLinearBasisValuesAtEvalGradPoints, Kokkos::subview(evaluationGradPoints,i,Kokkos::ALL(),Kokkos::ALL())); + for(ordinal_type d=0; d0) - ct::setJacobian(jacobian, evaluationGradPoints, physVertexes, tri); + //transform the target function and its derivative to the reference element (inverse of pullback operator) + DynRankView ConstructWithLabel(jacobian, numElems, numGradPoints, dim, dim); + if(numGradPoints>0) + ct::setJacobian(jacobian, evaluationGradPoints, physVertexes, tri); + + GradFun gradFun; + Kokkos::deep_copy(targetGradAtEvalPoints,0.); + for(int ic=0; ic relTol){ - errorFlag++; - *outStream << std::setw(70) << "^^^^----FAILURE!" << "\n"; - *outStream << "For N = " << NX << ", computed error (" << hgradNorm[iter] << ") is different than expected one (" << expected_error << ")"; - *outStream << std::endl; + hgradNorm[iter] = std::sqrt(norm2); + auto expected_error = hgrad_errors[iter]; + if(std::abs(hgradNorm[iter]-expected_error)/expected_error > relTol){ + errorFlag++; + *outStream << std::setw(70) << "^^^^----FAILURE!" << "\n"; + *outStream << "For N = " << NX << ", computed error (" << hgradNorm[iter] << ") is different than expected one (" << expected_error << ")"; + *outStream << std::endl; + } + delete basisPtr; } *outStream << "HGRAD Error: " << hgradNorm[iter] < elemOrts("elemOrts", numElems); ots::getOrientation(elemOrts, elemNodes, tri); - Basis_HCURL_TRI_In_FEM basis(order); - ordinal_type basisCardinality = basis.getCardinality(); - - //Compute physical Dof Coordinates and Reference coordinates - DynRankView ConstructWithLabel(physRefCoords, numElems, numRefCoords, dim); - { - Basis_HGRAD_TRI_C1_FEM triLinearBasis; //used for computing physical coordinates - DynRankView ConstructWithLabel(triLinearBasisValuesAtRefCoords, tri.getNodeCount(), numRefCoords); - triLinearBasis.getValues(triLinearBasisValuesAtRefCoords, refPoints); - for(ordinal_type i=0; i projStruct; - projStruct.createHCurlProjectionStruct(&basis, targetCubDegree, targetDerivCubDegree); - - ordinal_type numPoints = projStruct.getNumTargetEvalPoints(), numCurlPoints = projStruct.getNumTargetDerivEvalPoints(); - DynRankView ConstructWithLabel(evaluationPoints, numElems, numPoints, dim); - DynRankView ConstructWithLabel(evaluationCurlPoints, numElems, numCurlPoints, dim); - pts::getHCurlEvaluationPoints(evaluationPoints, - evaluationCurlPoints, - elemOrts, - &basis, - &projStruct); + std::vector basis_set; + basis_set.push_back(new typename CG_NBasis::HCURL_TRI(order)); + //basis_set.push_back(new typename CG_HBasis::HCURL_TRI(order)); + for (auto basisPtr:basis_set) { + auto& basis = *basisPtr; + *outStream << " " << basis.getName() << std::endl; + ordinal_type basisCardinality = basis.getCardinality(); - DynRankView ConstructWithLabel(targetAtEvalPoints, numElems, numPoints, dim); - DynRankView ConstructWithLabel(targetCurlAtEvalPoints, numElems, numCurlPoints); - - - DynRankView ConstructWithLabel(physEvalPoints, numElems, numPoints, dim); - DynRankView ConstructWithLabel(physEvalCurlPoints, numElems, numCurlPoints, dim); + //Compute physical Dof Coordinates and Reference coordinates + DynRankView ConstructWithLabel(physRefCoords, numElems, numRefCoords, dim); { Basis_HGRAD_TRI_C1_FEM triLinearBasis; //used for computing physical coordinates - DynRankView ConstructWithLabel(triLinearBasisValuesAtEvalPoints, tri.getNodeCount(), numPoints); - DynRankView ConstructWithLabel(triLinearBasisValuesAtEvalCurlPoints, tri.getNodeCount(), numCurlPoints); - - for(ordinal_type i=0; i projStruct; + projStruct.createHCurlProjectionStruct(&basis, targetCubDegree, targetDerivCubDegree); + + ordinal_type numPoints = projStruct.getNumTargetEvalPoints(), numCurlPoints = projStruct.getNumTargetDerivEvalPoints(); + DynRankView ConstructWithLabel(evaluationPoints, numElems, numPoints, dim); + DynRankView ConstructWithLabel(evaluationCurlPoints, numElems, numCurlPoints, dim); + pts::getHCurlEvaluationPoints(evaluationPoints, + evaluationCurlPoints, + elemOrts, + &basis, + &projStruct); + + + DynRankView ConstructWithLabel(targetAtEvalPoints, numElems, numPoints, dim); + DynRankView ConstructWithLabel(targetCurlAtEvalPoints, numElems, numCurlPoints); + + + DynRankView ConstructWithLabel(physEvalPoints, numElems, numPoints, dim); + DynRankView ConstructWithLabel(physEvalCurlPoints, numElems, numCurlPoints, dim); + { + Basis_HGRAD_TRI_C1_FEM triLinearBasis; //used for computing physical coordinates + DynRankView ConstructWithLabel(triLinearBasisValuesAtEvalPoints, tri.getNodeCount(), numPoints); + DynRankView ConstructWithLabel(triLinearBasisValuesAtEvalCurlPoints, tri.getNodeCount(), numCurlPoints); + + for(ordinal_type i=0; i relTol){ - errorFlag++; - *outStream << std::setw(70) << "^^^^----FAILURE!" << "\n"; - *outStream << "For N = " << NX << ", computed error (" << hcurlNorm[iter] << ") is different than expected one (" << expected_error << ")"; - *outStream << std::endl; + hcurlNorm[iter] = std::sqrt(norm2); + auto expected_error = hcurl_errors[iter]; + if(std::abs(hcurlNorm[iter]-expected_error)/expected_error > relTol){ + errorFlag++; + *outStream << std::setw(70) << "^^^^----FAILURE!" << "\n"; + *outStream << "For N = " << NX << ", computed error (" << hcurlNorm[iter] << ") is different than expected one (" << expected_error << ")"; + *outStream << std::endl; + } + delete basisPtr; } *outStream << "HCURL Error: " << hcurlNorm[iter] < elemOrts("elemOrts", numElems); ots::getOrientation(elemOrts, elemNodes, tri); - Basis_HDIV_TRI_In_FEM basis(order); - ordinal_type basisCardinality = basis.getCardinality(); - - //Compute physical Dof Coordinates and Reference coordinates - DynRankView ConstructWithLabel(physRefCoords, numElems, numRefCoords, dim); - DynRankView ConstructWithLabel(physDofCoords, numElems, basisCardinality, dim); - { - Basis_HGRAD_TRI_C1_FEM triLinearBasis; //used for computing physical coordinates - DynRankView ConstructWithLabel(triLinearBasisValuesAtRefCoords, tri.getNodeCount(), numRefCoords); - triLinearBasis.getValues(triLinearBasisValuesAtRefCoords, refPoints); - for(ordinal_type i=0; i basis_set; + basis_set.push_back(new typename CG_NBasis::HDIV_TRI(order)); + //basis_set.push_back(new typename CG_HBasis::HDIV_TRI(order)); - Experimental::ProjectionStruct projStruct; - projStruct.createHDivProjectionStruct(&basis, targetCubDegree, targetDerivCubDegree); + for (auto basisPtr:basis_set) { + auto& basis = *basisPtr; + *outStream << " " << basis.getName() << std::endl; + ordinal_type basisCardinality = basis.getCardinality(); - ordinal_type numPoints = projStruct.getNumTargetEvalPoints(), numDivPoints = projStruct.getNumTargetDerivEvalPoints(); - - DynRankView ConstructWithLabel(evaluationPoints, numElems, numPoints, dim); - DynRankView ConstructWithLabel(evaluationDivPoints, numElems, numDivPoints, dim); - - pts::getHDivEvaluationPoints(evaluationPoints, - evaluationDivPoints, - elemOrts, - &basis, - &projStruct); - - DynRankView ConstructWithLabel(targetAtEvalPoints, numElems, numPoints, dim); - DynRankView ConstructWithLabel(targetDivAtEvalPoints, numElems, numDivPoints); - - - DynRankView ConstructWithLabel(physEvalPoints, numElems, numPoints, dim); - DynRankView ConstructWithLabel(physEvalDivPoints, numElems, numDivPoints, dim); + //Compute physical Dof Coordinates and Reference coordinates + DynRankView ConstructWithLabel(physRefCoords, numElems, numRefCoords, dim); + DynRankView ConstructWithLabel(physDofCoords, numElems, basisCardinality, dim); { Basis_HGRAD_TRI_C1_FEM triLinearBasis; //used for computing physical coordinates - DynRankView ConstructWithLabel(triLinearBasisValuesAtEvalPoints, tri.getNodeCount(), numPoints); - DynRankView ConstructWithLabel(triLinearBasisValuesAtEvalDivPoints, tri.getNodeCount(), numDivPoints); + DynRankView ConstructWithLabel(triLinearBasisValuesAtRefCoords, tri.getNodeCount(), numRefCoords); + triLinearBasis.getValues(triLinearBasisValuesAtRefCoords, refPoints); + for(ordinal_type i=0; i projStruct; + projStruct.createHDivProjectionStruct(&basis, targetCubDegree, targetDerivCubDegree); + + ordinal_type numPoints = projStruct.getNumTargetEvalPoints(), numDivPoints = projStruct.getNumTargetDerivEvalPoints(); + + DynRankView ConstructWithLabel(evaluationPoints, numElems, numPoints, dim); + DynRankView ConstructWithLabel(evaluationDivPoints, numElems, numDivPoints, dim); + + pts::getHDivEvaluationPoints(evaluationPoints, + evaluationDivPoints, + elemOrts, + &basis, + &projStruct); + + DynRankView ConstructWithLabel(targetAtEvalPoints, numElems, numPoints, dim); + DynRankView ConstructWithLabel(targetDivAtEvalPoints, numElems, numDivPoints); + + + DynRankView ConstructWithLabel(physEvalPoints, numElems, numPoints, dim); + DynRankView ConstructWithLabel(physEvalDivPoints, numElems, numDivPoints, dim); + { + Basis_HGRAD_TRI_C1_FEM triLinearBasis; //used for computing physical coordinates + DynRankView ConstructWithLabel(triLinearBasisValuesAtEvalPoints, tri.getNodeCount(), numPoints); + DynRankView ConstructWithLabel(triLinearBasisValuesAtEvalDivPoints, tri.getNodeCount(), numDivPoints); + + for(ordinal_type i=0; i relTol){ - errorFlag++; - *outStream << std::setw(70) << "^^^^----FAILURE!" << "\n"; - *outStream << "For N = " << NX << ", computed error (" << hdivNorm[iter] << ") is different than expected one (" << expected_error << ")"; - *outStream << std::endl; + hdivNorm[iter] = std::sqrt(norm2); + auto expected_error = hdiv_errors[iter]; + if(std::abs(hdivNorm[iter]-expected_error)/expected_error > relTol){ + errorFlag++; + *outStream << std::setw(70) << "^^^^----FAILURE!" << "\n"; + *outStream << "For N = " << NX << ", computed error (" << hdivNorm[iter] << ") is different than expected one (" << expected_error << ")"; + *outStream << std::endl; + } + delete basisPtr; } *outStream << "HDIV Error: " << hdivNorm[iter] < elemOrts("elemOrts", numElems); ots::getOrientation(elemOrts, elemNodes, tri); - Basis_HVOL_TRI_Cn_FEM basis(order-1); - ordinal_type basisCardinality = basis.getCardinality(); - - //Compute physical Dof Coordinates and Reference coordinates - DynRankView ConstructWithLabel(physRefCoords, numElems, numRefCoords, dim); - { - Basis_HGRAD_TRI_C1_FEM triLinearBasis; //used for computing physical coordinates - DynRankView ConstructWithLabel(triLinearBasisValuesAtRefCoords, tri.getNodeCount(), numRefCoords); - triLinearBasis.getValues(triLinearBasisValuesAtRefCoords, refPoints); - for(ordinal_type i=0; i basis_set; + basis_set.push_back(new typename CG_NBasis::HVOL_TRI(order-1)); + //basis_set.push_back(new typename CG_HBasis::HVOL_TRI(order-1)); - //check function reproducibility - Fun fun; - DynRankView ConstructWithLabel(funAtRefCoords, numElems, numRefCoords); - for(ordinal_type i=0; i triLinearBasis; //used for computing physical coordinates + DynRankView ConstructWithLabel(triLinearBasisValuesAtRefCoords, tri.getNodeCount(), numRefCoords); + triLinearBasis.getValues(triLinearBasisValuesAtRefCoords, refPoints); + for(ordinal_type i=0; i projStruct; - projStruct.createHVolProjectionStruct(&basis, targetCubDegree); + // compute projection-based interpolation of fun into HVOL + DynRankView ConstructWithLabel(basisCoeffsHVol, numElems, basisCardinality); + { + ordinal_type targetCubDegree(basis.getDegree()); - ordinal_type numPoints = projStruct.getNumTargetEvalPoints(); + Experimental::ProjectionStruct projStruct; + projStruct.createHVolProjectionStruct(&basis, targetCubDegree); - DynRankView ConstructWithLabel(evaluationPoints, numElems, numPoints, dim); + ordinal_type numPoints = projStruct.getNumTargetEvalPoints(); - pts::getHVolEvaluationPoints(evaluationPoints, - elemOrts, - &basis, - &projStruct); + DynRankView ConstructWithLabel(evaluationPoints, numElems, numPoints, dim); - DynRankView ConstructWithLabel(targetAtEvalPoints, numElems, numPoints); + pts::getHVolEvaluationPoints(evaluationPoints, + elemOrts, + &basis, + &projStruct); + DynRankView ConstructWithLabel(targetAtEvalPoints, numElems, numPoints); - DynRankView ConstructWithLabel(physEvalPoints, numElems, numPoints, dim); - { - Basis_HGRAD_TRI_C1_FEM triLinearBasis; //used for computing physical coordinates - DynRankView ConstructWithLabel(triLinearBasisValuesAtEvalPoints, tri.getNodeCount(), numPoints); - for(ordinal_type i=0; i triLinearBasis; //used for computing physical coordinates + DynRankView ConstructWithLabel(triLinearBasisValuesAtEvalPoints, tri.getNodeCount(), numPoints); + + for(ordinal_type i=0; i relTol){ - errorFlag++; - *outStream << std::setw(70) << "^^^^----FAILURE!" << "\n"; - *outStream << "For N = " << NX << ", computed error (" << hvolNorm[iter] << ") is different than expected one (" << expected_error << ")"; - *outStream << std::endl; + hvolNorm[iter] = std::sqrt(norm2); + auto expected_error = hvol_errors[iter]; + if(std::abs(hvolNorm[iter]-expected_error)/expected_error > relTol){ + errorFlag++; + *outStream << std::setw(70) << "^^^^----FAILURE!" << "\n"; + *outStream << "For N = " << NX << ", computed error (" << hvolNorm[iter] << ") is different than expected one (" << expected_error << ")"; + *outStream << std::endl; + } + delete basisPtr; } *outStream << "HVOL Error: " << hvolNorm[iter] < pow(16, degree)*tol) { //heuristic relation on how round-off error depends on degree + if(diffErr > pow(20, degree)*tol) { //heuristic relation on how round-off error depends on degree errorFlag++; *outStream << std::setw(70) << "^^^^----FAILURE!" << "\n"; - *outStream << "HGRAD_C" << degree << ": The weights recovered with the optimization are different than the one used for generating the functon."<< + *outStream << "HVOL_C" << degree << ": The weights recovered with the optimization are different than the one used for generating the functon."<< "\nThe max The infinite norm of the difference between the weights is: " << diffErr << std::endl; } } @@ -1854,14 +1846,13 @@ int InterpolationProjectionHex(const bool verbose) { diffErr = std::max(diffErr, std::abs(basisCoeffsLI(ic,k) - basisCoeffsL2(ic,k))); } - if(diffErr > pow(16, degree)*tol) { //heuristic relation on how round-off error depends on degree + if(diffErr > pow(20, degree)*tol) { //heuristic relation on how round-off error depends on degree errorFlag++; *outStream << std::setw(70) << "^^^^----FAILURE!" << "\n"; - *outStream << "HGRAD_C" << degree << ": The weights recovered with the L2 optimization are different than the one used for generating the functon."<< + *outStream << "HVOL_C" << degree << ": The weights recovered with the L2 optimization are different than the one used for generating the functon."<< "\nThe max The infinite norm of the difference between the weights is: " << diffErr << std::endl; } } -#endif } } catch (std::exception &err) { std::cout << " Exeption\n"; diff --git a/packages/intrepid2/unit-test/Projection/test_interpolation_projection_QUAD.hpp b/packages/intrepid2/unit-test/Projection/test_interpolation_projection_QUAD.hpp index 03feda807ac6..db39efba259c 100644 --- a/packages/intrepid2/unit-test/Projection/test_interpolation_projection_QUAD.hpp +++ b/packages/intrepid2/unit-test/Projection/test_interpolation_projection_QUAD.hpp @@ -428,7 +428,6 @@ int InterpolationProjectionQuad(const bool verbose) { } -#ifndef KOKKOS_ENABLE_CUDA //compute projection-based interpolation of the Lagrangian interpolation DynRankView ConstructWithLabel(basisCoeffsHGrad, numCells, basisCardinality); { @@ -570,7 +569,6 @@ int InterpolationProjectionQuad(const bool verbose) { "\nThe max The infinite norm of the difference between the weights is: " << diffErr << std::endl; } } -#endif } } } while(std::next_permutation(&reorder[0]+1, &reorder[0]+4)); //reorder vertices of common face @@ -818,7 +816,6 @@ int InterpolationProjectionQuad(const bool verbose) { } } -#ifndef KOKKOS_ENABLE_CUDA //compute projection-based interpolation of the Lagrangian interpolation DynRankView ConstructWithLabel(basisCoeffsHCurl, numCells, basisCardinality); { @@ -959,7 +956,6 @@ int InterpolationProjectionQuad(const bool verbose) { "\nThe max The infinite norm of the difference between the weights is: " << diffErr << std::endl; } } -#endif } } } while(std::next_permutation(&reorder[0]+1, &reorder[0]+4)); //reorder vertices of common face @@ -1213,7 +1209,6 @@ int InterpolationProjectionQuad(const bool verbose) { } } -#ifndef KOKKOS_ENABLE_CUDA //compute projection-based interpolation of the Lagrangian interpolation DynRankView ConstructWithLabel(basisCoeffsHDiv, numCells, basisCardinality); { @@ -1357,7 +1352,6 @@ int InterpolationProjectionQuad(const bool verbose) { "\nThe max The infinite norm of the difference between the weights is: " << diffErr << std::endl; } } -#endif } } } while(std::next_permutation(&reorder[0]+1, &reorder[0]+4)); //reorder vertices of common face @@ -1546,7 +1540,6 @@ int InterpolationProjectionQuad(const bool verbose) { } } -#ifndef KOKKOS_ENABLE_CUDA //compute projection-based interpolation of the Lagrangian interpolation DynRankView ConstructWithLabel(basisCoeffsHVol, numCells, basisCardinality); { @@ -1602,7 +1595,7 @@ int InterpolationProjectionQuad(const bool verbose) { if(diffErr > pow(16, degree)*tol) { //heuristic relation on how round-off error depends on degree errorFlag++; *outStream << std::setw(70) << "^^^^----FAILURE!" << "\n"; - *outStream << "HGRAD_C" << degree << ": The weights recovered with the optimization are different than the one used for generating the functon."<< + *outStream << "HVOL_C" << degree << ": The weights recovered with the optimization are different than the one used for generating the functon."<< "\nThe max The infinite norm of the difference between the weights is: " << diffErr << std::endl; } } @@ -1662,11 +1655,10 @@ int InterpolationProjectionQuad(const bool verbose) { if(diffErr > pow(16, degree)*tol) { //heuristic relation on how round-off error depends on degree errorFlag++; *outStream << std::setw(70) << "^^^^----FAILURE!" << "\n"; - *outStream << "HGRAD_C" << degree << ": The weights recovered with the L2 optimization are different than the one used for generating the functon."<< + *outStream << "HVOL_C" << degree << ": The weights recovered with the L2 optimization are different than the one used for generating the functon."<< "\nThe max The infinite norm of the difference between the weights is: " << diffErr << std::endl; } } -#endif } } catch (std::exception &err) { std::cout << " Exeption\n"; diff --git a/packages/intrepid2/unit-test/Projection/test_interpolation_projection_TET.hpp b/packages/intrepid2/unit-test/Projection/test_interpolation_projection_TET.hpp index 9ebcb34e3584..3e6dcb801508 100644 --- a/packages/intrepid2/unit-test/Projection/test_interpolation_projection_TET.hpp +++ b/packages/intrepid2/unit-test/Projection/test_interpolation_projection_TET.hpp @@ -322,13 +322,7 @@ int InterpolationProjectionTet(const bool verbose) { //compute Lagrangian Interpolation of fun { li::getDofCoordsAndCoeffs(dofCoordsOriented, dofCoeffsPhys, basisPtr.get(), POINTTYPE_EQUISPACED, elemOrts); - Kokkos::fence(); - *outStream << "\n\nFunction DOFs for Tet 0 are:"; - for(ordinal_type j=0;j tetLinearBasis; //used for computing physical coordinates @@ -431,14 +425,14 @@ int InterpolationProjectionTet(const bool verbose) { { errorFlag++; *outStream << std::setw(70) << "^^^^----FAILURE!" << "\n"; - //*outStream << "Function DOFs on common edge " << iEdge << " computed using Tet 0 basis functions are not consistent with those computed using Tet 1\n"; - //*outStream << "Function DOFs for Tet 0 are:"; - //for(ordinal_type j=0;jgetDofOrdinal(1,edgeIndexes[0][iEdge],j)); - //*outStream << "\nFunction DOFs for Tet 1 are:"; - //for(ordinal_type j=0;jgetDofOrdinal(1,edgeIndexes[1][iEdge],j)); - //*outStream << std::endl; + *outStream << "Function DOFs on common edge " << iEdge << " computed using Tet 0 basis functions are not consistent with those computed using Tet 1\n"; + *outStream << "Function DOFs for Tet 0 are:"; + for(ordinal_type j=0;jgetDofOrdinal(1,edgeIndexes[0][iEdge],j)); + *outStream << "\nFunction DOFs for Tet 1 are:"; + for(ordinal_type j=0;jgetDofOrdinal(1,edgeIndexes[1][iEdge],j)); + *outStream << std::endl; } } } @@ -486,8 +480,6 @@ int InterpolationProjectionTet(const bool verbose) { } } - -#ifndef KOKKOS_ENABLE_CUDA //compute projection-based interpolation of the Lagrangian interpolation DynRankView ConstructWithLabel(basisCoeffsHGrad, numCells, basisCardinality); { @@ -629,7 +621,6 @@ int InterpolationProjectionTet(const bool verbose) { "\nThe max The infinite norm of the difference between the weights is: " << diffErr << std::endl; } } -#endif } } } while(std::next_permutation(&reorder[0]+1, &reorder[0]+4)); //reorder vertices of common face @@ -924,7 +915,7 @@ int InterpolationProjectionTet(const bool verbose) { } } -#ifndef KOKKOS_ENABLE_CUDA + //compute projection-based interpolation of the Lagrangian interpolation DynRankView ConstructWithLabel(basisCoeffsHCurl, numCells, basisCardinality); { @@ -1067,7 +1058,6 @@ int InterpolationProjectionTet(const bool verbose) { "\nThe max The infinite norm of the difference between the weights is: " << diffErr << std::endl; } } -#endif } } } while(std::next_permutation(&reorder[0]+1, &reorder[0]+4)); //reorder vertices of common face @@ -1348,7 +1338,6 @@ int InterpolationProjectionTet(const bool verbose) { } } -#ifndef KOKKOS_ENABLE_CUDA //compute projection-based interpolation of the Lagrangian interpolation DynRankView ConstructWithLabel(basisCoeffsHDiv, numCells, basisCardinality); { @@ -1493,7 +1482,6 @@ int InterpolationProjectionTet(const bool verbose) { "\nThe max The infinite norm of the difference between the weights is: " << diffErr << std::endl; } } -#endif } } } while(std::next_permutation(&reorder[0]+1, &reorder[0]+4)); //reorder vertices of common face @@ -1686,7 +1674,6 @@ int InterpolationProjectionTet(const bool verbose) { } } -#ifndef KOKKOS_ENABLE_CUDA //compute projection-based interpolation of the Lagrangian interpolation DynRankView ConstructWithLabel(basisCoeffsHVol, numCells, basisCardinality); { @@ -1743,7 +1730,7 @@ int InterpolationProjectionTet(const bool verbose) { if(diffErr > pow(7, degree-1)*tol) { //heuristic relation on how round-off error depends on degree errorFlag++; *outStream << std::setw(70) << "^^^^----FAILURE!" << "\n"; - *outStream << "HGRAD_C" << degree << ": The weights recovered with the optimization are different than the one used for generating the functon."<< + *outStream << "HVOL_C" << degree << ": The weights recovered with the optimization are different than the one used for generating the functon."<< "\nThe max The infinite norm of the difference between the weights is: " << diffErr << std::endl; } } @@ -1803,11 +1790,10 @@ int InterpolationProjectionTet(const bool verbose) { if(diffErr > pow(7, degree-1)*tol) { //heuristic relation on how round-off error depends on degree errorFlag++; *outStream << std::setw(70) << "^^^^----FAILURE!" << "\n"; - *outStream << "HGRAD_C" << degree << ": The weights recovered with the L2 optimization are different than the one used for generating the functon."<< + *outStream << "HVOL_C" << degree << ": The weights recovered with the L2 optimization are different than the one used for generating the functon."<< "\nThe max The infinite norm of the difference between the weights is: " << diffErr << std::endl; } } -#endif } } catch (std::exception &err) { std::cout << " Exeption\n"; diff --git a/packages/intrepid2/unit-test/Projection/test_interpolation_projection_TRI.hpp b/packages/intrepid2/unit-test/Projection/test_interpolation_projection_TRI.hpp index d3254e5db1f3..321b42dd2f58 100644 --- a/packages/intrepid2/unit-test/Projection/test_interpolation_projection_TRI.hpp +++ b/packages/intrepid2/unit-test/Projection/test_interpolation_projection_TRI.hpp @@ -428,7 +428,6 @@ int InterpolationProjectionTri(const bool verbose) { } } -#ifndef KOKKOS_ENABLE_CUDA //compute projection-based interpolation of the Lagrangian interpolation DynRankView ConstructWithLabel(basisCoeffsHGrad, numCells, basisCardinality); { @@ -570,7 +569,6 @@ int InterpolationProjectionTri(const bool verbose) { "\nThe max The infinite norm of the difference between the weights is: " << diffErr << std::endl; } } -#endif } } } while(std::next_permutation(&reorder[0]+1, &reorder[0]+4)); //reorder vertices of common face @@ -816,7 +814,6 @@ int InterpolationProjectionTri(const bool verbose) { } } -#ifndef KOKKOS_ENABLE_CUDA //compute projection-based interpolation of the Lagrangian interpolation DynRankView ConstructWithLabel(basisCoeffsHCurl, numCells, basisCardinality); { @@ -957,7 +954,6 @@ int InterpolationProjectionTri(const bool verbose) { "\nThe max The infinite norm of the difference between the weights is: " << diffErr << std::endl; } } -#endif } } } while(std::next_permutation(&reorder[0]+1, &reorder[0]+4)); //reorder vertices of common face @@ -1210,7 +1206,6 @@ int InterpolationProjectionTri(const bool verbose) { } } -#ifndef KOKKOS_ENABLE_CUDA //compute projection-based interpolation of the Lagrangian interpolation DynRankView ConstructWithLabel(basisCoeffsHDiv, numCells, basisCardinality); { @@ -1354,7 +1349,6 @@ int InterpolationProjectionTri(const bool verbose) { "\nThe max The infinite norm of the difference between the weights is: " << diffErr << std::endl; } } -#endif } } } while(std::next_permutation(&reorder[0]+1, &reorder[0]+4)); //reorder vertices of common face @@ -1545,7 +1539,6 @@ int InterpolationProjectionTri(const bool verbose) { } } -#ifndef KOKKOS_ENABLE_CUDA //compute projection-based interpolation of the Lagrangian interpolation DynRankView ConstructWithLabel(basisCoeffsHVol, numCells, basisCardinality); { @@ -1601,7 +1594,7 @@ int InterpolationProjectionTri(const bool verbose) { if(diffErr > pow(16, degree)*tol) { //heuristic relation on how round-off error depends on degree errorFlag++; *outStream << std::setw(70) << "^^^^----FAILURE!" << "\n"; - *outStream << "HGRAD_C" << degree << ": The weights recovered with the optimization are different than the one used for generating the functon."<< + *outStream << "HVOL_C" << degree << ": The weights recovered with the optimization are different than the one used for generating the functon."<< "\nThe max The infinite norm of the difference between the weights is: " << diffErr << std::endl; } } @@ -1661,11 +1654,10 @@ int InterpolationProjectionTri(const bool verbose) { if(diffErr > pow(16, degree)*tol) { //heuristic relation on how round-off error depends on degree errorFlag++; *outStream << std::setw(70) << "^^^^----FAILURE!" << "\n"; - *outStream << "HGRAD_C" << degree << ": The weights recovered with the L2 optimization are different than the one used for generating the functon."<< + *outStream << "HVOL_C" << degree << ": The weights recovered with the L2 optimization are different than the one used for generating the functon."<< "\nThe max The infinite norm of the difference between the weights is: " << diffErr << std::endl; } } -#endif } } catch (std::exception &err) { std::cout << " Exeption\n"; diff --git a/packages/minitensor/src/MiniTensor_LinearAlgebra.t.h b/packages/minitensor/src/MiniTensor_LinearAlgebra.t.h index dc6fd09325ee..85d14a5e164d 100644 --- a/packages/minitensor/src/MiniTensor_LinearAlgebra.t.h +++ b/packages/minitensor/src/MiniTensor_LinearAlgebra.t.h @@ -837,8 +837,9 @@ log_rotation(Tensor const & R) //firewalls, make sure R \in SO(N) assert(norm(dot_t(R,R) - eye(dimension)) < - 100.0 * machine_epsilon()); - assert(std::abs(det(R) - 1.0) < 100.0 * machine_epsilon()); + std::max(1.0e-12 * norm(R), 1.0e-12)); + assert(std::abs(det(R) - 1.0) < + std::max(1.0e-12 * norm(R), 1.0e-12)); // acos requires input between -1 and +1 T cosine = 0.5 * (trace(R) - 1.0); @@ -1054,7 +1055,7 @@ Tensor exp_skew_symmetric(Tensor const & r) { // Check whether skew-symmetry holds - assert(norm(sym(r)) < machine_epsilon()); + assert(norm(sym(r)) < std::max(1.0e-12 * norm(r), 1.0e-12)); Index const dimension = r.get_dimension(); diff --git a/packages/muelu/adapters/xpetra/MueLu_RefMaxwell_decl.hpp b/packages/muelu/adapters/xpetra/MueLu_RefMaxwell_decl.hpp index 3a22591f61cd..98a53a002a16 100644 --- a/packages/muelu/adapters/xpetra/MueLu_RefMaxwell_decl.hpp +++ b/packages/muelu/adapters/xpetra/MueLu_RefMaxwell_decl.hpp @@ -389,6 +389,15 @@ namespace MueLu { //! dump out real-valued multivector void dumpCoords(const RealValuedMultiVector& X, std::string name) const; + //! dump out boolean ArrayView + void dump(const Teuchos::ArrayRCP& v, std::string name) const; + +#ifdef HAVE_MUELU_KOKKOS_REFACTOR + //! dump out boolean Kokkos::View + void dump(const Kokkos::View& v, std::string name) const; +#endif + + //! get a (synced) timer Teuchos::RCP getTimer(std::string name, RCP > comm=Teuchos::null) const; //! set parameters @@ -413,12 +422,10 @@ namespace MueLu { Teuchos::RCP A_nodal_Matrix_, P11_, R11_, AH_, A22_, Addon_Matrix_; //! Vectors for BCs #ifdef HAVE_MUELU_KOKKOS_REFACTOR - Kokkos::View BCrowsKokkos_; - Kokkos::View BCcolsKokkos_; + Kokkos::View BCrowsKokkos_, BCcolsKokkos_, BCdomainKokkos_; #endif - int BCrowcount_, BCcolcount_; - Teuchos::ArrayRCP BCrows_; - Teuchos::ArrayRCP BCcols_; + int BCedges_, BCnodes_; + Teuchos::ArrayRCP BCrows_, BCcols_, BCdomain_; //! Nullspace Teuchos::RCP Nullspace_; //! Coordinates diff --git a/packages/muelu/adapters/xpetra/MueLu_RefMaxwell_def.hpp b/packages/muelu/adapters/xpetra/MueLu_RefMaxwell_def.hpp index 7faeb69df280..161c0a7935af 100644 --- a/packages/muelu/adapters/xpetra/MueLu_RefMaxwell_def.hpp +++ b/packages/muelu/adapters/xpetra/MueLu_RefMaxwell_def.hpp @@ -105,6 +105,120 @@ namespace MueLu { + template + void FindNonZeros(const Teuchos::ArrayRCP vals, + Teuchos::ArrayRCP nonzeros) { + TEUCHOS_ASSERT(vals.size() == nonzeros.size()); + typedef typename Teuchos::ScalarTraits::magnitudeType magnitudeType; + const magnitudeType eps = 2.0*Teuchos::ScalarTraits::eps(); + for(size_t i=0; i(vals.size()); i++) { + nonzeros[i] = (Teuchos::ScalarTraits::magnitude(vals[i]) > eps); + } + } + + + template + void DetectDirichletCols(const Xpetra::Matrix& A, + const Teuchos::ArrayRCP& dirichletRows, + Teuchos::ArrayRCP dirichletCols, + Teuchos::ArrayRCP dirichletDomain) { + const Scalar one = Teuchos::ScalarTraits::one(); + RCP > domMap = A.getDomainMap(); + RCP > rowMap = A.getRowMap(); + RCP > colMap = A.getColMap(); + TEUCHOS_ASSERT(static_cast(dirichletRows.size()) == rowMap->getNodeNumElements()); + TEUCHOS_ASSERT(static_cast(dirichletCols.size()) == colMap->getNodeNumElements()); + TEUCHOS_ASSERT(static_cast(dirichletDomain.size()) == domMap->getNodeNumElements()); + RCP > myColsToZero = Xpetra::MultiVectorFactory::Build(colMap, 1, /*zeroOut=*/true); + // Find all local column indices that are in Dirichlet rows, record in myColsToZero as 1.0 + for(size_t i=0; i<(size_t) dirichletRows.size(); i++) { + if (dirichletRows[i]) { + ArrayView indices; + ArrayView values; + A.getLocalRowView(i,indices,values); + for(size_t j=0; j(indices.size()); j++) + myColsToZero->replaceLocalValue(indices[j],0,one); + } + } + + RCP > globalColsToZero; + RCP > importer = A.getCrsGraph()->getImporter(); + if (!importer.is_null()) { + globalColsToZero = Xpetra::MultiVectorFactory::Build(domMap, 1, /*zeroOut=*/true); + // export to domain map + globalColsToZero->doExport(*myColsToZero,*importer,Xpetra::ADD); + // import to column map + myColsToZero->doImport(*globalColsToZero,*importer,Xpetra::INSERT); + } + else + globalColsToZero = myColsToZero; + + FindNonZeros(globalColsToZero->getData(0),dirichletDomain); + FindNonZeros(myColsToZero->getData(0),dirichletCols); + } + + +#ifdef HAVE_MUELU_KOKKOS_REFACTOR + + template + void FindNonZeros(const typename Xpetra::MultiVector::dual_view_type::t_dev_um vals, + Kokkos::View nonzeros) { + using ATS = Kokkos::ArithTraits; + using range_type = Kokkos::RangePolicy; + TEUCHOS_ASSERT(vals.extent(0) == nonzeros.extent(0)); + const typename ATS::magnitudeType eps = 2.0*ATS::eps(); + + Kokkos::parallel_for("MueLu:RefMaxwell::FindNonZeros", range_type(0,vals.extent(0)), + KOKKOS_LAMBDA (const size_t i) { + nonzeros(i) = (ATS::magnitude(vals(i,0)) > eps); + }); + } + + template + void DetectDirichletCols(const Xpetra::Matrix& A, + const Kokkos::View & dirichletRows, + Kokkos::View dirichletCols, + Kokkos::View dirichletDomain) { + using range_type = Kokkos::RangePolicy; + const Scalar one = Teuchos::ScalarTraits::one(); + RCP > domMap = A.getDomainMap(); + RCP > rowMap = A.getRowMap(); + RCP > colMap = A.getColMap(); + TEUCHOS_ASSERT(dirichletRows.extent(0) == rowMap->getNodeNumElements()); + TEUCHOS_ASSERT(dirichletCols.extent(0) == colMap->getNodeNumElements()); + TEUCHOS_ASSERT(dirichletDomain.extent(0) == domMap->getNodeNumElements()); + RCP > myColsToZero = Xpetra::VectorFactory::Build(colMap, /*zeroOut=*/true); + // Find all local column indices that are in Dirichlet rows, record in myColsToZero as 1.0 + auto myColsToZeroView = myColsToZero->template getLocalView(); + auto localMatrix = A.getLocalMatrix(); + Kokkos::parallel_for("MueLu:RefMaxwell::DetectDirichletCols", range_type(0,rowMap->getNodeNumElements()), + KOKKOS_LAMBDA(const LocalOrdinal row) { + if (dirichletRows(row)) { + auto rowView = localMatrix.row(row); + auto length = rowView.length; + + for (decltype(length) colID = 0; colID < length; colID++) + myColsToZeroView(rowView.colidx(colID),0) = one; + } + }); + + RCP > globalColsToZero; + RCP > importer = A.getCrsGraph()->getImporter(); + if (!importer.is_null()) { + globalColsToZero = Xpetra::VectorFactory::Build(domMap, /*zeroOut=*/true); + // export to domain map + globalColsToZero->doExport(*myColsToZero,*importer,Xpetra::ADD); + // import to column map + myColsToZero->doImport(*globalColsToZero,*importer,Xpetra::INSERT); + } + else + globalColsToZero = myColsToZero; + FindNonZeros(globalColsToZero->template getLocalView(),dirichletDomain); + FindNonZeros(myColsToZero->template getLocalView(),dirichletCols); + } + +#endif + template Teuchos::RCP > RefMaxwell::getDomainMap() const { return SM_Matrix_->getDomainMap(); @@ -303,6 +417,8 @@ namespace MueLu { // Find rows with only 1 or 2 nonzero entries, record them in BCrows_. // BCrows_[i] is true, iff i is a boundary row // BCcols_[i] is true, iff i is a boundary column + int BCedgesLocal = 0; + int BCnodesLocal = 0; #ifdef HAVE_MUELU_KOKKOS_REFACTOR if (useKokkos_) { BCrowsKokkos_ = Utilities_kokkos::DetectDirichletRows(*SM_Matrix_,Teuchos::ScalarTraits::eps(),/*count_twos_as_dirichlet=*/true); @@ -330,31 +446,22 @@ namespace MueLu { } } - BCcolsKokkos_ = Utilities_kokkos::DetectDirichletCols(*D0_Matrix_,BCrowsKokkos_); + BCcolsKokkos_ = Kokkos::View(Kokkos::ViewAllocateWithoutInitializing("dirichletCols"), D0_Matrix_->getColMap()->getNodeNumElements()); + BCdomainKokkos_ = Kokkos::View(Kokkos::ViewAllocateWithoutInitializing("dirichletCols"), D0_Matrix_->getDomainMap()->getNodeNumElements()); + DetectDirichletCols(*D0_Matrix_,BCrowsKokkos_,BCcolsKokkos_,BCdomainKokkos_); + + dump(BCrowsKokkos_, "BCrows.m"); + dump(BCcolsKokkos_, "BCcols.m"); + dump(BCdomainKokkos_, "BCdomain.m"); - int BCrowcountLocal = 0; for (size_t i = 0; igetRowMap()->getComm(), BCrowcountLocal, BCrowcount_); -#else - BCrowcount_ = BCrowcountLocal; -#endif - int BCcolcountLocal = 0; - for (size_t i = 0; igetRowMap()->getComm(), BCcolcountLocal, BCcolcount_); -#else - BCcolcount_ = BCcolcountLocal; -#endif - if (IsPrint(Statistics2)) { - GetOStream(Statistics2) << "MueLu::RefMaxwell::compute(): Detected " << BCrowcount_ << " BC rows and " << BCcolcount_ << " BC columns." << std::endl; - } + BCedgesLocal += 1; + for (size_t i = 0; i(Utilities::DetectDirichletRows(*SM_Matrix_,Teuchos::ScalarTraits::eps(),/*count_twos_as_dirichlet=*/true)); @@ -381,57 +488,36 @@ namespace MueLu { } } - BCcols_ = Utilities::DetectDirichletCols(*D0_Matrix_,BCrows_); - int BCrowcountLocal = 0; + BCcols_.resize(D0_Matrix_->getColMap()->getNodeNumElements()); + BCdomain_.resize(D0_Matrix_->getDomainMap()->getNodeNumElements()); + DetectDirichletCols(*D0_Matrix_,BCrows_,BCcols_,BCdomain_); + + dump(BCrows_, "BCrows.m"); + dump(BCcols_, "BCcols.m"); + dump(BCdomain_, "BCdomain.m"); + for (auto it = BCrows_.begin(); it != BCrows_.end(); ++it) if (*it) - BCrowcountLocal += 1; -#ifdef HAVE_MPI - MueLu_sumAll(SM_Matrix_->getRowMap()->getComm(), BCrowcountLocal, BCrowcount_); -#else - BCrowcount_ = BCrowcountLocal; -#endif - int BCcolcountLocal = 0; - for (auto it = BCcols_.begin(); it != BCcols_.end(); ++it) + BCedgesLocal += 1; + for (auto it = BCdomain_.begin(); it != BCdomain_.end(); ++it) if (*it) - BCcolcountLocal += 1; + BCnodesLocal += 1; + } + #ifdef HAVE_MPI - MueLu_sumAll(SM_Matrix_->getRowMap()->getComm(), BCcolcountLocal, BCcolcount_); + MueLu_sumAll(SM_Matrix_->getRowMap()->getComm(), BCedgesLocal, BCedges_); + MueLu_sumAll(SM_Matrix_->getRowMap()->getComm(), BCnodesLocal, BCnodes_); #else - BCcolcount_ = BCcolcountLocal; + BCedges_ = BCedgesLocal; + BCnodes_ = BCnodesLocal; #endif - if (IsPrint(Statistics2)) { - GetOStream(Statistics2) << "MueLu::RefMaxwell::compute(): Detected " << BCrowcount_ << " BC rows and " << BCcolcount_ << " BC columns." << std::endl; - } - } + if (IsPrint(Statistics2)) { + GetOStream(Statistics2) << "MueLu::RefMaxwell::compute(): Detected " << BCedges_ << " BC rows and " << BCnodes_ << " BC columns." << std::endl; + } - TEUCHOS_TEST_FOR_EXCEPTION(Teuchos::as(BCrowcount_) >= D0_Matrix_->getRangeMap()->getGlobalNumElements(), Exceptions::RuntimeError, + TEUCHOS_TEST_FOR_EXCEPTION(Teuchos::as(BCedges_) >= D0_Matrix_->getRangeMap()->getGlobalNumElements(), Exceptions::RuntimeError, "All edges are detected as boundary edges!"); - if (dump_matrices_) { - GetOStream(Runtime0) << "Dumping BCrows, BCcols" << std::endl; - std::ofstream outBCrows("BCrows.m"); - std::ofstream outBCcols("BCcols.m"); -#ifdef HAVE_MUELU_KOKKOS_REFACTOR - if (useKokkos_) { - auto BCrows = Kokkos::create_mirror_view (BCrowsKokkos_); - Kokkos::deep_copy(BCrows , BCrowsKokkos_); - for (size_t i = 0; i < BCrows.size(); i++) - outBCrows << BCrows[i] << "\n"; - - auto BCcols = Kokkos::create_mirror_view (BCcolsKokkos_); - Kokkos::deep_copy(BCcols , BCcolsKokkos_); - for (size_t i = 0; i < BCcols.size(); i++) - outBCcols << BCcols[i] << "\n"; - } else -#endif - { - for (size_t i = 0; i < Teuchos::as(BCrows_.size()); i++) - outBCrows << BCrows_[i] << "\n"; - for (size_t i = 0; i < Teuchos::as(BCcols_.size()); i++) - outBCcols << BCcols_[i] << "\n"; - } - } } //////////////////////////////////////////////////////////////////////////////// @@ -542,6 +628,14 @@ namespace MueLu { coarseLevel.Request("A", rapFact.get()); A_nodal_Matrix_ = coarseLevel.Get< RCP >("A", rapFact.get()); + + // Apply boundary conditions to A_nodal +#ifdef HAVE_MUELU_KOKKOS_REFACTOR + if (useKokkos_) + Utilities_kokkos::ApplyOAZToMatrixRows(A_nodal_Matrix_,BCdomainKokkos_); + else +#endif + Utilities::ApplyOAZToMatrixRows(A_nodal_Matrix_,BCdomain_); dump(*A_nodal_Matrix_, "A_nodal.m"); // build special prolongator @@ -997,7 +1091,7 @@ namespace MueLu { std::transform(coarseType.begin(), coarseType.end(), coarseType.begin(), ::tolower); std::transform(coarseType.begin(), ++coarseType.begin(), coarseType.begin(), ::toupper); } - if (BCrowcount_ == 0 && + if (BCedges_ == 0 && (coarseType == "" || coarseType == "Klu" || coarseType == "Klu2") && @@ -1258,6 +1352,30 @@ namespace MueLu { } + template + void RefMaxwell::dump(const Teuchos::ArrayRCP& v, std::string name) const { + if (dump_matrices_) { + GetOStream(Runtime0) << "Dumping to " << name << std::endl; + std::ofstream out(name); + for (size_t i = 0; i < Teuchos::as(v.size()); i++) + out << v[i] << "\n"; + } + } + +#ifdef HAVE_MUELU_KOKKOS_REFACTOR + template + void RefMaxwell::dump(const Kokkos::View& v, std::string name) const { + if (dump_matrices_) { + GetOStream(Runtime0) << "Dumping to " << name << std::endl; + std::ofstream out(name); + auto vH = Kokkos::create_mirror_view (v); + Kokkos::deep_copy(vH , v); + for (size_t i = 0; i < vH.size(); i++) + out << vH[i] << "\n"; + } + } +#endif + template Teuchos::RCP RefMaxwell::getTimer(std::string name, RCP > comm) const { if (IsPrint(Timings)) { diff --git a/packages/muelu/doc/UsersGuide/masterList.xml b/packages/muelu/doc/UsersGuide/masterList.xml index 2f7457464ac0..223e255eb6ef 100644 --- a/packages/muelu/doc/UsersGuide/masterList.xml +++ b/packages/muelu/doc/UsersGuide/masterList.xml @@ -88,6 +88,14 @@ false + + number of vectors + int + 1 + Number of columns in multivectors that are cached for Hierarchy apply phase. + true + + problem: symmetric bool diff --git a/packages/muelu/doc/UsersGuide/options_general.tex b/packages/muelu/doc/UsersGuide/options_general.tex index 4fffc8f8f323..f706e4825f13 100644 --- a/packages/muelu/doc/UsersGuide/options_general.tex +++ b/packages/muelu/doc/UsersGuide/options_general.tex @@ -11,6 +11,8 @@ \cbb{cycle type}{string}{"V"}{Multigrid cycle type. Possible values: "V", "W".} +\cbb{number of vectors}{int}{1}{Number of columns in multivectors that are cached for Hierarchy apply phase.} + \cbb{problem: symmetric}{bool}{true}{Symmetry of a problem. This setting affects the construction of a restrictor. If set to true, the restrictor is set to be the transpose of a prolongator. If set to false, underlying multigrid algorithm makes the decision.} \cbb{xml parameter file}{string}{""}{An XML file from which to read additional diff --git a/packages/muelu/doc/UsersGuide/paramlist.tex b/packages/muelu/doc/UsersGuide/paramlist.tex index 1c798e3f31b9..22ac6226b450 100644 --- a/packages/muelu/doc/UsersGuide/paramlist.tex +++ b/packages/muelu/doc/UsersGuide/paramlist.tex @@ -11,6 +11,8 @@ \cbb{cycle type}{string}{"V"}{Multigrid cycle type. Possible values: "V", "W".} +\cbb{number of vectors}{int}{1}{Number of columns in multivectors that are cached for Hierarchy apply phase.} + \cbb{problem: symmetric}{bool}{true}{Symmetry of a problem. This setting affects the construction of a restrictor. If set to true, the restrictor is set to be the transpose of a prolongator. If set to false, underlying multigrid algorithm makes the decision.} \cbb{xml parameter file}{string}{""}{An XML file from which to read additional diff --git a/packages/muelu/doc/UsersGuide/paramlist_hidden.tex b/packages/muelu/doc/UsersGuide/paramlist_hidden.tex index a78d6a759a34..3d9463af16e8 100644 --- a/packages/muelu/doc/UsersGuide/paramlist_hidden.tex +++ b/packages/muelu/doc/UsersGuide/paramlist_hidden.tex @@ -15,6 +15,8 @@ \cbb{fuse prolongation and update}{bool}{false}{Fuse prolongation and update into one kernel call. Due to round-off error accumulation, this can in some cases result in slightly higher iteration counts. This only affects the solve phase.} +\cbb{number of vectors}{int}{1}{Number of columns in multivectors that are cached for Hierarchy apply phase.} + \cbb{problem: symmetric}{bool}{true}{Symmetry of a problem. This setting affects the construction of a restrictor. If set to true, the restrictor is set to be the transpose of a prolongator. If set to false, underlying multigrid algorithm makes the decision.} \cbb{xml parameter file}{string}{""}{An XML file from which to read additional diff --git a/packages/muelu/src/Interface/MueLu_HierarchyManager.hpp b/packages/muelu/src/Interface/MueLu_HierarchyManager.hpp index 620e0f54f73b..ab4eba8656a0 100644 --- a/packages/muelu/src/Interface/MueLu_HierarchyManager.hpp +++ b/packages/muelu/src/Interface/MueLu_HierarchyManager.hpp @@ -93,6 +93,7 @@ namespace MueLu { doPRrebalance_ (MasterList::getDefault("repartition: rebalance P and R")), implicitTranspose_ (MasterList::getDefault("transpose: use implicit")), fuseProlongationAndUpdate_ (MasterList::getDefault("fuse prolongation and update")), + sizeOfMultiVectors_ (MasterList::getDefault("number of vectors")), graphOutputLevel_(-1) { } //! @@ -248,8 +249,7 @@ namespace MueLu { } if (!matvecParams_.is_null()) H.SetMatvecParams(matvecParams_); - // FIXME: Should allow specification of NumVectors on parameterlist - H.AllocateLevelMultiVectors(1); + H.AllocateLevelMultiVectors(sizeOfMultiVectors_); H.describe(H.GetOStream(Runtime0), verbosity_); // When we reuse hierarchy, it is necessary that we don't @@ -316,6 +316,7 @@ namespace MueLu { bool doPRrebalance_; bool implicitTranspose_; bool fuseProlongationAndUpdate_; + int sizeOfMultiVectors_; int graphOutputLevel_; Teuchos::Array matricesToPrint_; Teuchos::Array prolongatorsToPrint_; diff --git a/packages/muelu/src/Interface/MueLu_ParameterListInterpreter_def.hpp b/packages/muelu/src/Interface/MueLu_ParameterListInterpreter_def.hpp index bbff27cbc260..2d9d163af520 100644 --- a/packages/muelu/src/Interface/MueLu_ParameterListInterpreter_def.hpp +++ b/packages/muelu/src/Interface/MueLu_ParameterListInterpreter_def.hpp @@ -1942,6 +1942,11 @@ namespace MueLu { hieraList.remove("fuse prolongation and update"); } + if (hieraList.isParameter("number of vectors")) { + this->numDesiredLevel_ = hieraList.get("number of vectors"); + hieraList.remove("number of vectors"); + } + if (hieraList.isSublist("matvec params")) this->matvecParams_ = Teuchos::parameterList(hieraList.sublist("matvec params")); diff --git a/packages/muelu/src/MueCentral/MueLu_Hierarchy_def.hpp b/packages/muelu/src/MueCentral/MueLu_Hierarchy_def.hpp index 128c1b930a88..f7f3e912f273 100644 --- a/packages/muelu/src/MueCentral/MueLu_Hierarchy_def.hpp +++ b/packages/muelu/src/MueCentral/MueLu_Hierarchy_def.hpp @@ -552,9 +552,9 @@ namespace MueLu { Levels_ .resize(levelID); levelManagers_.resize(levelID); - // NOTE: All reuse cases leave all of the maps the same, meaning that we do not - // need to reallocated the cached multivectors for Iterate(). If this were to change, - // we'd want to do a DeleteLevelMultiVectors() and AllocateLevelMultiVectors() here. + int sizeOfVecs = sizeOfAllocatedLevelMultiVectors_; + DeleteLevelMultiVectors(); + AllocateLevelMultiVectors(sizeOfVecs); // since the # of levels, etc. may have changed, force re-determination of description during next call to description() ResetDescription(); @@ -909,7 +909,7 @@ namespace MueLu { // If the number of vectors is unchanged, this is a noop. // NOTE: We need to check against B because the tests in AllocateLevelMultiVectors // will fail on Stokhos Scalar types (due to the so-called 'hidden dimension') - const BlockedMultiVector * Bblocked = dynamic_cast(&B); + const BlockedMultiVector * Bblocked = dynamic_cast(&B); if(residual_.size() > startLevel && ( ( Bblocked && !Bblocked->isSameSize(*residual_[startLevel])) || (!Bblocked && !residual_[startLevel]->isSameSize(B)))) @@ -1419,9 +1419,9 @@ namespace MueLu { for (emap::const_iterator eit = edges.begin(); eit != edges.end(); eit++) { std::pair boost_edge = boost::add_edge(eit->first.first, eit->first.second, graph); - // printf("[%d] CMS: Hierarchy, adding edge (%d->%d) %d\n",rank,(int)eit->first.first,(int)eit->first.second,(int)boost_edge.second); - // Because xdot.py views 'Graph' as a keyword - if(eit->second==std::string("Graph")) boost::put("label", dp, boost_edge.first, std::string("Graph_")); + // printf("[%d] CMS: Hierarchy, adding edge (%d->%d) %d\n",rank,(int)eit->first.first,(int)eit->first.second,(int)boost_edge.second); + // Because xdot.py views 'Graph' as a keyword + if(eit->second==std::string("Graph")) boost::put("label", dp, boost_edge.first, std::string("Graph_")); else boost::put("label", dp, boost_edge.first, eit->second); if (i == dumpLevel_) boost::put("color", dp, boost_edge.first, std::string("red")); @@ -1525,7 +1525,7 @@ namespace MueLu { template void Hierarchy::AllocateLevelMultiVectors(int numvecs) { - int N = Levels_.size(); + int N = Levels_.size(); if( (sizeOfAllocatedLevelMultiVectors_ == numvecs && residual_.size() == N) || numvecs<=0 ) return; // If, somehow, we changed the number of levels, delete everything first @@ -1547,11 +1547,11 @@ namespace MueLu { RCP A_as_blocked = Teuchos::rcp_dynamic_cast(A); RCP Arm = A->getRangeMap(); RCP Adm = A->getDomainMap(); - if(!A_as_blocked.is_null()) { + if(!A_as_blocked.is_null()) { Adm = A_as_blocked->getFullDomainMap(); } - // This is zero'd by default since it is filled via an operator apply + // This is zero'd by default since it is filled via an operator apply residual_[i] = MultiVectorFactory::Build(Arm, numvecs, true); correction_[i] = MultiVectorFactory::Build(Adm, numvecs, false); } @@ -1570,7 +1570,7 @@ namespace MueLu { RCP importer; if(Levels_[i+1]->IsAvailable("Importer")) importer = Levels_[i+1]->template Get< RCP >("Importer"); - if (doPRrebalance_ || importer.is_null()) + if (doPRrebalance_ || importer.is_null()) coarseX_[i] = MultiVectorFactory::Build(coarseRhs_[i]->getMap(),numvecs,true); else { coarseImport_[i] = MultiVectorFactory::Build(importer->getTargetMap(), numvecs,false); diff --git a/packages/muelu/src/MueCentral/MueLu_MasterList.cpp b/packages/muelu/src/MueCentral/MueLu_MasterList.cpp index 50238e358b29..4edd5e16922c 100644 --- a/packages/muelu/src/MueCentral/MueLu_MasterList.cpp +++ b/packages/muelu/src/MueCentral/MueLu_MasterList.cpp @@ -124,6 +124,7 @@ namespace MueLu { if (name == "max levels") { ss << ""; return ss.str(); } if (name == "coarse grid correction scaling factor") { ss << ""; return ss.str(); } if (name == "fuse prolongation and update") { ss << ""; return ss.str(); } + if (name == "number of vectors") { ss << ""; return ss.str(); } if (name == "problem: symmetric") { ss << ""; return ss.str(); } if (name == "hierarchy label") { ss << ""; return ss.str(); } if (name == "aggregation: drop tol") { ss << ""; return ss.str(); } @@ -168,6 +169,7 @@ namespace MueLu { "" "" "" + "" "" "" "" @@ -522,6 +524,8 @@ namespace MueLu { ("fuse prolongation and update","fuse prolongation and update") + ("number of vectors","number of vectors") + ("problem: symmetric","problem: symmetric") ("xml parameter file","xml parameter file") diff --git a/packages/muelu/src/Utils/MueLu_UtilitiesBase_decl.hpp b/packages/muelu/src/Utils/MueLu_UtilitiesBase_decl.hpp index 5bb15ec566b5..79683bb04759 100644 --- a/packages/muelu/src/Utils/MueLu_UtilitiesBase_decl.hpp +++ b/packages/muelu/src/Utils/MueLu_UtilitiesBase_decl.hpp @@ -852,7 +852,7 @@ namespace MueLu { // Takes a vector of row indices static void ApplyOAZToMatrixRows(Teuchos::RCP >& A, const std::vector& dirichletRows) { - RCP Rmap = A->getColMap(); + RCP Rmap = A->getRowMap(); RCP Cmap = A->getColMap(); Scalar one =Teuchos::ScalarTraits::one(); Scalar zero =Teuchos::ScalarTraits::zero(); @@ -878,11 +878,15 @@ namespace MueLu { // Takes a Boolean array. static void ApplyOAZToMatrixRows(Teuchos::RCP >& A, const Teuchos::ArrayRCP& dirichletRows) { - RCP Rmap = A->getColMap(); + TEUCHOS_ASSERT(A->isFillComplete()); + RCP domMap = A->getDomainMap(); + RCP ranMap = A->getRangeMap(); + RCP Rmap = A->getRowMap(); RCP Cmap = A->getColMap(); - Scalar one =Teuchos::ScalarTraits::one(); - Scalar zero =Teuchos::ScalarTraits::zero(); - + TEUCHOS_ASSERT(static_cast(dirichletRows.size()) == Rmap->getNodeNumElements()); + const Scalar one = Teuchos::ScalarTraits::one(); + const Scalar zero = Teuchos::ScalarTraits::zero(); + A->resumeFill(); for(size_t i=0; i<(size_t) dirichletRows.size(); i++) { if (dirichletRows[i]){ GlobalOrdinal row_gid = Rmap->getGlobalElement(i); @@ -890,16 +894,18 @@ namespace MueLu { Teuchos::ArrayView indices; Teuchos::ArrayView values; A->getLocalRowView(i,indices,values); - // NOTE: This won't work with fancy node types. - Scalar* valuesNC = const_cast(values.getRawPtr()); + + Teuchos::ArrayRCP valuesNC(values.size()); for(size_t j=0; j<(size_t)indices.size(); j++) { if(Cmap->getGlobalElement(indices[j])==row_gid) valuesNC[j]=one; else valuesNC[j]=zero; } + A->replaceLocalValues(i,indices,valuesNC()); } } + A->fillComplete(domMap, ranMap); } // Zeros out rows @@ -923,6 +929,7 @@ namespace MueLu { static void ZeroDirichletRows(Teuchos::RCP >& A, const Teuchos::ArrayRCP& dirichletRows, Scalar replaceWith=Teuchos::ScalarTraits::zero()) { + TEUCHOS_ASSERT(static_cast(dirichletRows.size()) == A->getRowMap()->getNodeNumElements()); for(size_t i=0; i<(size_t) dirichletRows.size(); i++) { if (dirichletRows[i]) { Teuchos::ArrayView indices; @@ -941,6 +948,7 @@ namespace MueLu { static void ZeroDirichletRows(Teuchos::RCP >& X, const Teuchos::ArrayRCP& dirichletRows, Scalar replaceWith=Teuchos::ScalarTraits::zero()) { + TEUCHOS_ASSERT(static_cast(dirichletRows.size()) == X->getMap()->getNodeNumElements()); for(size_t i=0; i<(size_t) dirichletRows.size(); i++) { if (dirichletRows[i]) { for(size_t j=0; jgetNumVectors(); j++) @@ -954,6 +962,7 @@ namespace MueLu { static void ZeroDirichletCols(Teuchos::RCP& A, const Teuchos::ArrayRCP& dirichletCols, Scalar replaceWith=Teuchos::ScalarTraits::zero()) { + TEUCHOS_ASSERT(static_cast(dirichletCols.size()) == A->getColMap()->getNodeNumElements()); for(size_t i=0; igetNodeNumRows(); i++) { Teuchos::ArrayView indices; Teuchos::ArrayView values; diff --git a/packages/muelu/src/Utils/MueLu_Utilities_kokkos_decl.hpp b/packages/muelu/src/Utils/MueLu_Utilities_kokkos_decl.hpp index bf7ee2dec152..5fc84d4848aa 100644 --- a/packages/muelu/src/Utils/MueLu_Utilities_kokkos_decl.hpp +++ b/packages/muelu/src/Utils/MueLu_Utilities_kokkos_decl.hpp @@ -304,6 +304,8 @@ namespace MueLu { */ static RCP > CuthillMcKee(const Matrix &Op); + static void ApplyOAZToMatrixRows(RCP& A, const Kokkos::View& dirichletRows); + }; // class Utils @@ -716,6 +718,8 @@ namespace MueLu { */ static RCP > CuthillMcKee(const Matrix &Op); + static void ApplyOAZToMatrixRows(RCP& A, const Kokkos::View& dirichletRows); + }; // class Utilities (specialization SC=double LO=GO=int) diff --git a/packages/muelu/src/Utils/MueLu_Utilities_kokkos_def.hpp b/packages/muelu/src/Utils/MueLu_Utilities_kokkos_def.hpp index a39e17cc030f..8144de4b0ff2 100644 --- a/packages/muelu/src/Utils/MueLu_Utilities_kokkos_def.hpp +++ b/packages/muelu/src/Utils/MueLu_Utilities_kokkos_def.hpp @@ -729,6 +729,64 @@ namespace MueLu { return MueLu::CuthillMcKee(Op); } + // Applies Ones-and-Zeros to matrix rows + // Takes a Boolean array. + template + void + ApplyOAZToMatrixRows(Teuchos::RCP >& A, + const Kokkos::View& dirichletRows) { + TEUCHOS_ASSERT(A->isFillComplete()); + using ATS = Kokkos::ArithTraits; + using impl_ATS = Kokkos::ArithTraits; + using range_type = Kokkos::RangePolicy; + + RCP > domMap = A->getDomainMap(); + RCP > ranMap = A->getRangeMap(); + RCP > Rmap = A->getRowMap(); + RCP > Cmap = A->getColMap(); + + TEUCHOS_ASSERT(static_cast(dirichletRows.size()) == Rmap->getNodeNumElements()); + + const Scalar one = impl_ATS::one(); + const Scalar zero = impl_ATS::zero(); + + auto localMatrix = A->getLocalMatrix(); + auto localRmap = Rmap->getLocalMap(); + auto localCmap = Cmap->getLocalMap(); + + Kokkos::parallel_for("MueLu::Utils::ApplyOAZ",range_type(0,dirichletRows.extent(0)), + KOKKOS_LAMBDA(const LocalOrdinal row) { + if (dirichletRows(row)){ + auto rowView = localMatrix.row(row); + auto length = rowView.length; + auto row_gid = localRmap.getGlobalElement(row); + auto row_lid = localCmap.getLocalElement(row_gid); + + for (decltype(length) colID = 0; colID < length; colID++) + if (rowView.colidx(colID) == row_lid) + rowView.value(colID) = one; + else + rowView.value(colID) = zero; + } + }); + } + + template + void + Utilities_kokkos:: + ApplyOAZToMatrixRows(Teuchos::RCP >& A, + const Kokkos::View& dirichletRows) { + MueLu::ApplyOAZToMatrixRows(A, dirichletRows); + } + + template + void + Utilities_kokkos:: + ApplyOAZToMatrixRows(Teuchos::RCP >& A, + const Kokkos::View& dirichletRows) { + MueLu::ApplyOAZToMatrixRows(A, dirichletRows); + } + } //namespace MueLu #define MUELU_UTILITIES_KOKKOS_SHORT diff --git a/packages/muelu/test/unit_tests/Adapters/CreatePreconditioner.cpp b/packages/muelu/test/unit_tests/Adapters/CreatePreconditioner.cpp index 2586a1e46a6b..5649ca572354 100644 --- a/packages/muelu/test/unit_tests/Adapters/CreatePreconditioner.cpp +++ b/packages/muelu/test/unit_tests/Adapters/CreatePreconditioner.cpp @@ -599,11 +599,125 @@ namespace MueLuTests { } } + TEUCHOS_UNIT_TEST_TEMPLATE_4_DECL(PetraOperator, ReusePreconditioner2, Scalar, LocalOrdinal, GlobalOrdinal, Node) + { +# include "MueLu_UseShortNames.hpp" + MUELU_TESTING_SET_OSTREAM; + MUELU_TESTING_LIMIT_SCOPE(Scalar,GlobalOrdinal,Node); + + out << "version: " << MueLu::Version() << std::endl; + + if (Teuchos::ScalarTraits::isComplex) + return; + + using Teuchos::RCP; + using Teuchos::null; + typedef MueLu::Utilities Utils; + typedef typename Teuchos::ScalarTraits::magnitudeType real_type; + typedef Xpetra::MultiVector dMultiVector; + + Xpetra::UnderlyingLib lib = TestHelpers::Parameters::getLib(); + RCP > comm = TestHelpers::Parameters::getDefaultComm(); + + Teuchos::ParameterList params; + params.set("aggregation: type","uncoupled"); + params.set("aggregation: drop tol", 0.02); + params.set("coarse: max size", Teuchos::as(500)); + + if (lib == Xpetra::UseTpetra) { + typedef Tpetra::Operator tpetra_operator_type; + + // Matrix + std::string matrixFile("TestMatrices/fuego0.mm"); + RCP rowmap = MapFactory::Build(lib, Teuchos::as(1500), Teuchos::as(0), comm); + RCP Op = Xpetra::IO::Read(matrixFile, rowmap, null, null, null); + RCP map = Op->getRowMap(); + + // Normalized RHS + RCP RHS1 = MultiVectorFactory::Build(Op->getRowMap(), 1); + RHS1->setSeed(846930886); + RHS1->randomize(); + Teuchos::Array::magnitudeType> norms(1); + RHS1->norm2(norms); + RHS1->scale(1/norms[0]); + + // Zero initial guess + RCP X1 = MultiVectorFactory::Build(Op->getRowMap(), 1); + X1->putScalar(Teuchos::ScalarTraits::zero()); + + RCP > tpA = MueLu::Utilities::Op2NonConstTpetraCrs(Op); + RCP > tH = MueLu::CreateTpetraPreconditioner(RCP(tpA), params); + tH->apply(*(Utils::MV2TpetraMV(RHS1)), *(Utils::MV2NonConstTpetraMV(X1))); + out << "after apply, ||b-A*x||_2 = " << std::setiosflags(std::ios::fixed) << std::setprecision(10) << + Utils::ResidualNorm(*Op, *X1, *RHS1) << std::endl; + + // Reuse preconditioner + + matrixFile = "TestMatrices/fuego1.mm"; + RCP Op2 = Xpetra::IO::Read(matrixFile, rowmap, null, null, null); + RCP > tpA2 = MueLu::Utilities::Op2NonConstTpetraCrs(Op2); + + MueLu::ReuseTpetraPreconditioner(tpA2, *tH); + + X1->putScalar(Teuchos::ScalarTraits::zero()); + tH->apply(*(Utils::MV2TpetraMV(RHS1)), *(Utils::MV2NonConstTpetraMV(X1))); + out << "after apply, ||b-A*x||_2 = " << std::setiosflags(std::ios::fixed) << std::setprecision(10) << + Utils::ResidualNorm(*Op, *X1, *RHS1) << std::endl; + + } else if (lib == Xpetra::UseEpetra) { +#ifdef HAVE_MUELU_EPETRA + // Matrix + std::string matrixFile("TestMatrices/fuego0.mm"); + RCP rowmap = MapFactory::Build(lib, Teuchos::as(1500), Teuchos::as(0), comm); + RCP Op = Xpetra::IO::Read(matrixFile, rowmap, null, null, null); + RCP map = Op->getRowMap(); + + // Normalized RHS + RCP RHS1 = MultiVectorFactory::Build(Op->getRowMap(), 1); + RHS1->setSeed(846930886); + RHS1->randomize(); + Teuchos::Array::magnitudeType> norms(1); + RHS1->norm2(norms); + RHS1->scale(1/norms[0]); + + // Zero initial guess + RCP X1 = MultiVectorFactory::Build(Op->getRowMap(), 1); + X1->putScalar(Teuchos::ScalarTraits::zero()); + + params.set("use kokkos refactor", false); + RCP epA = MueLu::Utilities::Op2NonConstEpetraCrs(Op); + RCP eH = MueLu::CreateEpetraPreconditioner(epA, params); + + eH->Apply(*(Utils::MV2EpetraMV(RHS1)), *(Utils::MV2NonConstEpetraMV(X1))); + out << "after apply, ||b-A*x||_2 = " << std::setiosflags(std::ios::fixed) << std::setprecision(10) << + Utils::ResidualNorm(*Op, *X1, *RHS1) << std::endl; + + // Reuse preconditioner + + matrixFile = "TestMatrices/fuego1.mm"; + RCP Op2 = Xpetra::IO::Read(matrixFile, rowmap, null, null, null); + epA = MueLu::Utilities::Op2NonConstEpetraCrs(Op); + MueLu::ReuseEpetraPreconditioner(epA, *eH); + + X1->putScalar(Teuchos::ScalarTraits::zero()); + eH->Apply(*(Utils::MV2EpetraMV(RHS1)), *(Utils::MV2NonConstEpetraMV(X1))); + out << "after apply, ||b-A*x||_2 = " << std::setiosflags(std::ios::fixed) << std::setprecision(10) << + Utils::ResidualNorm(*Op, *X1, *RHS1) << std::endl; +#else + std::cout << "Skip PetraOperator::ReusePreconditioner: Epetra is not available" << std::endl; +#endif + + } else { + TEUCHOS_TEST_FOR_EXCEPTION(true, MueLu::Exceptions::InvalidArgument, "Unknown Xpetra lib"); + } + } + # define MUELU_ETI_GROUP(Scalar, LO, GO, Node) \ TEUCHOS_UNIT_TEST_TEMPLATE_4_INSTANT(PetraOperator, CreatePreconditioner, Scalar, LO, GO, Node) \ TEUCHOS_UNIT_TEST_TEMPLATE_4_INSTANT(PetraOperator, CreatePreconditioner_XMLOnList, Scalar, LO, GO, Node) \ TEUCHOS_UNIT_TEST_TEMPLATE_4_INSTANT(PetraOperator, CreatePreconditioner_PDESystem, Scalar, LO, GO, Node) \ TEUCHOS_UNIT_TEST_TEMPLATE_4_INSTANT(PetraOperator, ReusePreconditioner, Scalar, LO, GO, Node) \ + TEUCHOS_UNIT_TEST_TEMPLATE_4_INSTANT(PetraOperator, ReusePreconditioner2, Scalar, LO, GO, Node) \ #include diff --git a/packages/muelu/test/unit_tests/CMakeLists.txt b/packages/muelu/test/unit_tests/CMakeLists.txt index 178b56169be1..20fd2b2f11f6 100644 --- a/packages/muelu/test/unit_tests/CMakeLists.txt +++ b/packages/muelu/test/unit_tests/CMakeLists.txt @@ -91,6 +91,8 @@ TRIBITS_COPY_FILES_TO_BINARY_DIR(UnitTestsTestMatrices_cp SOURCE_FILES aniso2dx.mat SOURCE_FILES aniso2dy.mat SOURCE_FILES iso2d.mat + SOURCE_FILES fuego0.mm + SOURCE_FILES fuego1.mm DEST_DIR ${CMAKE_CURRENT_BINARY_DIR}/TestMatrices ) diff --git a/packages/muelu/test/unit_tests/TestMatrices/fuego0.mm b/packages/muelu/test/unit_tests/TestMatrices/fuego0.mm new file mode 100644 index 000000000000..1c4dda5de5d4 --- /dev/null +++ b/packages/muelu/test/unit_tests/TestMatrices/fuego0.mm @@ -0,0 +1,12341 @@ +%%MatrixMarket matrix coordinate real general +% Generated 26-May-2020 18:23:39 +1500 1500 12338 +1 1 200.2558326901898 +102 1 7.333302023543114 +116 1 7.333558758698576 +132 1 -9.666159222003509 +490 1 -57.50146085018425 +757 1 -3.788609969221677 +836 1 -12.51626499245575 +857 1 -12.5158116428062 +2 2 200.2558222556044 +106 2 7.333302328230614 +107 2 7.333540662001035 +127 2 -9.66616334417605 +548 2 -57.50143277419447 +761 2 -3.788609661845554 +811 2 -12.51584103248114 +832 2 -12.51626459996706 +3 3 200.2558326901898 +111 3 7.33355875869858 +121 3 7.333302023543112 +122 3 -9.666159222003509 +519 3 -57.50146085018424 +781 3 -3.788609969221679 +786 3 -12.51626499245575 +807 3 -12.5158116428062 +4 4 200.2558222556044 +45 4 -9.666163344176054 +112 4 7.333540662001035 +117 4 7.333302328230614 +461 4 -57.50143277419447 +777 4 -3.788609661845555 +782 4 -12.51626459996706 +861 4 -12.51584103248114 +5 5 15809.82521381263 +59 5 2611.582790673091 +65 5 2611.684408490837 +94 5 4561.574421689713 +250 5 -15647.66808131545 +604 5 749.8266274591707 +756 5 749.7998267465413 +1027 5 -2616.200019677775 +1375 5 -4594.269910252029 +6 6 539.8778119863899 +30 6 78.51763037148928 +39 6 78.52197495189756 +101 6 -15.41908778510813 +136 6 -10.54473189054601 +192 6 -303.1393523239967 +597 6 -3.830407247785935 +749 6 -3.830735899917896 +856 6 -3.786751261698056 +877 6 -3.786904403385721 +882 6 -57.45928334174653 +1172 6 -95.60229413756505 +7 7 15807.6274353617 +50 7 2611.23116312135 +69 7 2611.337700757247 +86 7 4560.918338794047 +221 7 -15645.46024831677 +636 7 749.7178223348956 +644 7 749.700798343408 +1031 7 -2615.847216437449 +8 8 539.9767562411109 +34 8 78.52940124350204 +40 8 78.53441422437666 +93 8 -15.35961173865282 +131 8 -10.54691010775553 +163 8 -303.2522024209673 +629 8 -3.823789738057533 +637 8 -3.822872985650086 +831 8 -3.787309672654555 +852 8 -3.787139491273363 +886 8 -57.47832244503319 +1404 8 -95.63023741597718 +9 9 539.9795400331502 +25 9 78.53040688450469 +44 9 78.53473806759152 +78 9 -15.35942883448996 +126 9 -10.54698319964756 +297 9 -303.254388531032 +669 9 -3.822908386793685 +677 9 -3.822559697670712 +806 9 -3.787169858534035 +827 9 -3.787322719814753 +10 10 15807.64095614377 +54 10 2611.231413183423 +60 10 2611.333336579613 +85 10 4560.955827670105 +326 10 -15645.4739192231 +676 10 749.7009279978023 +684 10 749.7277570118395 +11 11 539.97673870439 +29 11 78.53038508916779 +35 11 78.53342314236696 +49 11 -10.54690941478862 +70 11 -15.35962269051012 +373 11 -303.2521839783862 +709 11 -3.822538292032112 +717 11 -3.824126793186323 +802 11 -3.787168129024373 +881 11 -3.787280802753347 +12 12 15807.62796273167 +55 12 2611.228833258429 +64 12 2611.340895078951 +77 12 4560.918172235958 +402 12 -15645.4607813125 +716 12 749.7298495637432 +724 12 749.688952679187 +13 13 20293.06963958939 +137 13 -9777.160538862863 +158 13 1876.530181253931 +220 13 6712.513097881534 +440 13 1876.718436118763 +596 13 -7400.300873802825 +1022 13 616.4827996168062 +1200 13 -3269.147648466709 +14 14 751391.2459896182 +144 14 -90823.92634379437 +145 14 3209.280543976187 +278 14 147638.3695267458 +435 14 3200.780071489258 +1167 14 -15795.65665289021 +1403 14 -56398.17404777362 +15 15 751329.2845373127 +149 15 3230.019278657383 +157 15 -90853.99956551222 +249 15 147643.545966686 +279 15 3222.3167315354 +1171 15 -15784.77519191606 +16 16 20296.41202913088 +150 16 -9777.414748638967 +162 16 1876.282050931929 +191 16 6713.599948781338 +292 16 1876.483184264138 +591 16 -7401.603861067311 +1026 16 616.3957973558681 +1432 16 -3269.241651177806 +17 17 751330.6493831793 +283 17 3222.211889437414 +291 17 -90856.15323808297 +354 17 147643.5971666196 +355 17 3230.685468635507 +18 18 20296.58444748698 +284 18 -9777.59917639559 +296 18 1876.500324226608 +325 18 6713.656808807749 +368 18 1876.311511921471 +581 18 -7401.646182898802 +19 19 751329.2937620521 +359 19 3231.508708624962 +367 19 -90853.97215329064 +430 19 147643.5429459677 +431 19 3220.769672842987 +20 20 20296.41085991619 +360 20 -9777.415062484015 +372 20 1876.309398686871 +401 20 6713.599565114327 +436 20 1876.456362715507 +586 20 -7401.603447323873 +21 21 9623.140062499122 +441 21 -1466.340393675844 +456 21 -1466.331064204044 +518 21 3196.881135063993 +592 21 -2844.988049841663 +22 22 9623.13975628649 +445 22 -1466.340218249573 +446 22 -1466.331215718501 +576 22 3196.881036988235 +587 22 -2844.986771670879 +23 23 9623.140062499122 +450 23 -1466.331064204044 +455 23 -1466.340393675844 +547 23 3196.881135063993 +577 23 -2844.988049841663 +24 24 9623.13975628649 +451 24 -1466.340218249573 +460 24 -1466.331215718501 +489 24 3196.881036988235 +582 24 -2844.986771670879 +9 25 77.0952968734593 +25 25 556.7787163479675 +26 25 81.46448998688874 +78 25 -3.796051358778509 +126 25 -5.075004390657497 +297 25 -55.00459761800299 +677 25 -15.63928325589367 +685 25 -3.901370404637538 +805 25 -2.401391890923581 +806 25 0.9925936237944519 +25 26 79.94249444897025 +26 26 577.6532874729303 +27 26 83.01308929104292 +677 26 -3.862576112032023 +685 26 -16.08516853617759 +693 26 -3.945840349673395 +804 26 -1.378076057292732 +805 26 11.32787950126767 +806 26 -2.362501054877297 +26 27 82.48787161651458 +27 27 585.5592632603724 +28 27 82.48786522129643 +685 27 -3.933309082642147 +693 27 -16.25218325962133 +701 27 -3.93337443909622 +803 27 -1.240804245006567 +804 27 14.97372023408851 +805 27 -1.240804289191148 +27 28 83.01307929857566 +28 28 577.6532619664156 +29 28 79.94250866515506 +693 28 -3.945790305670602 +701 28 -16.08520256600564 +709 28 -3.862601757709657 +802 28 -2.36250107568752 +803 28 11.32787964029891 +804 28 -1.378076041028574 +11 29 77.09520383109307 +28 29 81.46449175538245 +29 29 556.7786650584667 +49 29 -5.074999398216521 +70 29 -3.796053628556017 +373 29 -55.00453905748319 +701 29 -3.901328717901533 +709 29 -15.63925102746347 +802 29 0.9925963966847355 +803 29 -2.401391866078077 +6 30 77.08212238790198 +30 30 556.6830663721032 +31 30 81.45363428041497 +101 30 -3.805540169554789 +136 30 -5.074513167302973 +192 30 -54.9840931341859 +597 30 -15.69522202275422 +605 30 -3.906677555575731 +855 30 -2.40109463414983 +856 30 0.9942179920579761 +882 30 -324.6395291605065 +883 30 -62.0435088779312 +1172 30 -16.36190766563241 +30 31 79.93052380658528 +31 31 577.5750212516206 +32 31 83.00524448188271 +597 31 -3.872474969596338 +605 31 -16.13057511343018 +613 31 -3.948352616356667 +854 31 -1.377888690784253 +855 31 11.32886718179869 +856 31 -2.362176062134987 +882 31 -60.13794089190161 +883 31 -347.6351889965823 +884 31 -64.38867572948598 +31 32 82.47847048648589 +32 32 585.5054905132157 +33 32 82.48330462444287 +605 32 -3.942233532057863 +613 32 -16.28276094342682 +621 32 -3.933661967257168 +853 32 -1.240697156257013 +854 32 14.97431758033544 +855 32 -1.240588903566358 +883 32 -63.73655527491273 +884 32 -356.0446391380169 +885 32 -63.7437660295796 +32 33 83.00695566569287 +33 33 577.6242812793724 +34 33 79.94060716333257 +613 33 -3.95249709315431 +621 33 -16.10077926415217 +629 33 -3.86182258459216 +852 33 -2.362449524414666 +853 33 11.32823762854109 +854 33 -1.377935550841181 +884 33 -64.39210389505328 +885 33 -347.6920710655233 +886 33 -60.15374310284326 +8 34 77.09477347238341 +33 34 81.46143893951412 +34 34 556.7681328571009 +93 34 -3.795627628902457 +131 34 -5.07498734613303 +163 34 -55.00404950815616 +621 34 -3.905203929311241 +629 34 -15.64376644215051 +852 34 0.9927680313136236 +853 34 -2.401312649273558 +885 34 -62.05658667029627 +886 34 -324.73720812447 +1404 34 -16.36639614939983 +11 35 77.09862751640972 +35 35 556.7807203734884 +36 35 81.46213496864122 +49 35 -5.074981544789679 +70 35 -3.795496954155293 +373 35 -55.00594056657967 +717 35 -15.64434465077812 +725 35 -3.905784842531068 +880 35 -2.401430086312839 +881 35 0.9926218029692642 +35 36 79.94139240720963 +36 36 577.6118412032282 +37 36 83.0014195609926 +717 36 -3.861341947552249 +725 36 -16.10048936963082 +733 36 -3.952670028298018 +879 36 -1.378083827548389 +880 36 11.3282990591758 +881 36 -2.36226392858501 +36 37 82.47787811145044 +37 37 585.4742782352067 +38 37 82.47222264067548 +725 37 -3.93325289132232 +733 37 -16.28166903155177 +741 37 -3.941815188035486 +878 37 -1.240585498138859 +879 37 14.97415393484245 +880 37 -1.240708056186232 +37 38 82.99887546295479 +38 38 577.5635752761576 +39 38 79.93251765942971 +733 38 -3.94851694389102 +741 38 -16.13033104844922 +749 38 -3.871988841425967 +877 38 -2.361952672155457 +878 38 11.32891521393399 +879 38 -1.37807985781723 +6 39 77.08626224768548 +38 39 81.45552508100474 +39 39 556.6997003010774 +101 39 -3.805411355406308 +136 39 -5.074507185370981 +192 39 -54.98613432926354 +741 39 -3.907279423974426 +749 39 -15.69590654165617 +877 39 0.994031547280855 +878 39 -2.401232880172413 +1172 39 -16.36242922325473 +8 40 77.09906189445105 +40 40 556.7913170624938 +41 40 81.46519285947736 +93 40 -3.795918008421344 +131 40 -5.074993896638281 +163 40 -55.00643690581646 +637 40 -15.63978330158241 +645 40 -3.901913297501663 +830 40 -2.40150939752599 +831 40 0.9924493444584215 +1404 40 -16.36740607685006 +40 41 79.94330319208748 +41 41 577.6408357062487 +42 41 83.0075416986783 +637 41 -3.862105925027093 +645 41 -16.08491408553967 +653 41 -3.945962167908883 +829 41 -1.378224317926511 +830 41 11.32794085404709 +831 41 -2.362315622177631 +41 42 82.48243826358235 +42 42 585.5280368992112 +43 42 82.48161790294643 +645 42 -3.93296875710522 +653 42 -16.25109348707022 +661 42 -3.932894305650262 +828 42 -1.240800735125323 +829 42 14.97355672985364 +830 42 -1.240815172429159 +42 43 83.00671718036691 +43 43 577.6417930221693 +44 43 79.94447480220762 +653 43 -3.946003671482094 +661 43 -16.08494773336707 +669 43 -3.862103562168752 +827 43 -2.362277346970819 +828 43 11.32792830687949 +829 43 -1.378267151910805 +9 44 77.09943240101735 +43 44 81.46637381769855 +44 44 556.7952420109359 +78 44 -3.795920039758149 +126 44 -5.074998295554757 +297 44 -55.00663040892888 +661 44 -3.901974697890548 +669 44 -15.64005121093015 +827 44 0.9924085207865829 +828 44 -2.401529890824149 +4 45 -8.792467933419381 +45 45 255.2521795354953 +46 45 -7.036631860794508 +112 45 3.211111604123242 +117 45 3.211308052423854 +461 45 -28.05776734678021 +782 45 17.34405404225778 +787 45 -8.350879900210128 +861 45 17.34512316439422 +866 45 -8.350461022707506 +45 46 -7.444925331692696 +46 46 306.3115655413991 +47 46 -6.727994488015991 +782 46 1.029012475157155 +787 46 30.90527380681113 +792 46 -5.684661390844313 +861 46 1.028806508185356 +866 46 30.90704588740881 +871 46 -5.684314350145801 +46 47 -7.433945368509619 +47 47 363.7588698998775 +48 47 -7.373182436026546 +787 47 -0.5577891282943064 +792 47 43.980085135289 +797 47 -3.819574956359192 +866 47 -0.5579854847221082 +871 47 43.98249945212788 +876 47 -3.8192809294257 +47 48 -8.179076816638997 +48 48 423.8389113916563 +49 48 -8.575810903182361 +792 48 -1.845778830233436 +797 48 56.64664960575347 +802 48 -2.485542403879593 +871 48 -1.845961236400454 +876 48 56.64967618765291 +881 48 -2.485356477728732 +11 49 -10.37491366104901 +29 49 -1.570607252161773 +35 49 -1.570458970501697 +48 49 -9.404841096335833 +49 49 483.6396758884028 +373 49 -83.71754889512903 +797 49 -2.936829090241071 +802 49 68.67748314116832 +876 49 -2.936995381411789 +881 49 68.68098053079696 +7 50 2611.230612825626 +50 50 15807.49926166547 +51 50 2611.286665516508 +86 50 749.7005236587739 +221 50 -2615.741764336908 +644 50 4560.919121218822 +652 50 749.715925691222 +50 51 2611.285410541893 +51 51 15808.0328961789 +52 51 2611.410414223802 +644 51 749.7153163444144 +652 51 4561.064987233404 +660 51 749.7497998801518 +51 52 2611.409587187083 +52 52 15808.40265975671 +53 52 2611.409597678668 +652 52 749.7494196058768 +660 52 4561.165785856314 +668 52 749.7491898794962 +52 53 2611.410332048281 +53 53 15808.03653246058 +54 53 2611.286185329684 +660 53 749.7495720103406 +668 53 4561.06639319358 +676 53 749.7158380072647 +10 54 2611.230789582761 +53 54 2611.287859275458 +54 54 15807.50233671675 +85 54 749.7006298344019 +326 54 -2615.741941427122 +668 54 749.7166257710301 +676 54 4560.921097733317 +12 55 2611.218959388244 +55 55 15807.582718953 +56 55 2611.33993284234 +77 55 749.6859728073053 +402 55 -2615.730344327052 +724 55 4560.878475804066 +732 55 749.7206950816508 +55 56 2611.314716388024 +56 56 15808.52790012572 +57 56 2611.551595817586 +724 56 749.7132412663743 +732 56 4561.15244556966 +740 56 749.7821731318065 +56 57 2611.519242027749 +57 57 15809.4572926184 +58 57 2611.648278270929 +732 57 749.7729141873103 +740 57 4561.43087966203 +748 57 749.812629822232 +57 58 2611.616965263376 +58 58 15809.65494382853 +59 58 2611.605970794087 +740 58 749.8039440822331 +748 58 4561.510324464549 +756 58 749.8050358754373 +5 59 2611.591285381829 +58 59 2611.583255251814 +59 59 15809.53575748333 +94 59 749.802173187652 +250 59 -2616.108895948036 +748 59 749.7988211304776 +756 59 4561.493955897873 +1375 59 -769.3764048351875 +10 60 2611.333495761376 +60 60 15807.86244115949 +61 60 2611.304263213515 +85 60 749.7278972169966 +326 60 -2615.842793284658 +684 60 4561.015595776227 +692 60 749.7203411363034 +60 61 2611.305518732524 +61 61 15807.70318365285 +62 61 2611.280368539291 +684 61 749.7209446646577 +692 61 4560.977457304544 +700 61 749.7151560457758 +61 62 2611.280965322786 +62 62 15807.56838460918 +63 62 2611.260097095931 +692 62 749.7154382179251 +700 62 4560.944071726828 +708 62 749.7096718569957 +62 63 2611.25946871348 +63 63 15807.72795881888 +64 63 2611.335317407184 +700 63 749.7093401302691 +708 63 4560.984288834383 +716 63 749.7292519798855 +12 64 2611.340883774028 +63 64 2611.333485192825 +64 64 15807.97340198751 +77 64 749.7299253071934 +402 64 -2615.850050173454 +708 64 749.7284105871968 +716 64 4561.046403387217 +5 65 2611.693977326677 +65 65 15809.89326855951 +66 65 2611.599447882817 +94 65 749.8295139341342 +250 65 -2616.209729960921 +604 65 4561.587721309737 +612 65 749.8024428853171 +1027 65 -15647.73450706418 +1028 65 -2616.114647495253 +1375 65 -769.4037004433865 +65 66 2611.624754401516 +66 66 15809.3209705726 +67 66 2611.487007982928 +604 66 749.8099227209228 +612 66 4561.421096170543 +620 66 749.7695299586086 +1027 66 -2616.140320198274 +1028 66 -15647.16112377007 +1029 66 -2616.001202921549 +66 67 2611.519650054161 +67 67 15808.6229576583 +68 67 2611.3697263524 +612 67 749.7788794636535 +620 67 4561.209149888024 +628 67 749.7331597512549 +1028 67 -2616.034317607299 +1029 67 -15646.46122131669 +1030 67 -2615.882689274867 +67 68 2611.400623936674 +68 68 15808.22174701401 +69 68 2611.36349795986 +620 68 749.7417062649398 +628 68 4561.071336046532 +636 68 749.7267827524864 +1029 68 -2615.914036854427 +1030 68 -15646.05678445847 +1031 68 -2615.873749090643 +7 69 2611.329058765848 +68 69 2611.386375309654 +69 69 15808.05082891029 +86 69 749.7154398010161 +221 69 -2615.838451012345 +628 69 749.7330605091709 +636 69 4561.004057977723 +1030 69 -2615.896961039336 +1031 69 -15645.88291688797 +11 70 -18.12991068316681 +29 70 -5.906550344352112 +35 70 -5.905589546957165 +70 70 687.5647892735146 +71 70 42.6722276979098 +373 70 -89.52664267378378 +709 70 100.0136613040718 +710 70 5.174637147753277 +717 70 100.0131393972647 +718 70 5.172889943213956 +70 71 32.56203073532024 +71 71 1045.252437966802 +72 71 131.8214032554104 +709 71 1.709006979408302 +710 71 154.0050490872331 +711 71 19.21211496536845 +717 71 1.710015013822286 +718 71 153.9990344482915 +719 71 19.20939378337973 +71 72 115.3881839484048 +72 72 1651.444958678922 +73 72 275.0826768482981 +710 72 14.36894708546176 +711 72 249.0653102158155 +712 72 42.23043314011198 +718 72 14.36932669676914 +719 72 249.0489217166438 +720 72 42.22562863859 +72 73 246.587951712231 +73 73 2668.496980792643 +74 73 511.9597027111317 +711 73 35.08765545374219 +712 73 412.6496852753518 +713 73 80.86913346958792 +719 73 35.08616591267878 +720 73 412.6152607065021 +721 73 80.86065101599527 +73 74 460.1869539460064 +74 74 4413.746220601393 +75 74 916.7644649180231 +712 74 69.587035474369 +713 74 697.9293734123961 +714 74 147.5570930372534 +720 74 69.58198434222192 +721 74 697.8652724186127 +722 74 147.5425231042461 +74 75 820.4423490180556 +75 75 7468.472834406006 +76 75 1627.225378413479 +713 75 128.6156826975808 +714 75 1201.995209328445 +715 75 265.2779157083884 +721 75 128.604519774732 +722 75 1201.887004067188 +723 75 265.2552253849323 +75 76 1446.282958636824 +76 76 12904.97131950605 +77 76 2898.640364684873 +714 76 232.0234058273247 +715 76 2103.693234034578 +716 76 476.5952063206435 +722 76 232.0035005049585 +723 76 2103.528094099748 +724 76 476.5632470867363 +12 77 5244.97378788957 +55 77 867.1407243695726 +64 77 867.1775740819766 +76 77 2557.618423374167 +77 77 22707.0563244303 +402 77 -5223.686981768044 +715 77 416.4777207287069 +716 77 3733.715479181431 +723 77 416.4467008500109 +724 77 3733.494064068883 +9 78 -18.12986430214704 +25 78 -5.906551042379279 +44 78 -5.906287550356639 +78 78 687.5766179146981 +79 78 42.67356363741432 +297 78 -89.52742304813293 +669 78 100.0180970197452 +670 78 5.174637921783738 +677 78 100.0137225683169 +678 78 5.17465736036101 +78 79 32.56290481520799 +79 79 1045.27980953556 +80 79 131.8257143212236 +669 79 1.709617977062649 +670 79 154.0098881055866 +671 79 19.21225686281541 +677 79 1.709039166513907 +678 79 154.0050542902251 +679 79 19.21208068001059 +79 80 115.3915140977575 +80 80 1651.498975930936 +81 80 275.0927596745937 +670 80 14.36983739502052 +671 80 249.0694624833513 +672 80 42.23047525649024 +678 80 14.36894183401967 +679 80 249.0650955259484 +680 80 42.23036783055182 +80 81 246.596394201499 +81 81 2668.594605243253 +82 81 511.9788372574151 +671 81 35.08852199105212 +672 81 412.6509392010403 +673 81 80.86839775763748 +679 81 35.08762781042331 +680 81 412.6492087803501 +681 81 80.86900325423699 +81 82 460.2040361601456 +82 82 4413.907246236678 +83 82 916.796025581991 +672 82 69.58739530783157 +673 82 697.9225701286091 +674 82 147.554281228244 +680 82 69.58697515637719 +681 82 697.9280669202924 +682 82 147.5567459677543 +82 83 820.47198200803 +83 83 7468.714214301061 +84 83 1627.269466942609 +673 83 128.6143776843866 +674 83 1201.970634123075 +675 83 265.2706206093812 +681 83 128.6154104513024 +682 83 1201.992674968889 +683 83 265.2773551728689 +83 84 1446.327817400074 +84 84 12905.27780542145 +85 84 2898.685903973219 +674 84 232.0184575780579 +675 84 2103.631477029714 +676 84 476.5784813577075 +682 84 232.0229490811176 +683 84 2103.688706220868 +684 84 476.5940597706988 +10 85 5244.977968632289 +54 85 867.141112020654 +60 85 867.1750625860091 +84 85 2557.673648483454 +85 85 22707.31021531497 +326 85 -5223.691414058107 +675 85 416.4650127286455 +676 85 3733.576468761003 +683 85 416.4768225603436 +684 85 3733.705619663884 +7 86 5244.973609691231 +50 86 867.1410312924014 +69 86 867.1769775576686 +86 86 22707.05895798459 +87 86 2557.618796222345 +221 86 -5223.686804951212 +635 86 416.4599235607287 +636 86 3733.634532631993 +643 86 416.4648599634644 +644 86 3733.575919570975 +1031 86 -873.100051124433 +86 87 2898.641071041114 +87 87 12904.97185614766 +88 87 1446.282827275304 +634 87 232.0086540926321 +635 87 2103.591872464003 +636 87 476.5805108789234 +642 87 232.0181504482372 +643 87 2103.630162518411 +644 87 476.5784361194678 +87 88 1627.225189526363 +88 88 7468.472411533445 +89 88 820.4423764258474 +633 88 128.6059930005707 +634 88 1201.912645412765 +635 88 265.2626617021901 +641 88 128.614195951175 +642 88 1201.969178784059 +643 88 265.2703425569864 +88 89 916.7644480106247 +89 89 4413.746591611597 +90 89 460.1870264494648 +632 89 69.58177874836883 +633 89 697.8730523497941 +634 89 147.5454636409769 +640 89 69.58728688152983 +641 89 697.9217174347473 +642 89 147.5541221670103 +1491 89 -519.6596817673448 +89 90 511.9597909152387 +90 90 2668.497209047749 +91 90 246.5879214885246 +631 90 35.08540297302191 +632 90 412.6149692844431 +633 90 80.86150291661569 +639 90 35.08839447611003 +640 90 412.6501074642407 +641 90 80.86833970027227 +1462 90 -316.8181355809335 +1491 90 -2447.11905638088 +90 91 275.0826763658 +91 91 1651.444749633032 +92 91 115.3881731155286 +630 91 14.36851718842521 +631 91 249.0454654491203 +632 91 42.22571652973816 +638 91 14.36975558591543 +639 91 249.0686706294358 +640 91 42.23035145879486 +1433 91 -197.420912690015 +1462 91 -1424.13978673052 +1491 91 -350.1571313193939 +91 92 131.8213746089138 +92 92 1045.252443795794 +93 92 32.56203328132369 +629 92 1.709425585614962 +630 92 153.9947827001964 +631 92 19.20928013959588 +637 92 1.709582516457994 +638 92 154.0092905084531 +639 92 19.21219683494642 +1404 92 -125.8008254857708 +1433 92 -811.7451837373096 +1462 92 -218.108160763065 +8 93 -18.12990017687006 +34 93 -5.9058526472837 +40 93 -5.906271022834549 +92 93 42.67223283269635 +93 93 687.56477294455 +163 93 -89.52664515195062 +629 93 100.0091060655933 +630 93 5.172939626346253 +637 93 100.0176897882369 +638 93 5.17460610965939 +886 93 -15.99261450295859 +1404 93 -443.6371730048041 +1433 93 -139.5053922509859 +5 94 5245.709972568146 +59 94 867.2584836990108 +65 94 867.2923303864491 +94 94 22709.67279091134 +95 94 2557.820926815793 +250 94 -5224.42142222863 +603 94 416.4990820438225 +604 94 3734.079836795715 +755 94 416.4872211277361 +756 94 3733.950163476699 +1027 94 -873.2177284780146 +1346 94 -2595.037926036857 +1375 94 -22495.41237243404 +94 95 2898.867747103235 +95 95 12905.62260633149 +96 95 1446.299882956592 +602 95 232.0169519160721 +603 95 2103.736745530859 +604 95 476.6223603964312 +754 95 232.0125515636834 +755 95 2103.679950340167 +756 95 476.6065672321704 +1317 95 -1489.320868518791 +1346 95 -12691.40442433048 +1375 95 -2942.736157406373 +95 96 1627.244499167957 +96 96 7468.362774762054 +97 96 820.3898829660126 +601 96 128.6011773444993 +602 96 1201.931545589525 +603 96 265.2725692429794 +753 96 128.6000559358898 +754 96 1201.909443666614 +755 96 265.266051455503 +1288 96 -870.7756480713931 +1317 96 -7253.357916494229 +1346 96 -1676.54341575531 +96 97 916.7075479778966 +97 97 4413.390533483589 +98 97 460.1136157085209 +600 97 69.57174104660297 +601 97 697.8440012099537 +602 97 147.5427089565134 +752 97 69.57220806032348 +753 97 697.8383245278592 +754 97 147.54011581429 +1259 97 -519.5961610249248 +1288 97 -4196.148911667551 +1317 97 -972.944356821505 +97 98 511.8813729398654 +98 98 2668.103890818615 +99 98 246.5118046680285 +599 98 35.0737642613509 +600 98 412.5724305227587 +601 98 80.85418469960143 +751 98 35.07465221466438 +752 98 412.5742008312443 +753 98 80.85361571881117 +1230 98 -316.7576090238334 +1259 98 -2446.714068821134 +1288 98 -576.7377805724996 +98 99 275.0028377209186 +99 99 1651.089644491806 +100 99 115.3164091785043 +598 99 14.35690398736683 +599 99 249.0038518817982 +600 99 42.21737520967024 +750 99 14.35776181403496 +751 99 249.0081414644004 +752 99 42.2174448193886 +1201 99 -197.3695548037306 +1230 99 -1423.76599563051 +1259 99 -350.093374831824 +99 100 131.7473198100139 +100 100 1044.95558722443 +101 100 32.49814050361358 +597 100 1.698885804224041 +598 100 153.958967115872 +599 100 19.20122817820399 +749 100 1.699474736770508 +750 100 153.9637594870235 +751 100 19.20138592588206 +1172 100 -125.7593589291704 +1201 100 -811.4246877006933 +1230 100 -218.0550911971551 +6 101 -18.18429449956368 +30 101 -5.915202256571161 +39 101 -5.914935932131234 +100 101 42.6068298898303 +101 101 687.3412912230676 +192 101 -89.50284119452749 +597 101 99.98247150714548 +598 101 5.165791079967267 +749 101 99.9868844355677 +750 101 5.165777744130473 +882 101 -15.98918494360389 +1172 101 -443.3792712526491 +1201 101 -139.4629589166647 +1 102 7.380916866471509 +102 102 247.9722249436362 +103 102 10.07588745034396 +116 102 -3.779094921387692 +132 102 3.463048800642489 +490 102 -27.10316614521252 +757 102 9.480382355052614 +758 102 -3.815841518932833 +835 102 -7.241876612480754 +836 102 2.562339054471172 +102 103 9.603861460885678 +103 103 261.1999870389511 +104 103 11.2020129234444 +757 103 -3.80721233820145 +758 103 9.405871411076809 +759 103 -3.83702838607505 +834 103 -3.651366090528029 +835 103 10.85291871414701 +836 103 1.231259301659958 +103 104 10.99827336253848 +104 104 266.2470276087315 +105 104 10.99827336710004 +758 104 -3.834053803607717 +759 104 9.382860496685691 +760 104 -3.834053803630686 +833 104 -0.9540392810100364 +834 104 13.58859104868073 +835 104 -0.9540392800498365 +104 105 11.20201292767222 +105 105 261.1999870464306 +106 105 9.603861460828149 +759 105 -3.837028386089057 +760 105 9.405871411015271 +761 105 -3.807212338215263 +832 105 1.231259301661608 +833 105 10.85291871426717 +834 105 -3.651366082790331 +2 106 7.380915880826336 +105 106 10.07588745068888 +106 106 247.9722221501314 +107 106 -3.779094735112308 +127 106 3.463048584113774 +548 106 -27.10316472231067 +760 106 -3.81584151895561 +761 106 9.480381809393453 +832 106 2.562339014538171 +833 106 -7.241876612612606 +2 107 7.381108337846733 +106 107 -3.779094835320127 +107 107 247.9726996747058 +108 107 10.07603725106478 +127 107 3.462928674696262 +548 107 -27.10319584802873 +761 107 9.480378383268397 +766 107 -3.815841465065907 +810 107 -7.241516401729537 +811 107 2.562633808012754 +107 108 9.604025466409361 +108 108 261.1999644214437 +109 108 11.20186867493654 +761 108 -3.80721277859253 +766 108 9.405872974893589 +771 108 -3.837026355149302 +809 108 -3.65137037324018 +810 108 10.85309787978851 +811 108 1.231053557773482 +108 109 10.99816115705658 +109 109 266.2463850987083 +110 109 10.99815329546483 +766 109 -3.834052242118132 +771 109 9.382865287418538 +776 109 -3.834052380505957 +808 109 -0.9543131526851933 +809 109 13.58859667936326 +810 109 -0.9542488667012758 +109 110 11.20185550600605 +110 110 261.2000894431309 +111 110 9.604081753465287 +771 110 -3.837026439536314 +776 110 9.405872556366598 +781 110 -3.807213137086025 +807 110 1.231022922114652 +808 110 10.85316586903886 +809 110 -3.651333438525765 +3 111 7.381120511933045 +110 111 10.07609640153377 +111 111 247.9728018286703 +121 111 -3.779095058164401 +122 111 3.462919770783133 +519 111 -27.10320172044373 +776 111 -3.815841771479938 +781 111 9.480377625372103 +807 111 2.56266722709757 +808 111 -7.24140545730387 +4 112 7.381108337846729 +45 112 3.462928674696261 +112 112 247.9726996747055 +113 112 10.07603725106467 +117 112 -3.779094835320127 +461 112 -27.10319584802873 +772 112 -3.815841465065899 +777 112 9.480378383268398 +860 112 -7.241516401729498 +861 112 2.562633808012713 +112 113 9.604025466409382 +113 113 261.1999644214415 +114 113 11.20186867493524 +767 113 -3.837026355149298 +772 113 9.405872974893612 +777 113 -3.807212778592528 +859 113 -3.651370373242546 +860 113 10.85309787978845 +861 113 1.231053557773482 +113 114 10.9981611570552 +114 114 266.2463850987083 +115 114 10.99815329546623 +762 114 -3.834052380505964 +767 114 9.382865287418531 +772 114 -3.834052242118123 +858 114 -0.95431315268549 +859 114 13.58859667936326 +860 114 -0.9542488667009836 +114 115 11.20185550600735 +115 115 261.2000894431332 +116 115 9.604081753465268 +757 115 -3.807213137086027 +762 115 9.405872556366578 +767 115 -3.837026439536321 +857 115 1.231022922114654 +858 115 10.85316586903888 +859 115 -3.651333438523396 +1 116 7.381120511933039 +102 116 -3.779095058164402 +115 116 10.07609640153387 +116 116 247.9728018286706 +132 116 3.462919770783133 +490 116 -27.10320172044373 +757 116 9.480377625372109 +762 116 -3.815841771479945 +857 116 2.562667227097613 +858 116 -7.24140545730391 +4 117 7.380915880826336 +45 117 3.463048584113774 +112 117 -3.779094735112307 +117 117 247.9722221505748 +118 117 10.07588745086275 +461 117 -27.10316472231067 +777 117 9.480381809391574 +778 117 -3.815841518967091 +782 117 2.56233901460608 +783 117 -7.241876612679072 +117 118 9.60386146079915 +118 118 261.1999870502009 +119 118 11.2020129298034 +777 118 -3.807212338222228 +778 118 9.405871410984245 +779 118 -3.837028386096115 +782 118 1.23125930166244 +783 118 10.85291871432774 +784 118 -3.65136607888997 +118 119 10.99827336939945 +119 119 266.2470276087315 +120 119 10.99827336023908 +778 119 -3.83405380364226 +779 119 9.382860496685689 +780 119 -3.834053803596142 +783 119 -0.9540392814940413 +784 119 13.58859104868072 +785 119 -0.954039279565837 +119 120 11.20201292131323 +120 120 261.1999870351809 +121 120 9.603861460914686 +779 120 -3.837028386067993 +780 120 9.405871411107832 +781 120 -3.807212338194486 +784 120 -3.651366094428388 +785 120 10.85291871408643 +786 120 1.231259301659127 +3 121 7.380916866471502 +111 121 -3.77909492138769 +120 121 10.0758874501701 +121 121 247.9722249431929 +122 121 3.463048800642489 +519 121 -27.10316614521252 +780 121 -3.815841518921355 +781 121 9.480382355054488 +785 121 -7.241876612414287 +786 121 2.562339054403267 +3 122 -8.792465739320532 +111 122 3.211098770098018 +121 122 3.211308111111799 +122 122 255.2523006985207 +123 122 -7.036638676203538 +519 122 -28.05777602670002 +786 122 17.34405400695787 +791 122 -8.35088030756369 +807 122 17.34520380134843 +812 122 -8.350438604882418 +122 123 -7.44493485435135 +123 123 306.3118229087343 +124 123 -6.728007365405752 +786 123 1.029012495621857 +791 123 30.90527430117404 +796 123 -5.684661730198703 +807 123 1.02879080807972 +812 123 30.9071840008125 +817 123 -5.684289191414241 +123 124 -7.433960857538299 +124 124 363.7592885986026 +125 124 -7.373202429045222 +791 124 -0.5577891713241234 +796 124 43.98008622891125 +801 124 -3.819575192721015 +812 124 -0.5580018546029724 +817 124 43.98269743881099 +822 124 -3.819269887390488 +124 125 -8.179098222286317 +125 125 423.8394385230257 +126 125 -8.575833212960628 +796 125 -1.845778925018699 +801 125 56.64665110874607 +806 125 -2.485542550027041 +817 125 -1.845969292210215 +822 125 56.64991054454013 +827 125 -2.485340371206201 +9 126 -10.37491246880207 +25 126 -1.57060718877579 +44 126 -1.570431343928895 +125 126 -9.404865009724109 +126 126 483.6405374298561 +297 126 -83.71781730870001 +801 126 -2.936829217839419 +806 126 68.67748859463765 +822 126 -2.937007855994214 +827 126 68.68135834448135 +2 127 -8.792467933419381 +106 127 3.211308052423854 +107 127 3.211111604123242 +127 127 255.2521795354953 +128 127 -7.036631860794508 +548 127 -28.05776734678021 +811 127 17.34512316439422 +816 127 -8.350461022707506 +832 127 17.34405404225778 +837 127 -8.350879900210128 +127 128 -7.444925331692692 +128 128 306.3115655413991 +129 128 -6.727994488015991 +811 128 1.028806508185356 +816 128 30.90704588740881 +821 128 -5.684314350145801 +832 128 1.029012475157155 +837 128 30.90527380681112 +842 128 -5.684661390844313 +128 129 -7.433945368509619 +129 129 363.7588698998775 +130 129 -7.373182436026539 +816 129 -0.5579854847221082 +821 129 43.98249945212788 +826 129 -3.8192809294257 +837 129 -0.5577891282943073 +842 129 43.980085135289 +847 129 -3.819574956359192 +129 130 -8.17907681663899 +130 130 423.8389113916563 +131 130 -8.575810903182354 +821 130 -1.845961236400454 +826 130 56.64967618765291 +831 130 -2.485356477728732 +842 130 -1.845778830233436 +847 130 56.64664960575347 +852 130 -2.48554240387959 +8 131 -10.37491328043457 +34 131 -1.570622409584677 +40 131 -1.570443724400796 +130 131 -9.404841096335826 +131 131 483.6396787354248 +163 131 -83.71755089463029 +826 131 -2.936995381411789 +831 131 68.68107369430024 +847 131 -2.936829090241067 +852 131 68.67739065602382 +886 131 -14.81736619007091 +1 132 -8.792465739320532 +102 132 3.211308111111799 +116 132 3.211098770098018 +132 132 255.2523006985207 +133 132 -7.036638676203538 +490 132 -28.05777602670002 +836 132 17.34405400695787 +841 132 -8.35088030756369 +857 132 17.34520380134843 +862 132 -8.350438604882418 +132 133 -7.44493485435135 +133 133 306.3118229087343 +134 133 -6.728007365405752 +836 133 1.029012495621857 +841 133 30.90527430117404 +846 133 -5.684661730198703 +857 133 1.02879080807972 +862 133 30.9071840008125 +867 133 -5.684289191414241 +133 134 -7.433960857538299 +134 134 363.7592885986026 +135 134 -7.373202429045222 +841 134 -0.5577891713241234 +846 134 43.98008622891125 +851 134 -3.819575192721015 +862 134 -0.5580018546029724 +867 134 43.98269743881099 +872 134 -3.819269887390488 +134 135 -8.179098222286317 +135 135 423.8394385230257 +136 135 -8.575833212960628 +846 135 -1.845778925018699 +851 135 56.64665110874607 +856 135 -2.485542550027041 +867 135 -1.845969292210215 +872 135 56.64991054454013 +877 135 -2.485340371206201 +6 136 -10.37616672010447 +30 136 -1.570774279709866 +39 136 -1.570598301935586 +135 136 -9.404865009724109 +136 136 483.6312473370961 +192 136 -83.71131056872022 +851 136 -2.936829217839419 +856 136 68.6762475563679 +872 136 -2.937007855994214 +877 136 68.68011821042245 +882 136 -14.81633929968123 +13 137 -9515.537618394741 +137 137 24926.12146681972 +138 137 -11199.25545868677 +158 137 -1941.229756345855 +220 137 -3180.329465476641 +440 137 -1941.261096224976 +1022 137 -648.5022353419398 +1200 137 8221.919606748399 +1229 137 -3757.827662663403 +137 138 -10934.80566890646 +138 138 35458.23634979965 +139 138 -15768.65067900942 +1200 138 -3662.471463300632 +1229 138 11592.52428221024 +1258 138 -5324.21165959847 +138 139 -15342.51714687251 +139 139 56155.5889266835 +140 139 -22208.94513945938 +1229 139 -5162.135491982603 +1258 139 18094.14353915096 +1287 139 -7592.266773424615 +139 140 -21538.08770134174 +140 140 91338.11840239649 +141 140 -31343.21703697118 +1258 140 -7312.007186192246 +1287 140 28703.55014256967 +1316 140 -10983.55814305792 +140 141 -30326.13374854332 +141 141 152628.4234218627 +142 141 -44303.22011625041 +1287 141 -10481.00963586201 +1316 141 45926.06002395192 +1345 141 -16313.94580088931 +141 142 -42875.96631820689 +142 142 262134.8383971585 +143 142 -62199.68046296856 +1316 142 -15356.20501574702 +1345 142 73039.20768254949 +1374 142 -25277.6344188847 +142 143 -60563.93021132849 +143 143 463250.6843929382 +144 143 -84426.28742891033 +1345 143 -23289.70318605134 +1374 143 112166.8805587323 +1403 143 -41663.71311899116 +14 144 150882.6001750925 +143 144 -83816.91472001726 +144 144 805374.6375474314 +145 144 -11747.12722873832 +278 144 16181.73804894251 +435 144 -11749.83753362367 +1167 144 -9518.331739779813 +1374 144 -37126.91624485714 +1403 144 147126.6291650195 +14 145 3208.579924469537 +144 145 -63946.96292981726 +145 145 751398.1070133466 +146 145 3209.402724246611 +278 145 -15795.92220375785 +1167 145 147640.1443095469 +1168 145 -15794.70554598413 +1403 145 -25572.27204567896 +145 146 3209.472563338444 +146 146 751378.4777451586 +147 146 3212.145987520693 +1167 146 -15795.09908404986 +1168 146 147640.0510673145 +1169 146 -15792.47186707358 +146 147 3212.145080649367 +147 147 751354.8083887205 +148 147 3216.254094213342 +1168 147 -15793.00219949397 +1169 147 147640.2687729895 +1170 147 -15789.90215467484 +147 148 3215.586836261624 +148 148 751346.6812025351 +149 148 3226.890893263298 +1169 148 -15790.52049941353 +1170 148 147642.5678017592 +1171 148 -15786.09989041039 +15 149 3229.602559111307 +148 149 3226.048652203637 +149 149 751346.6031612451 +157 149 -63939.94513633887 +249 149 -15784.70174826053 +1170 149 -15786.61560167641 +1171 149 147644.9858986453 +16 150 -9515.849167112761 +150 150 24932.11726326263 +151 150 -11201.21166989595 +162 150 -1941.253923139527 +191 150 -3180.440021321346 +292 150 -1941.439258666297 +1026 150 -648.5113398851707 +1432 150 8223.840703267333 +1461 150 -3758.500168925333 +150 151 -10936.77039086089 +151 151 35468.21329797539 +152 151 -15770.15326503358 +1432 151 -3663.142066165357 +1461 151 11595.68410971456 +1490 151 -5324.754997172407 +151 152 -15344.0416402929 +152 152 56167.94254179341 +153 152 -22209.62807482445 +1461 152 -5162.676697683733 +1490 152 18097.92773349791 +152 153 -21538.79387037615 +153 153 91352.43672768235 +154 153 -31342.967895473 +1490 153 -7312.308166579673 +153 154 -30325.85485658382 +154 154 152642.3813501891 +155 154 -44302.54525565018 +154 155 -42875.04639730665 +155 155 262141.1709920774 +156 155 -62200.98951556267 +155 156 -60564.2872003513 +156 156 463229.7483187964 +157 156 -84436.82550719494 +15 157 150855.1935227505 +149 157 -11737.46769570919 +156 157 -83824.38931799834 +157 157 805281.0967376372 +249 157 16181.21205338817 +279 157 -11742.35985063217 +1171 157 -9513.796829449275 +13 158 1919.43382379879 +137 158 -1788.433948598482 +158 158 20355.39250514939 +159 158 1812.112982066108 +220 158 631.219832459549 +596 158 -1606.23988879247 +1022 158 6729.143813865714 +1023 158 594.0237663895847 +1200 158 -597.8206322486951 +158 159 1779.048746388647 +159 159 20923.35197085886 +160 159 1768.780725350689 +1022 159 583.4886381657413 +1023 159 6912.857035991745 +1024 159 579.0242339882991 +159 160 1757.361695466522 +160 160 21177.21150280709 +161 160 1757.336361208953 +1023 160 575.3921908756937 +1024 160 6995.265224131752 +1025 160 575.3818689771899 +160 161 1768.651327009473 +161 161 20925.05269771007 +162 161 1778.885948309162 +1024 161 578.9803522250288 +1025 161 6913.408941849299 +1026 161 583.4306254445247 +16 162 1919.22931226831 +150 162 -1788.518051256131 +161 162 1811.884105610864 +162 162 20358.2165788835 +191 162 631.1472001084667 +591 162 -1606.496082578782 +1025 162 593.9443988007367 +1026 162 6730.060825508495 +1432 162 -597.8501781879537 +8 163 -305.4952553923181 +34 163 -57.6812428459113 +40 163 -57.68444530275086 +93 163 -94.56257217187164 +131 163 -78.61481346085432 +163 163 1126.886115431222 +164 163 -286.4003181454265 +629 163 -16.2081311343887 +637 163 -16.20900102306938 +831 163 -14.72904777699648 +852 163 -14.7284288667849 +886 163 161.3342757059062 +891 163 -56.02203167472328 +1404 163 -52.45831909765079 +1405 163 -104.0729961959158 +163 164 -292.2455751957956 +164 164 1255.283808281413 +165 164 -266.0993914657693 +886 164 -56.55299948200481 +891 164 173.4641839683043 +896 164 -54.68955665545115 +1404 164 -101.2807348942416 +1405 164 -108.9071474558636 +1406 164 -117.711294498935 +164 165 -273.2896384016569 +165 165 1427.974700316033 +166 165 -244.2029844956963 +891 165 -55.34671475171964 +896 165 190.2634210304008 +901 165 -53.37102857842332 +1405 165 -114.2580907166942 +1406 165 -181.7556450733345 +1407 165 -133.5512147402743 +165 166 -252.375028266541 +166 166 1626.260627084181 +167 166 -202.3370631688613 +896 166 -54.12269018560897 +901 166 208.6683547425363 +906 166 -49.27468785694009 +1406 166 -129.6046370982028 +1407 166 -273.4215467506161 +1408 166 -151.2920043579146 +166 167 -211.7668185298909 +167 167 1852.89025484382 +168 167 -154.8151174927266 +901 167 -50.14760491388692 +906 167 228.6960857677179 +911 167 -44.56087775892239 +1407 167 -146.7125960841144 +1408 167 -387.3925469813943 +1409 167 -171.1351799711822 +167 168 -164.9329289855982 +168 168 2110.839905106712 +169 168 -90.28311027622027 +906 168 -45.50337237676356 +911 168 250.9135554268171 +916 168 -37.60635802131942 +1408 168 -166.1948573906576 +1409 168 -522.9531256021291 +1410 168 -193.7305295019559 +168 169 -101.2385340533799 +169 169 2406.075827490569 +170 169 -16.78640472783164 +911 169 -38.63294561339789 +916 169 275.7388351385871 +921 169 -29.59078135143882 +1409 169 -188.3537042032835 +1410 169 -684.1636462913218 +1411 169 -218.8836362680513 +169 170 -27.92712712615105 +170 170 2738.681488078897 +171 170 68.27722823926699 +916 170 -30.64046032569597 +921 170 303.561977770312 +926 170 -20.20505776310542 +1410 170 -213.3899815471392 +1411 170 -868.0236487011716 +1412 170 -247.2563975535519 +170 171 56.87916483035187 +171 171 3120.279350184025 +172 171 166.2441841666577 +921 171 -21.28426403700465 +926 171 335.4000760018318 +931 171 -9.353497387623587 +1411 171 -241.6120534930286 +1412 171 -1080.507590219256 +1413 171 -279.6818588761638 +171 172 155.155599272885 +172 172 3546.218803240437 +173 172 269.0143355300711 +926 172 -10.40793516744738 +931 172 371.1812290357822 +936 172 1.885601156747196 +1412 172 -274.1704012383087 +1413 172 -1316.378399553788 +1414 172 -315.0304633759305 +172 173 258.179148491265 +173 173 4036.692187527054 +174 173 391.1501370962347 +931 173 0.8514443589120617 +936 173 412.7422143325159 +941 173 15.18859882723049 +1413 173 -309.6278595355172 +1414 173 -1585.412287631048 +1415 173 -357.4487910344579 +173 174 380.9494707403194 +174 174 4580.198648154099 +175 174 510.469581526657 +936 174 14.21195611444764 +941 174 459.2800785781355 +946 174 27.91032009660482 +1414 174 -352.3489463484123 +1415 174 -1879.81326809234 +1416 174 -401.2943575358416 +174 175 500.8416921955605 +175 175 5208.920241044495 +176 175 659.7750616161251 +941 175 26.98612274153195 +946 175 513.740979815617 +951 175 43.67526104272635 +1415 175 -396.4701916602595 +1416 175 -2215.135372137074 +1417 175 -457.2708929263537 +175 176 650.9091691416475 +176 176 5901.72421936025 +177 176 797.0661006368011 +946 176 42.82239118458064 +951 176 574.3226404479565 +956 176 57.85668844745366 +1416 176 -452.8204362676912 +1417 176 -2579.854528221217 +1418 176 -511.4871424471854 +176 177 788.9050384626748 +177 177 6707.293283065655 +178 177 980.7523727155162 +951 177 57.07026084709511 +956 177 645.4962364758766 +961 177 76.59921602162181 +1417 177 -507.3844422063266 +1418 177 -2997.548387345101 +1419 177 -585.6953489614864 +177 178 973.2269288446513 +178 178 7606.947455346385 +179 178 1145.747944028558 +956 178 75.87301776013791 +961 178 725.5448021261324 +966 178 93.12977596304992 +1418 178 -581.9076473867519 +1419 178 -3459.074225164581 +1420 178 -654.9834609356678 +178 179 1139.127838946003 +179 179 8622.714318770219 +180 179 1363.045249249001 +961 179 92.49022745738675 +966 179 816.6260253310281 +971 179 114.6349663234606 +1419 179 -651.648261264962 +1420 179 -3973.96823532222 +1421 179 -748.2239582929217 +179 180 1356.933440986564 +180 180 9775.775447771413 +181 180 1570.586406846705 +966 180 114.0439981119373 +971 180 920.5360957183981 +976 180 134.9035154852347 +1420 180 -745.1425097899196 +1421 180 -4553.755371159223 +1422 180 -839.5677195846674 +180 181 1565.238876920289 +181 181 11072.66528862254 +182 181 1831.195895557945 +971 181 134.3860826929655 +976 181 1037.999722068521 +981 181 160.0961485503535 +1421 181 -836.8699868485346 +1422 181 -5200.568096066655 +1423 181 -956.268727385444 +181 182 1826.311374943268 +182 182 12551.59968729331 +183 182 2096.327898218117 +976 182 159.6232541212876 +981 182 1172.416602052829 +986 182 185.489533330868 +1422 182 -953.8034092597097 +1423 182 -5933.915050831781 +1424 182 -1076.950591766089 +182 183 2092.062746045834 +183 183 14208.40384770979 +184 183 2412.322788356321 +981 183 185.076421723492 +986 183 1323.476536593577 +991 183 215.5309535229553 +1423 183 -1074.797078505185 +1424 183 -6751.158628002995 +1425 183 -1222.549465775212 +183 184 2408.458117355307 +184 184 16106.09121720662 +185 184 2755.01413044097 +986 184 215.1565025490174 +991 184 1496.898379166784 +996 184 247.9076456864011 +1424 184 -1220.597587939151 +1425 184 -7683.546840950606 +1426 184 -1382.094678698436 +184 185 2751.639001979769 +185 185 18223.51321647672 +186 185 3141.088632881595 +991 185 247.5805383060513 +996 185 1690.775097393896 +1001 185 284.2019900229544 +1425 185 -1380.389655413156 +1426 185 -8720.500562873414 +1427 185 -1563.293980864149 +185 186 3138.049855145667 +186 186 20659.19256539418 +187 186 3587.548420400899 +996 186 283.9074183564831 +1001 186 1914.126529661227 +1006 186 326.0018658604541 +1426 186 -1561.758596591223 +1427 186 -9910.230552738656 +1428 186 -1774.19968113763 +186 187 3584.890429459412 +187 187 23365.99872501136 +188 187 4061.492576764294 +1001 187 325.7441639113503 +1006 187 2162.629141358346 +1011 187 370.2334294486749 +1427 187 -1772.856505074626 +1428 187 -11229.76173154693 +1429 187 -1999.246311515439 +187 188 4059.112283202103 +188 188 26492.79269390458 +189 188 4646.032222533873 +1006 188 370.0026213272666 +1011 188 2449.96495938805 +1016 188 424.6436443320874 +1428 188 -1998.043333115435 +1429 188 -12751.48886196529 +1430 188 -2277.927743476303 +188 189 4643.945172698684 +189 189 29953.45677941329 +190 189 5229.310523042157 +1011 189 424.4412503790854 +1016 189 2768.202305854553 +1021 189 478.8281675225302 +1429 189 -2276.872876692751 +1430 189 -14433.68399509043 +1431 189 -2556.908078349053 +189 190 5227.450366283942 +190 190 33967.9372650542 +191 190 5996.893981458541 +1016 190 478.6477624706413 +1021 190 3137.592857099473 +1026 190 550.0158704747296 +1430 190 -2555.967827826006 +1431 190 -16383.00775731726 +1432 190 -2924.951657570371 +16 191 6745.001707460176 +150 191 -3263.319007504096 +162 191 621.842020152608 +190 191 5995.258123726953 +191 191 38391.58078501763 +292 191 621.9087890689329 +591 191 -2470.349052650291 +1021 191 549.8572089451328 +1026 191 3544.793673499792 +1431 191 -2924.124739547055 +1432 191 -18529.4558550516 +6 192 -305.38230725778 +30 192 -57.6622553858216 +39 192 -57.66453978983814 +101 192 -94.53447594630438 +136 192 -78.6120807702835 +192 192 1126.68345185236 +193 192 -286.2829176225967 +597 192 -16.20293984794149 +749 192 -16.20364974848338 +856 192 -14.72796004131412 +877 192 -14.7285900335685 +882 192 161.3112139407682 +887 192 -56.00181295241148 +1172 192 -52.58326725583587 +1173 192 -104.0450288844025 +192 193 -292.1277730458278 +193 193 1255.065220895029 +194 193 -265.9740295752219 +882 193 -56.53290382883153 +887 193 173.442030139234 +892 193 -54.66733934672461 +1172 193 -101.2524637500818 +1173 193 -109.0468468886464 +1174 193 -117.6822718111592 +193 194 -273.1635107616213 +194 194 1427.729812245892 +195 194 -244.0694801846797 +887 194 -55.32462704213692 +892 194 190.2419067822966 +897 194 -53.3466031078559 +1173 194 -114.2288717746229 +1174 194 -181.912265602973 +1175 194 -133.5203226001298 +194 195 -252.2403288206035 +195 195 1625.985481076994 +196 195 -202.2007331701146 +892 195 -54.09838538662179 +897 195 208.6482853596855 +902 195 -49.24856204901329 +1174 195 -129.5737360746565 +1175 195 -273.5933259080894 +1176 195 -151.2603899953403 +195 196 -211.6287278154956 +196 196 1852.580794054603 +197 196 -154.6782365570727 +897 196 -50.12158637527654 +902 196 228.6785490598409 +907 196 -44.53316597607451 +1175 196 -146.6812254445926 +1176 196 -387.5762601688671 +1177 196 -171.1024225763088 +196 197 -164.7937533185649 +197 197 2110.490624551227 +198 197 -90.15152842187257 +902 197 -45.47574098368901 +907 197 250.8994959250995 +912 197 -37.5776023853197 +1176 197 -166.1626338033221 +1177 197 -523.1445051792659 +1178 197 -193.6974626367332 +197 198 -101.10404673948 +198 198 2405.680934756502 +199 198 -16.66412153073703 +907 198 -38.60424028292696 +912 198 275.7294701046735 +917 198 -29.56130730712989 +1177 198 -188.3215002350135 +1178 198 -684.3574718905355 +1179 198 -218.8502978669573 +198 199 -27.80148985243534 +199 199 2738.23397685282 +200 199 68.38546588441841 +912 199 -30.61100190831965 +917 199 303.5582038298332 +922 199 -20.17525244472609 +1178 199 -213.3577932000979 +1179 199 -868.2145913823933 +1180 199 -247.2230919112601 +199 200 56.99120426983281 +200 200 3119.771271843618 +201 200 166.3336187961452 +917 200 -21.25444122905391 +922 200 335.4030651421793 +927 200 -9.323704100691998 +1179 200 -241.5801788097729 +1180 200 -1080.690265499487 +1181 200 -279.6490118228854 +200 201 155.2490518725053 +201 201 3545.641879527427 +202 201 269.082536096748 +922 201 -10.3780955658391 +927 201 371.1917392165175 +932 201 1.915267633645538 +1180 201 -274.1391670035368 +1181 201 -1316.548238412057 +1182 201 -314.9977653113798 +201 202 258.2515450963612 +202 202 4036.03582994231 +203 202 391.191845967497 +927 202 0.8811811584316409 +932 202 412.7613401230939 +937 202 15.21792386822606 +1181 202 -309.5969248707856 +1182 202 -1585.565175164627 +1183 202 -357.4169014207775 +202 203 380.9953462636062 +203 203 4579.453344196083 +204 203 510.4850341433098 +932 203 14.24136766324692 +937 203 459.3084809730972 +942 203 27.93943422566416 +1182 203 -352.3188677486078 +1183 203 -1879.946265986532 +1184 203 -401.2624493220617 +203 204 500.8612479783812 +204 204 5208.072009569073 +205 204 659.757904260479 +937 204 27.01533465933884 +942 204 513.7797807061738 +947 204 43.70415216243421 +1183 204 -396.4401120790876 +1184 204 -2215.24589796906 +1185 204 -457.2396876343536 +204 205 650.8959199792816 +205 205 5900.762032872061 +206 205 797.0191512352721 +942 205 42.85138472620684 +947 205 574.3725131180636 +952 205 57.88560741503262 +1184 205 -452.7910059609507 +1185 205 -2579.941089705198 +1186 205 -511.4555137262927 +205 206 788.8617838501692 +206 206 6706.198593704231 +207 206 980.6669932567353 +947 206 57.09928342405409 +952 206 645.5584948948942 +957 206 76.62840226351369 +1185 206 -507.3545158029756 +1186 206 -2997.609369094097 +1187 206 -585.6638700743813 +206 207 973.1450295666189 +207 207 7605.70479136726 +208 207 1145.628569504284 +952 207 75.90230659007233 +957 207 725.6205026728065 +962 207 93.15947034187184 +1186 207 -581.877789791911 +1187 207 -3459.108624539898 +1188 207 -654.9511013659006 +207 208 1139.011577195558 +208 208 8621.304281442845 +209 208 1362.882893516364 +957 208 92.52001704068189 +962 208 816.7163623589564 +967 208 114.6656482963449 +1187 208 -651.6173641275113 +1188 208 -3973.9753871914 +1189 208 -748.1907948217379 +208 209 1356.773996717167 +209 209 9774.175768873647 +210 209 1570.383801034502 +962 209 114.0747716350481 +967 209 920.6426882718072 +972 209 134.9354111728104 +1188 209 -745.1107230973914 +1189 209 -4553.734133634181 +1190 209 -839.5330489442138 +209 210 1565.038844722231 +210 210 11070.8520942236 +211 210 1830.944396571413 +967 210 134.418061032279 +972 210 1038.124123553957 +977 210 160.1298898738515 +1189 210 -836.8365393715494 +1190 210 -5200.517629103692 +1191 210 -956.2321869158778 +210 211 1826.062245651532 +211 211 12549.54331874851 +212 211 2096.027615197695 +972 211 159.6570727824074 +977 211 1172.560974313282 +982 211 185.5254120737364 +1190 211 -953.7679994345206 +1191 211 -5933.833785356189 +1192 211 -1076.911644514528 +211 212 2091.764545285261 +212 212 14206.07494675154 +213 212 2411.96568756914 +977 212 185.1123692700857 +982 212 1323.642894944202 +987 212 215.5696572586936 +1191 212 -1074.759127770054 +1192 212 -6751.045244737265 +1193 212 -1222.507494520937 +212 213 2408.102912596222 +213 213 16103.45041187933 +214 213 2754.596423106775 +982 213 215.1952695347201 +987 213 1497.089621164562 +992 213 247.9496528908783 +1192 213 -1220.556526210347 +1193 213 -7683.398961226365 +1194 213 -1382.049105936243 +213 214 2751.222956880767 +214 214 18220.52434452974 +215 214 3140.603626893337 +987 214 247.6226013720574 +992 214 1690.993799612612 +997 214 284.2479397053162 +1193 214 -1380.344881487115 +1194 214 -8720.31617271391 +1195 214 -1563.244112104758 +214 215 3137.566350236938 +215 215 20655.80350229213 +216 215 3586.986584970442 +992 215 283.9534187731599 +997 215 1914.376564072639 +1002 215 326.0525894188954 +1194 215 -1561.709450246545 +1195 215 -9910.006130255966 +1196 215 -1774.144660567767 +215 216 3584.329910095292 +216 216 23362.16491570085 +217 216 4060.849866579582 +997 216 325.794932148626 +1002 216 2162.913760469653 +1007 216 370.289388342905 +1195 216 -1772.802118582492 +1196 216 -11229.49440757803 +1197 216 -1999.185555639223 +216 217 4058.470753744458 +217 217 26488.44527128252 +218 217 4645.290703219001 +1002 217 370.0586204437898 +1007 217 2450.289315628545 +1012 217 424.7062484451134 +1196 217 -1997.983146601737 +1197 217 -12751.17361747228 +1198 217 -2277.859831694764 +217 218 4643.204690132543 +218 218 29948.54091527396 +219 218 5228.470862528947 +1007 218 424.5038899044096 +1012 218 2768.570463125022 +1017 218 478.8975259737855 +1197 218 -2276.805465182251 +1198 218 -14433.31695789688 +1199 218 -2556.832762478737 +218 219 5226.611630840835 +219 219 33962.36208938828 +220 219 5995.926028641201 +1012 219 478.7171525853814 +1017 219 3138.01164833004 +1022 219 550.0942800363373 +1198 219 -2555.89295857145 +1199 219 -16382.58197979204 +1200 219 -2924.866588344092 +13 220 6743.898349199522 +137 220 -3263.230498666284 +158 220 621.9264420502057 +219 220 5994.290985144071 +220 220 38385.27950743277 +440 220 621.989021315464 +596 220 -2469.914454594852 +1017 220 549.9356464217859 +1022 220 3545.268158592643 +1199 220 -2924.040063586976 +1200 220 -18528.96656950107 +7 221 -15647.71493280782 +50 221 -2615.679604282991 +69 221 -2615.784520341719 +86 221 -4593.169226511267 +221 221 32602.64884907403 +222 221 -16576.24487711865 +636 221 -769.0203551535743 +644 221 -769.0026731314534 +1031 221 5379.291978669946 +1036 221 -2774.037942915856 +221 222 -16582.83984393046 +222 222 35588.15374750005 +223 222 -18470.50206749468 +1031 222 -2773.85455844226 +1036 222 5853.946541622644 +1041 222 -3094.963772536706 +222 223 -18480.27956585147 +223 223 40242.93322522986 +224 223 -20989.63082646851 +1036 223 -3094.691897599478 +1041 223 6595.13579844661 +1046 223 -3521.939511223193 +223 224 -21003.41589764979 +224 224 45567.30091768286 +225 224 -23447.07153714101 +1041 224 -3521.556210949804 +1046 224 7432.772984484434 +1051 224 -3942.271795727523 +224 225 -23467.38110231041 +225 225 51574.15725645634 +226 225 -26493.04535223275 +1046 225 -3941.707098482556 +1051 225 8361.722831272333 +1056 225 -4464.887587122494 +225 226 -26521.68475456983 +226 226 58474.3601963668 +227 226 -29626.07044705753 +1051 226 -4464.091320145796 +1056 226 9408.519224990834 +1061 226 -5009.120503788175 +226 227 -29667.93088279628 +227 227 66245.71097966682 +228 227 -33221.04863821635 +1056 227 -5007.956723501101 +1061 227 10554.08512239956 +1066 227 -5639.461094949241 +227 228 -33279.96966998215 +228 228 75215.41936633208 +229 228 -37112.48641682087 +1061 228 -5637.823147721097 +1066 228 11836.56317644088 +1071 228 -6332.834654104443 +228 229 -37197.70224173351 +229 229 85318.88145891753 +230 229 -41184.61628770966 +1066 229 -6330.466021054032 +1071 229 13213.3847048242 +1076 229 -7075.766505424012 +229 230 -41303.96274448372 +230 230 97038.2169532635 +231 230 -45821.22655163867 +1071 230 -7072.449742034902 +1076 230 14734.96640535328 +1081 230 -7938.091791099856 +230 231 -45991.33250884194 +231 231 110274.3445966706 +232 231 -50103.81638024689 +1076 231 -7933.365475436028 +1081 231 16321.03673473279 +1086 231 -8781.796681460868 +231 232 -50339.7159774504 +232 232 125696.6248469473 +233 232 -55258.13854590832 +1081 232 -8775.244487561162 +1086 232 18032.21531674299 +1091 232 -9815.54751856907 +232 233 -55587.5303072518 +233 233 143217.3562822695 +234 233 -59134.77331066861 +1086 233 -9806.40281857799 +1091 233 19731.79965384732 +1096 233 -10717.14267898236 +233 234 -59583.91511728 +234 234 163689.4010590041 +235 234 -64197.31542395683 +1091 234 -10704.68164996637 +1096 234 21485.52262850907 +1101 234 -11889.36793704984 +234 235 -64806.62577561157 +235 235 187284.4390427757 +236 235 -66614.9642712654 +1096 235 -11872.47876994881 +1101 235 23099.76168079215 +1106 235 -12778.32712223123 +235 236 -67438.71325775853 +236 236 214763.5042288353 +237 236 -70112.49778980578 +1101 236 -12755.52349394437 +1106 236 24568.439393161 +1111 236 -13955.52413675691 +236 237 -71158.56525429219 +237 237 246660.4986084905 +238 237 -69862.47055994839 +1106 237 -13926.61669961951 +1111 237 25756.00670255927 +1116 237 -14758.64694542881 +237 238 -71232.14106927812 +238 238 283610.4481474261 +239 238 -69579.14005972033 +1111 238 -14720.88479722984 +1116 238 26495.34133555652 +1121 238 -15730.29700741782 +238 239 -71244.30597179159 +239 239 326662.9180732623 +240 239 -64970.85272161455 +1116 239 -15684.52595202234 +1121 239 26744.19644024671 +1126 239 -16329.09607536673 +239 240 -67032.64477163677 +240 240 376538.3764997423 +241 240 -58890.63689547948 +1121 240 -16272.63562508639 +1126 240 26283.02037756789 +1131 240 -16934.40270181847 +240 241 -61267.66881029287 +241 241 434169.8979737708 +242 241 -48422.22273640632 +1126 241 -16869.60456583596 +1131 241 25146.282555194 +1136 241 -17226.12876976148 +241 242 -51185.06821880657 +242 242 500787.8895491036 +243 242 -35142.77220666426 +1131 242 -17151.20766721859 +1136 242 23136.33031710354 +1141 242 -17394.37507806053 +242 243 -38150.2812358743 +243 243 576739.7186830648 +244 243 -18240.95209170164 +1136 243 -17313.29374405249 +1141 243 20398.57049401243 +1146 243 -17379.9573369038 +243 244 -21519.30521308631 +244 244 664298.5894539616 +245 244 2645.730483596388 +1141 244 -17292.12007909786 +1146 244 16783.71089940864 +1151 244 -17184.44886036938 +244 245 -732.9323417843152 +245 245 762710.1318210802 +246 245 25590.12041486882 +1146 245 -17094.49534354272 +1151 245 12528.86704529243 +1156 245 -16978.25179922039 +245 246 22115.82485289944 +246 246 876064.9228726181 +247 246 53880.27344953856 +1151 246 -16886.32406626707 +1156 246 7502.662231022088 +1161 246 -16607.01328811989 +246 247 50461.15866301473 +247 247 1001979.848021721 +248 247 82123.47950480916 +1156 247 -16517.07581983488 +1161 247 1980.348906601219 +1166 247 -16378.41021389243 +247 248 78772.3944540885 +248 248 1147302.65748737 +249 248 117832.8053290342 +1161 248 -16290.73480856315 +1166 248 -4212.945489117854 +1171 248 -16053.68726150988 +15 249 210216.8349009124 +149 249 -5627.928485843207 +157 249 -40761.41451751325 +248 249 114647.7861870811 +249 249 1304625.936662118 +279 249 -5630.121808364125 +1166 249 -15970.75528734047 +1171 249 -10813.0709613999 +5 250 -15649.92262783113 +59 250 -2616.037472241433 +65 250 -2616.137238780746 +94 250 -4593.815428067835 +250 250 32607.17742618431 +251 250 -16578.58920608976 +604 250 -769.1284064297303 +756 250 -769.1014180359224 +1027 250 5380.005431728534 +1032 250 -2774.412912555924 +1375 250 9390.784173867311 +1376 250 -4873.316747275454 +250 251 -16585.18377130722 +251 251 35593.08586098339 +252 251 -18473.12324880375 +1027 251 -2774.229279980455 +1032 251 5854.720944909088 +1037 251 -3095.383561427641 +1375 251 -4871.987491248461 +1376 251 10202.77174155647 +1377 251 -5438.601992684649 +251 252 -18482.90015688824 +252 252 40248.49717070202 +253 252 -20992.62163950787 +1032 252 -3095.111318513688 +1037 252 6596.005798718637 +1042 252 -3522.419160417584 +1376 252 -5436.631555019843 +1377 252 11471.22036189778 +1378 252 -6190.417142774417 +252 253 -21006.40588769391 +253 253 45573.5821099579 +254 253 -23450.43087432433 +1037 253 -3522.035341075083 +1042 253 7433.749951715179 +1047 253 -3942.811643525329 +1377 253 -6187.639567411607 +1378 253 12894.73828357959 +1379 253 -6932.206150418939 +253 254 -23470.73924425635 +254 254 51581.23885772275 +255 254 -26496.86647238626 +1042 254 -3942.24618103411 +1047 254 8362.816680536231 +1052 254 -4465.503079758367 +1378 254 -6928.114883258708 +1379 254 14457.55497721855 +1380 254 -7854.664463851192 +254 255 -26525.50422029166 +255 255 58482.35067876236 +256 255 -29630.38082018782 +1047 255 -4464.705732775265 +1052 255 9409.7425796241 +1057 255 -5009.81703964827 +1379 255 -7848.896878667415 +1380 255 16198.1164278209 +1381 255 -8818.034965794317 +255 256 -29672.23889524055 +256 256 66254.70655492488 +257 256 -33225.93461013914 +1052 256 -5008.651679116294 +1057 256 10555.4462814982 +1062 256 -5640.253752080885 +1380 256 -8809.607983542675 +1381 256 18068.9984673456 +1382 256 -9935.63421781065 +256 257 -33284.85242161569 +257 257 75225.55520347322 +258 257 -37118.0197863067 +1057 257 -5638.613577593274 +1062 257 11838.07401179999 +1067 257 -6333.736887500552 +1381 257 -9923.778360612137 +1382 257 20121.54352562374 +1383 257 -11169.13298832555 +257 258 -37203.23114061756 +258 258 85330.26365248699 +259 258 -41190.86399040169 +1062 258 -6331.36502781311 +1067 258 13215.04736279737 +1072 258 -7076.791920582863 +1382 258 -11151.99647998711 +1383 258 22252.98102704462 +1384 258 -12497.56451508429 +258 259 -41310.20451486034 +259 259 97051.00926297656 +260 259 -45828.32526067535 +1067 259 -7073.470628694845 +1072 259 14736.78706201055 +1077 259 -7939.266095991263 +1383 259 -12473.58269978911 +1384 259 24523.18365549691 +1385 259 -14044.59893445299 +259 260 -45998.42334724743 +260 260 110288.6548305581 +261 260 -50111.79211653682 +1072 260 -7934.5333088631 +1077 260 16323.00185067367 +1082 260 -8783.130487374992 +1384 260 -14010.44996245409 +1385 260 26736.90060599855 +1386 260 -15578.48104250487 +260 261 -50347.68180577656 +261 261 125712.6441238889 +262 261 -55267.21600804717 +1077 261 -8776.569289826588 +1082 261 18034.31483207374 +1087 261 -9817.084137311735 +1385 261 -15531.18053558171 +1386 261 28951.96271814434 +1387 261 -17460.80954431265 +261 262 -55596.59566208597 +262 262 143235.1798738205 +263 262 -59144.89914957274 +1082 262 -9807.926815372786 +1087 262 19733.98587801108 +1092 262 -10718.88753600448 +1386 262 -17394.86095260324 +1387 262 30828.81583813889 +1388 262 -19156.98257049507 +262 263 -59594.0273174444 +263 263 163709.2434955208 +264 263 -64208.82026882283 +1087 263 -10706.40921347909 +1092 263 21487.74939848188 +1097 263 -11891.38746875093 +1387 263 -19067.22350762251 +1388 263 32410.85493242569 +1389 263 -21350.9277395014 +263 264 -64818.11679345353 +264 264 187306.3880139111 +265 264 -66627.66745051346 +1092 264 -11874.47470647196 +1097 264 23101.91769950448 +1102 264 -12780.62222754591 +1388 264 -21229.43245607006 +1389 264 33185.04630271588 +1390 264 -23150.42461097916 +264 265 -67451.40529955098 +265 265 214787.7454857718 +266 265 -70126.76732197433 +1097 265 -12757.78648339078 +1102 265 24570.39363053579 +1107 265 -13958.17739135117 +1389 265 -22986.61880377325 +1390 265 33028.30089647181 +1391 265 -25492.66937925424 +265 266 -71172.8317384284 +266 266 246687.1735670605 +267 266 -69877.99675139002 +1102 266 -13929.22885443771 +1107 266 25757.56396026663 +1112 266 -14761.66190930402 +1390 266 -25285.32484908304 +1391 266 31540.38431716408 +1392 266 -27359.09108697515 +266 267 -71247.67980622749 +267 267 283639.6901231568 +268 267 -69596.1434342764 +1107 267 -14723.84547967433 +1112 267 26496.23039855787 +1117 267 -15733.75296598521 +1391 267 -27088.62301044871 +1392 267 28225.73138381539 +1393 267 -29610.10290205794 +267 268 -71261.34700307406 +268 268 326694.9501710693 +269 268 -64988.90489690887 +1112 268 -15687.91529260943 +1117 268 26744.08778633044 +1122 268 -16333.00808649466 +1392 268 -29282.69311939997 +1393 268 22867.89780119598 +1394 268 -31477.64874805241 +268 269 -67050.77362372747 +269 269 376573.387695792 +270 269 -58909.66754431985 +1117 269 -16276.46432425076 +1122 269 26281.47374095408 +1127 269 -16938.83124034175 +1393 269 -31074.18464030057 +1394 269 14856.38466881375 +1395 269 -33529.94517154851 +269 270 -61286.82443913155 +270 270 434208.2484672315 +271 270 -48441.67612314734 +1122 270 -16873.93606852792 +1127 270 25142.81967775867 +1132 270 -17231.09799114871 +1394 270 -33067.19413779868 +1395 270 4195.222129957527 +1396 270 -35380.08915237714 +270 271 -51204.71033865618 +271 271 500829.9237140477 +272 271 -35162.24550967413 +1127 271 -17156.06295999635 +1132 271 23130.34286667172 +1137 271 -17399.92460224227 +1395 271 -34845.14079601091 +1396 271 -9719.212391514498 +1397 271 -37298.43278979055 +271 272 -38170.00704606918 +272 272 576785.9966986574 +273 272 -18259.86794055491 +1132 272 -17318.71804835863 +1137 272 20389.47064499739 +1142 272 -17386.12099980096 +1396 272 -36719.32320982951 +1397 272 -26540.46010935107 +1398 272 -39261.35426706542 +272 273 -21538.5456768385 +273 273 664349.7033562178 +274 273 2628.023791791464 +1137 273 -17298.14602432917 +1142 273 16770.76719505669 +1147 273 -17191.26496338296 +1397 273 -38633.5175527065 +1398 273 -46892.23517903018 +1399 273 -41331.41964969026 +273 274 -751.0212866269358 +274 274 762766.8453703478 +275 274 25574.03614358569 +1142 274 -17101.16837571528 +1147 274 12511.45000819963 +1152 274 -16985.76415358365 +1398 274 -40687.73081781708 +1399 274 -70089.54257537841 +1400 274 -43670.13715542456 +274 275 22099.30288699503 +275 275 876128.1322243683 +276 275 53866.58693044224 +1147 275 -16893.688272428 +1152 275 7479.960460342634 +1157 275 -16615.29886485424 +1399 275 -43011.40890516037 +1400 275 -96966.08379643157 +1401 275 -46343.83701083796 +275 276 50447.00231192073 +276 276 1002050.484019717 +277 276 82112.29499521427 +1152 276 -16525.21473292595 +1157 276 1951.733351719991 +1162 276 -16387.51078228449 +1400 276 -45698.38564702705 +1401 276 -126562.1307591191 +1402 276 -49375.07684990631 +276 277 78760.71621733654 +277 277 1147381.966178999 +278 277 117824.9743893712 +1157 277 -16299.69091812836 +1162 277 -4248.377008927571 +1167 277 -16063.76964329384 +1401 277 -48744.88187395076 +1402 277 -160187.4424756189 +1403 277 -53180.99014572021 +14 278 210227.3677408025 +144 278 -40753.95172512127 +145 278 -5636.434568405348 +277 278 114639.4590028438 +278 278 1304714.456860079 +435 278 -5638.921202298669 +1162 278 -15980.6998084399 +1167 278 -10855.88494698261 +1402 278 -52583.9978316943 +1403 278 -196265.2679720589 +15 279 3222.473796651655 +157 279 -63940.10013085288 +249 279 -15786.3491146794 +279 279 751324.6939977932 +280 279 3227.369420318319 +279 280 3226.003752714154 +280 280 751354.2687979734 +281 280 3236.78521027528 +280 281 3235.845356399914 +281 281 751374.4066369801 +282 281 3235.820930912829 +281 282 3236.762293354273 +282 282 751354.3677288843 +283 282 3226.004530489328 +17 283 3222.572643576124 +282 283 3227.34709270217 +283 283 751325.3625101671 +291 283 -63940.36840563826 +354 283 -15786.37512625499 +18 284 -9515.991882212953 +284 284 24932.68137301587 +285 284 -11201.62505044691 +296 284 -1941.449017459199 +325 284 -3180.487724196616 +368 284 -1941.418480981463 +284 285 -10937.12634404492 +285 285 35469.32420460632 +286 285 -15770.96199832639 +285 286 -15344.76381778635 +286 286 56169.94611086227 +287 286 -22211.05970647846 +286 287 -21540.10640785409 +287 287 91355.82034113946 +288 287 -31345.29521382478 +287 288 -30328.03588927207 +288 288 152647.7565775238 +289 288 -44305.97567631936 +288 289 -42878.31908307828 +289 289 262149.0825408975 +290 289 -62205.36182186718 +289 290 -60568.58090692447 +290 290 463239.6208961338 +291 290 -84441.0292286226 +17 291 150854.0211845584 +283 291 -11742.45190040135 +290 291 -83828.76128934286 +291 291 805289.1134492254 +354 291 16180.69185457087 +355 291 -11739.74008850064 +16 292 1919.397977188115 +150 292 -1788.651811793877 +191 292 631.202958865759 +292 292 20359.12712637779 +293 292 1811.90942609196 +591 292 -1606.543573618783 +1432 292 -597.8948822414127 +292 293 1778.894568990378 +293 293 20925.72957903596 +294 293 1768.344589997933 +293 294 1756.994469247849 +294 294 21178.09950439987 +295 294 1756.95882968374 +294 295 1768.308659393697 +295 295 20925.76416822265 +296 295 1778.947561392694 +18 296 1919.419784013685 +284 296 -1788.665399174302 +295 296 1811.959933399818 +296 296 20359.28523872671 +325 296 631.2101694819894 +581 296 -1606.549901488346 +9 297 -305.4974533321151 +25 297 -57.68234488107323 +44 297 -57.68460613141959 +78 297 -94.56394217108115 +126 297 -78.61499535613103 +297 297 1126.891986997088 +298 297 -286.4025406259993 +669 297 -16.20905660213877 +677 297 -16.20835046648553 +806 297 -14.72846685410267 +827 297 -14.7290964937487 +297 298 -292.2478324238382 +298 298 1255.290562912488 +299 298 -266.1016901827618 +298 299 -273.2919871478001 +299 299 1427.982746997521 +300 299 -244.2053442593015 +299 300 -252.377453599214 +300 300 1626.270231329089 +301 300 -202.3393274485904 +300 301 -211.7691686994145 +301 301 1852.901716692235 +302 301 -154.8172092316829 +301 302 -164.9351237485053 +302 302 2110.853558909004 +303 302 -90.28485412313125 +302 303 -101.2404007250049 +303 303 2406.092051891741 +304 303 -16.7876760028953 +303 304 -27.92853400238224 +304 304 2738.70066844018 +305 304 68.27657909753962 +304 305 56.87836704143872 +305 305 3120.301948911625 +306 305 166.2443141414883 +305 306 155.1555760859556 +306 306 3546.245245263811 +307 306 269.0153315788953 +306 307 258.1799876546714 +307 307 4036.723042837766 +308 307 391.1521957770037 +307 308 380.9513759335495 +308 308 4580.234389574048 +309 308 510.4727082462571 +308 309 500.844669484566 +309 309 5208.961592926876 +310 309 659.7795261025747 +309 310 650.9134925521785 +310 310 5901.771727479137 +311 310 797.0718141260645 +310 311 788.9106194886285 +311 311 6707.347894421712 +312 311 980.7597334545248 +311 312 973.2341654801961 +312 312 7607.009956415198 +313 312 1145.756794025529 +312 313 1139.136578398189 +313 313 8622.785680991732 +314 313 1363.056030937498 +313 314 1356.944119609883 +314 314 9775.85681793113 +315 314 1570.599032980848 +314 315 1565.251412176015 +315 315 11072.75787351324 +316 315 1831.210812351472 +315 316 1826.326208221123 +316 316 12551.70501481707 +317 316 2096.345137913486 +316 317 2092.079912466555 +317 317 14208.52341466181 +318 317 2412.342777727824 +317 318 2408.478040084068 +318 318 16106.22705417774 +319 318 2755.037090139856 +318 319 2751.661903307026 +319 319 18223.66717794739 +320 319 3141.114926406115 +319 320 3138.0760959954 +320 320 20659.36734268632 +321 320 3587.578555461653 +320 321 3584.92051836349 +321 321 23366.19661161232 +322 321 4061.526782401435 +321 322 4059.146447447123 +322 322 26493.01724877118 +323 322 4646.071434196019 +322 323 4643.984348028411 +323 323 29953.71083145796 +324 323 5229.354726178733 +323 324 5227.494537010392 +324 324 33968.22551335504 +325 324 5996.9447390187 +18 325 6745.058940019308 +284 325 -3263.380591028676 +296 325 621.9144850822908 +324 325 5995.308852766035 +325 325 38391.90669014151 +368 325 621.8517182774992 +581 325 -2470.36317156063 +10 326 -15647.72860166689 +54 326 -2615.67985657165 +60 326 -2615.779936453951 +85 326 -4593.207288631444 +326 326 32602.67674369168 +327 326 -16576.25945273435 +676 326 -769.002798440305 +684 326 -769.0298138833673 +326 327 -16582.85441360152 +327 327 35588.18423647034 +328 327 -18470.51847828855 +327 328 -18480.29596794451 +328 328 40242.96780969582 +329 328 -20989.64971412991 +328 329 -21003.43477324658 +329 329 45567.34023190074 +330 329 -23447.0929852625 +329 330 -23467.40253303658 +330 330 51574.20197377932 +331 330 -26493.07008013771 +330 331 -26521.70945862567 +331 331 58474.41121857971 +332 331 -29626.09881146317 +331 332 -29667.95921360372 +332 332 66245.76923108203 +333 332 -33221.08145294311 +332 333 -33280.00243966271 +333 333 75215.4861714638 +334 333 -37112.52450550422 +333 334 -37197.74026935377 +334 334 85318.9581369472 +335 334 -41184.66057691702 +334 335 -41304.00695535143 +335 335 97038.30551895866 +336 335 -45821.27862627646 +335 336 -45991.38448456238 +336 336 110274.4470092811 +337 336 -50103.8772534282 +336 337 -50339.77673533494 +337 337 125696.7442630607 +338 337 -55258.21094930616 +337 338 -55587.60258707259 +338 338 143217.495704424 +339 338 -59134.85810965283 +338 339 -59583.99980967792 +339 339 163689.5654929426 +340 339 -64197.41684285589 +339 340 -64806.72715028751 +340 340 187284.6333929476 +341 340 -66615.08243141137 +340 341 -67438.83151938702 +341 341 214763.7358712142 +342 341 -70112.6377427883 +341 342 -71158.70557135044 +342 342 246660.7756434638 +343 342 -69862.63070248719 +342 343 -71232.30203633572 +343 343 283610.7806603399 +344 343 -69579.3238096188 +343 344 -71244.4911912056 +344 344 326663.318261722 +345 344 -64971.0556147574 +344 345 -67032.85010481716 +345 345 376538.8580723208 +346 345 -58890.8577371031 +345 346 -61267.89321259554 +346 346 434170.4771238064 +347 346 -48422.45310405595 +346 347 -51185.30360395867 +347 347 500788.5835967163 +348 347 -35143.00467001637 +347 348 -38150.52010243652 +348 348 576740.5469771727 +349 348 -18241.17579405742 +348 349 -21519.53687253663 +349 349 664299.5729221376 +350 349 2645.528272950447 +349 350 -733.1436880170259 +350 350 762711.2918814665 +351 350 25589.94904926738 +350 351 22115.64322649205 +351 351 876066.2849873505 +352 351 53880.14885053624 +351 352 50461.02321317264 +352 352 1001981.435420307 +353 352 82123.40577527937 +352 353 78772.30945379785 +353 353 1147304.502405798 +354 353 117832.8008968111 +17 354 210217.1327063842 +283 354 -5630.166391125837 +291 354 -40762.27849887148 +353 354 114647.7705296771 +354 354 1304628.053456201 +355 354 -5627.689747145832 +17 355 3230.120002786316 +291 355 -63940.52935567147 +354 355 -15784.60435621776 +355 355 751341.8681920518 +356 355 3227.957977445709 +355 356 3228.297888373396 +356 356 751334.4040320795 +357 356 3225.987902514302 +356 357 3226.29822074635 +357 357 751327.6531199445 +358 357 3224.761243072739 +357 358 3224.37827600311 +358 358 751336.4643058091 +359 358 3230.694991155891 +19 359 3230.44315955491 +358 359 3230.15296186132 +359 359 751347.2501510917 +367 359 -63940.42287013578 +430 359 -15784.51230846316 +20 360 -9515.849089494477 +360 360 24932.1179811729 +361 360 -11201.21075149865 +372 360 -1941.415255358136 +401 360 -3180.439994167501 +436 360 -1941.279084527234 +360 361 -10936.77032710302 +361 361 35468.21160709823 +362 361 -15770.15526130819 +361 362 -15344.04218712216 +362 362 56167.94926370058 +363 362 -22209.62816683469 +362 363 -21538.79582657635 +363 363 91352.43173048274 +364 363 -31342.9641119163 +363 364 -30325.85161618052 +364 364 152642.3727021578 +365 364 -44302.54088236422 +364 365 -42875.04137299185 +365 365 262141.1751539831 +366 365 -62200.99018071768 +365 366 -60564.28362381297 +366 366 463229.7341276188 +367 366 -84436.82407947292 +19 367 150855.2235716188 +359 367 -11739.50778089141 +366 367 -83824.3971410752 +367 367 805281.0393854396 +430 367 16181.21994311258 +431 367 -11740.32941063187 +18 368 1919.240083152662 +284 368 -1788.630403077163 +325 368 631.150646345351 +368 368 20358.70289114286 +369 368 1811.886891405908 +581 368 -1606.505319665321 +368 369 1778.855452911344 +369 369 20926.1861059431 +370 369 1768.593432622057 +369 370 1757.226618510049 +370 370 21179.23246228265 +371 370 1757.226217744384 +370 371 1768.593444647525 +371 371 20926.18579645673 +372 371 1778.855099593759 +20 372 1919.230533734293 +360 372 -1788.621197753396 +371 372 1811.887768806202 +372 372 20358.68405395839 +401 372 631.1474953436971 +586 372 -1606.50237470712 +11 373 -305.4952368947331 +29 373 -57.68233398815067 +35 373 -57.68333857891675 +49 373 -78.61481256543333 +70 373 -94.56257370486452 +373 373 1126.886078372975 +374 373 -286.4002985727052 +709 373 -16.20833979814635 +717 373 -16.20878891908588 +802 373 -14.72846463608864 +881 373 -14.72901172821051 +373 374 -292.2455554393977 +374 374 1255.28376524322 +375 374 -266.0993700426332 +374 375 -273.2896166776507 +375 375 1427.974648141218 +376 375 -244.2029612711807 +375 376 -252.3750046105946 +376 376 1626.260563930142 +377 376 -202.3370393443276 +376 377 -211.766794102516 +377 377 1852.890178692845 +378 377 -154.8150937287704 +377 378 -164.9329044633492 +378 378 2110.839813684357 +379 378 -90.28308806086366 +378 379 -101.2385109014296 +379 379 2406.075718316956 +380 379 -16.78638518292021 +379 380 -27.92710651922857 +380 380 2738.681358552654 +381 380 68.27724378587789 +380 381 56.8791815649743 +381 381 3120.279197283939 +382 381 166.244194353239 +381 382 155.1556107026902 +382 382 3546.218624097522 +383 382 269.0143395662004 +382 383 258.179153816069 +383 383 4036.691978377662 +384 383 391.1501334102487 +383 384 380.9494683267151 +384 384 4580.198405798492 +385 384 510.4695700314692 +384 385 500.8416819479164 +385 385 5208.919960643036 +386 385 659.7750403161074 +385 386 650.9091490259023 +386 386 5901.723897214633 +387 386 797.0660702029409 +386 387 788.9050091455198 +387 387 6707.292912793016 +388 387 980.7523303295469 +387 388 973.2268875083967 +388 388 7606.947031639638 +389 388 1145.747890891236 +388 389 1139.127786746112 +389 389 8622.713835029233 +390 389 1363.04518231132 +389 390 1356.933374924628 +390 390 9775.774896262161 +391 390 1570.586326810417 +390 391 1565.238797657395 +391 391 11072.66466114615 +392 391 1831.195799400602 +391 392 1826.31127949752 +392 392 12551.59897352163 +393 392 2096.327785805426 +392 393 2092.062634258067 +393 393 14208.40303748434 +394 393 2412.322656825705 +393 394 2408.45798639347 +394 394 16106.09029678508 +395 394 2755.01397835616 +394 395 2751.638850393431 +395 395 18223.51217328247 +396 395 3141.088457822162 +395 396 3138.049680536259 +396 396 20659.1913812028 +397 396 3587.548218964577 +396 397 3584.890228417566 +397 397 23365.9973842764 +398 397 4061.492347446448 +397 398 4059.112054238105 +398 398 26492.79117251984 +399 398 4646.031959018253 +398 399 4643.944909493724 +399 399 29953.45505820831 +400 399 5229.310225474412 +399 400 5227.450068993365 +400 400 33967.93531219634 +401 400 5996.893639259702 +20 401 6745.001320108599 +360 401 -3263.319111644827 +372 401 621.8510177853784 +400 401 5995.257781772056 +401 401 38391.57857709526 +436 401 621.8999680306624 +586 401 -2470.348914649652 +12 402 -15647.7154657259 +55 402 -2615.677640538952 +64 402 -2615.787366045126 +77 402 -4593.169051996121 +402 402 32602.64993504008 +403 402 -16576.24544329383 +716 402 -769.0319097156209 +724 402 -768.9912925807542 +402 403 -16582.8404098791 +403 403 35588.15492831563 +404 403 -18470.5027008644 +403 404 -18480.28019888692 +404 404 40242.93455467482 +405 404 -20989.63154955028 +404 405 -21003.41662026312 +405 405 45567.30241473958 +406 405 -23447.07234998601 +405 406 -23467.3819144706 +406 406 51574.15893880033 +407 406 -26493.04627766064 +406 407 -26521.68567904163 +407 407 58474.36208687673 +408 407 -29626.07149229691 +407 408 -29667.93192665605 +408 408 66245.71309668742 +409 408 -33221.04982482568 +408 409 -33279.97085468143 +409 409 75215.4217359234 +410 409 -37112.48776323067 +409 410 -37197.70358543907 +410 410 85318.88409696886 +411 410 -41184.61781165107 +410 411 -41303.96426474062 +411 411 97038.2198866273 +412 411 -45821.2282880389 +411 412 -45991.33424017417 +412 412 110274.3478326784 +413 412 -50103.81833867973 +412 413 -50339.7179291728 +413 413 125696.6284084182 +414 413 -55258.14078376346 +413 414 -55587.53253628565 +414 414 143217.3601582467 +415 414 -59134.77582156802 +414 415 -59583.91761706979 +415 415 163689.4052616035 +416 415 -64197.31829212866 +415 416 -64806.62863022232 +416 416 187284.4435363798 +417 416 -66614.96746525168 +416 417 -67438.7164358787 +417 417 214763.5089946314 +418 417 -70112.50140347549 +417 418 -71158.56885148336 +418 418 246660.5036059679 +419 418 -69862.47453585653 +418 419 -71232.14502915769 +419 419 283610.4533236384 +420 419 -69579.14445754091 +419 420 -71244.31035776077 +420 420 326662.923396999 +421 420 -64970.85745749439 +420 421 -67032.6495032574 +421 421 376538.3819285514 +422 421 -58890.64195900757 +421 422 -61267.67388181337 +422 422 434169.9035241157 +423 422 -48422.2280101084 +422 423 -51185.07351740653 +423 423 500787.8952358049 +424 423 -35142.77760005009 +423 424 -38150.28667355928 +424 424 576739.7246042725 +425 424 -18240.95747429287 +424 425 -21519.3106623091 +425 425 664298.5957081494 +426 425 2645.725257972303 +425 426 -732.9376540797894 +426 426 762710.1385799539 +427 426 25590.11544688566 +426 427 22115.8197787178 +427 427 876064.9303069918 +428 427 53880.26890278412 +427 428 50461.15399660714 +428 428 1001979.856337517 +429 428 82123.47541562151 +428 429 78772.39023461439 +429 429 1147302.666903682 +430 429 117832.8018580575 +19 430 210216.8355906836 +359 430 -5627.456003749245 +367 430 -40761.40444171257 +429 430 114647.7825816156 +430 430 1304625.947246242 +431 430 -5630.616427117584 +19 431 3221.60332908354 +367 431 -63939.6566453472 +430 431 -15786.55044451096 +431 431 751324.0900786064 +432 431 3223.242354768074 +431 432 3222.144974617258 +432 432 751364.5306902251 +433 432 3227.993775818679 +432 433 3227.342648224454 +433 433 751401.5787520484 +434 433 3221.668025780476 +433 434 3222.918465250194 +434 434 751398.4604810249 +435 434 3207.155899452853 +14 435 3201.016782754559 +144 435 -63946.815756358 +278 435 -15797.69844627076 +434 435 3208.783024266886 +435 435 751381.6190226956 +1403 435 -25572.04878216446 +20 436 1919.396767996553 +360 436 -1788.548897722279 +401 436 631.2026697226469 +436 436 20358.65903019577 +437 436 1811.905649005746 +586 436 -1606.537119152599 +436 437 1778.925585521279 +437 437 20924.59547146233 +438 437 1768.402571639304 +437 438 1757.104516821024 +438 438 21176.07972404392 +439 438 1757.094318422788 +438 439 1768.496112090965 +439 439 20922.93320898164 +440 439 1779.140096062863 +13 440 1919.613188516682 +137 440 -1788.469829013941 +220 440 631.2792421526091 +439 440 1812.185812977595 +440 440 20355.97566120972 +596 440 -1606.284527652531 +1200 440 -597.8326585473704 +21 441 -1320.32526709801 +441 441 9264.263546613247 +442 441 -1507.307507718495 +456 441 -724.2630865824693 +518 441 -442.5614511117486 +592 441 -17.16718476308649 +441 442 -1452.755872289342 +442 442 9343.807577418816 +443 442 -1564.888515124109 +442 443 -1549.404259467755 +443 443 9411.590446410522 +444 443 -1549.404259266906 +443 444 -1564.888514952325 +444 444 9343.807577581387 +445 444 -1452.755872335514 +22 445 -1320.325193288085 +444 445 -1507.307507735581 +445 445 9264.263222985021 +446 445 -724.2629081437335 +576 445 -442.5614261447797 +587 445 -17.16718135121699 +22 446 -1320.315091800366 +445 446 -724.2626218115831 +446 446 9264.243113594939 +447 446 -1507.302178083143 +576 446 -442.5580677469507 +587 446 -17.1831139669309 +446 447 -1452.751147329755 +447 447 9343.785965252073 +448 447 -1564.89159538587 +447 448 -1549.407830467409 +448 448 9411.563044160877 +449 448 -1549.409488322192 +448 449 -1564.892666056389 +449 449 9343.785757492187 +450 449 -1452.749366227278 +23 450 -1320.314989914903 +449 450 -1507.300875882614 +450 450 9264.242217936449 +455 450 -724.2626957590451 +547 450 -442.5580349667794 +577 450 -17.18434642020797 +24 451 -1320.325193288085 +451 451 9264.263223044745 +452 451 -1507.307507744194 +460 451 -724.2629081437335 +489 451 -442.5614261447797 +582 451 -17.16718135121697 +451 452 -1452.755872358788 +452 452 9343.807577663338 +453 452 -1564.888514865731 +452 453 -1549.40425916566 +453 453 9411.590446410522 +454 453 -1549.404259569001 +453 454 -1564.888515210703 +454 454 9343.807577336866 +455 454 -1452.755872266068 +23 455 -1320.32526709801 +450 455 -724.2630865824693 +454 455 -1507.307507709882 +455 455 9264.263546553524 +547 455 -442.5614511117486 +577 455 -17.16718476308649 +21 456 -1320.314989914903 +441 456 -724.2626957590452 +456 456 9264.242217936488 +457 456 -1507.30087588262 +518 456 -442.5580349667794 +592 456 -17.18434642020797 +456 457 -1452.749366227293 +457 457 9343.785757492236 +458 457 -1564.892666056337 +457 458 -1549.409488322131 +458 458 9411.563044160877 +459 458 -1549.407830467471 +458 459 -1564.891595385923 +459 459 9343.785965252026 +460 459 -1452.751147329741 +24 460 -1320.315091800366 +451 460 -724.2626218115831 +459 460 -1507.302178083138 +460 460 9264.243113594905 +489 460 -442.5580677469507 +582 460 -17.1831139669309 +4 461 -58.68250256592914 +45 461 -32.54771381629592 +112 461 -29.2850387366023 +117 461 -29.28493701514206 +461 461 425.4001500297366 +462 461 -46.85689351142511 +777 461 -6.954593393792564 +782 461 -9.840519734998935 +861 461 -9.840481344605269 +461 462 -49.84263145212045 +462 462 490.8503538642395 +463 462 -32.55977384537691 +462 463 -36.07139826095006 +463 463 575.0712058505967 +464 463 -17.31862906199467 +463 464 -21.13081201674509 +464 464 672.6727899563947 +465 464 4.636336430841016 +464 465 0.4326099069363067 +465 465 785.3958675338831 +466 465 28.42963200122143 +465 466 24.11202677195025 +466 466 913.5343252075344 +467 466 57.87403743280922 +466 467 53.38571997075056 +467 467 1060.401119752525 +468 467 90.25018199892726 +467 468 85.85227627572688 +468 468 1224.861751609282 +469 468 126.6385651082606 +468 469 122.2846129456885 +469 469 1412.971094667673 +470 469 167.8706248580362 +469 470 163.7542632925871 +470 470 1621.569284897384 +471 470 211.0516651253027 +470 471 207.1259381397582 +471 471 1860.758191361565 +472 471 262.3932511449675 +471 472 258.7720278322519 +472 472 2124.439751415688 +473 472 313.0127500636994 +472 473 309.6518747769009 +473 473 2428.29940296837 +474 473 377.0500626796781 +473 474 373.9975010493083 +474 474 2761.947974793538 +475 474 436.5860859934581 +474 475 433.8072809722928 +475 475 3148.733177920877 +476 475 517.427404347128 +475 476 514.8880092862464 +476 476 3579.830243215913 +477 476 590.7630041470014 +476 477 588.5450025929606 +477 477 4065.39191791346 +478 477 688.6089613477216 +477 478 686.5728210092894 +478 478 4615.973476668915 +479 478 782.8244276548721 +478 479 781.0508834943671 +479 479 5234.28612211477 +480 479 902.2516964951228 +479 480 900.6374275464764 +480 480 5938.859718013471 +481 480 1024.512612717871 +480 481 1023.106958773814 +481 481 6727.449772651658 +482 481 1171.126677581678 +481 482 1169.855788336162 +482 482 7630.238081387413 +483 482 1330.851867239104 +482 483 1329.743866546986 +483 483 8637.01793809958 +484 483 1511.474870992087 +483 484 1510.478626862189 +484 484 9794.73607690728 +485 484 1721.015407799085 +484 485 1720.144918849621 +485 485 11080.92063733323 +486 485 1943.945346761584 +485 486 1943.166443585903 +486 486 12566.34653267818 +487 486 2219.495033769993 +486 487 2218.812528012878 +487 487 14210.08265950397 +488 487 2494.793810939413 +487 488 2494.185808800393 +488 488 16116.59957181159 +489 488 2857.611085915054 +24 489 3203.471168416002 +451 489 -489.863443182881 +460 489 -489.8604493963105 +488 489 2857.076607057394 +489 489 18217.38193447778 +582 489 -949.3396525370739 +1 490 -58.68253062121963 +102 490 -29.28493773756829 +116 490 -29.28505233877633 +132 490 -32.54773189780267 +490 490 425.400169612749 +491 490 -46.85692257495555 +757 490 -6.954593759869057 +836 490 -9.840519987011888 +857 490 -9.840481303696524 +490 491 -49.84266052893805 +491 491 490.8503714025959 +492 491 -32.55980439579023 +491 492 -36.07142893889223 +492 492 575.0712228776576 +493 492 -17.31866089216193 +492 493 -21.13084410668834 +493 493 672.6728071369143 +494 493 4.636304373380121 +493 494 0.432577433748321 +494 494 785.3958855728725 +495 494 28.42960024212655 +494 495 24.11199446094094 +495 495 913.5343452267332 +496 495 57.8740069314714 +495 496 53.38568877718271 +496 496 1060.401142779173 +497 496 90.25015336076753 +496 497 85.85224685566466 +497 497 1224.861778913776 +498 497 126.6385389614981 +497 498 122.2845859356306 +498 498 1412.971127394843 +499 498 167.8706017439194 +498 499 163.7542392901301 +499 499 1621.569324245986 +500 499 211.0516452684323 +499 500 207.1259173780032 +500 500 1860.758238540738 +501 500 262.3932350364923 +500 501 258.7720108449475 +501 501 2124.439807521516 +502 501 313.0127375771274 +501 502 309.6518614412292 +502 502 2428.299469367106 +503 502 377.0500543644839 +502 503 373.9974919382381 +503 503 2761.948052564453 +504 503 436.5860814462866 +503 504 433.807275682597 +504 504 3148.733268764083 +505 504 517.4274043270115 +504 505 514.8880085743068 +505 505 3579.83034851345 +506 505 590.7630080934551 +505 506 588.5450059260036 +506 506 4065.392039418659 +507 506 688.6089700387627 +506 507 686.5728291305794 +507 507 4615.973616337651 +508 507 782.8244407242244 +507 508 781.0508960628787 +508 508 5234.286282093379 +509 508 902.2517146825234 +508 509 900.6374452747469 +509 509 5938.859900936402 +510 509 1024.512635927197 +509 510 1023.106981581106 +510 510 6727.44998116019 +511 510 1171.126706497543 +510 511 1169.855816886951 +511 511 7630.238319016443 +512 511 1330.851902146264 +511 512 1329.743901134776 +512 512 8637.018208115447 +513 512 1511.474912456164 +512 513 1510.478668038347 +513 513 9794.736384026179 +514 513 1721.015456649066 +513 514 1720.144967447504 +514 514 11080.9209855958 +515 514 1943.945403325702 +514 515 1943.166499924083 +515 515 12566.34692834686 +516 515 2219.495099660702 +515 516 2218.812593705361 +516 516 14210.08310756695 +517 516 2494.793886058434 +516 517 2494.185883742653 +517 517 16116.60008055783 +518 517 2857.61117300408 +21 518 3203.471268915362 +441 518 -489.863501711604 +456 518 -489.8603998894832 +517 518 2857.076693990914 +518 518 18217.38250994123 +592 518 -949.3400794662649 +3 519 -58.68253062121963 +111 519 -29.28505233877633 +121 519 -29.28493773756829 +122 519 -32.54773189780267 +519 519 425.400169612749 +520 519 -46.85692257495555 +781 519 -6.954593759869058 +786 519 -9.840519987011888 +807 519 -9.840481303696524 +519 520 -49.84266052893805 +520 520 490.8503714025959 +521 520 -32.55980439579023 +520 521 -36.07142893889223 +521 521 575.0712228776576 +522 521 -17.31866089216193 +521 522 -21.13084410668834 +522 522 672.6728071369143 +523 522 4.636304373380128 +522 523 0.4325774337483281 +523 523 785.3958855728725 +524 523 28.42960024212655 +523 524 24.11199446094094 +524 524 913.5343452267332 +525 524 57.8740069314714 +524 525 53.38568877718271 +525 525 1060.401142779173 +526 525 90.25015336076753 +525 526 85.85224685566466 +526 526 1224.861778913776 +527 526 126.6385389614981 +526 527 122.2845859356306 +527 527 1412.971127394843 +528 527 167.8706017439194 +527 528 163.7542392901301 +528 528 1621.569324245986 +529 528 211.0516452684323 +528 529 207.1259173780032 +529 529 1860.758238540738 +530 529 262.3932350364923 +529 530 258.7720108449475 +530 530 2124.439807521516 +531 530 313.0127375771274 +530 531 309.6518614412292 +531 531 2428.299469367106 +532 531 377.0500543644839 +531 532 373.9974919382381 +532 532 2761.948052564453 +533 532 436.5860814462866 +532 533 433.807275682597 +533 533 3148.733268764083 +534 533 517.4274043270115 +533 534 514.8880085743068 +534 534 3579.83034851345 +535 534 590.7630080934553 +534 535 588.5450059260036 +535 535 4065.392039418659 +536 535 688.6089700387627 +535 536 686.5728291305794 +536 536 4615.973616337651 +537 536 782.8244407242244 +536 537 781.0508960628787 +537 537 5234.286282093379 +538 537 902.2517146825234 +537 538 900.6374452747469 +538 538 5938.859900936402 +539 538 1024.512635927197 +538 539 1023.106981581106 +539 539 6727.44998116019 +540 539 1171.126706497543 +539 540 1169.855816886951 +540 540 7630.238319016443 +541 540 1330.851902146264 +540 541 1329.743901134776 +541 541 8637.018208115447 +542 541 1511.474912456164 +541 542 1510.478668038347 +542 542 9794.736384026179 +543 542 1721.015456649066 +542 543 1720.144967447504 +543 543 11080.9209855958 +544 543 1943.945403325702 +543 544 1943.166499924083 +544 544 12566.34692834686 +545 544 2219.495099660702 +544 545 2218.812593705361 +545 545 14210.08310756695 +546 545 2494.793886058434 +545 546 2494.185883742653 +546 546 16116.60008055783 +547 546 2857.61117300408 +23 547 3203.471268915362 +450 547 -489.8603998894832 +455 547 -489.863501711604 +546 547 2857.076693990914 +547 547 18217.38250994123 +577 547 -949.3400794662649 +2 548 -58.68250256592914 +106 548 -29.28493701514206 +107 548 -29.28503873660229 +127 548 -32.54771381629592 +548 548 425.4001500297366 +549 548 -46.8568935114251 +761 548 -6.954593393792566 +811 548 -9.840481344605269 +832 548 -9.840519734998935 +548 549 -49.84263145212044 +549 549 490.8503538642395 +550 549 -32.55977384537691 +549 550 -36.07139826095006 +550 550 575.0712058505966 +551 550 -17.31862906199467 +550 551 -21.13081201674509 +551 551 672.6727899563947 +552 551 4.636336430841016 +551 552 0.4326099069363103 +552 552 785.3958675338831 +553 552 28.42963200122142 +552 553 24.11202677195026 +553 553 913.5343252075343 +554 553 57.87403743280922 +553 554 53.38571997075056 +554 554 1060.401119752526 +555 554 90.25018199892726 +554 555 85.85227627572687 +555 555 1224.861751609282 +556 555 126.6385651082606 +555 556 122.2846129456885 +556 556 1412.971094667673 +557 556 167.8706248580362 +556 557 163.7542632925871 +557 557 1621.569284897384 +558 557 211.0516651253027 +557 558 207.1259381397583 +558 558 1860.758191361565 +559 558 262.3932511449675 +558 559 258.7720278322519 +559 559 2124.439751415688 +560 559 313.0127500636994 +559 560 309.6518747769009 +560 560 2428.29940296837 +561 560 377.0500626796781 +560 561 373.9975010493083 +561 561 2761.947974793539 +562 561 436.5860859934581 +561 562 433.8072809722929 +562 562 3148.733177920878 +563 562 517.427404347128 +562 563 514.8880092862464 +563 563 3579.830243215913 +564 563 590.7630041470014 +563 564 588.5450025929606 +564 564 4065.39191791346 +565 564 688.6089613477216 +564 565 686.5728210092896 +565 565 4615.973476668916 +566 565 782.8244276548721 +565 566 781.0508834943671 +566 566 5234.28612211477 +567 566 902.2516964951228 +566 567 900.6374275464764 +567 567 5938.859718013471 +568 567 1024.512612717871 +567 568 1023.106958773814 +568 568 6727.449772651658 +569 568 1171.126677581678 +568 569 1169.855788336162 +569 569 7630.238081387412 +570 569 1330.851867239104 +569 570 1329.743866546986 +570 570 8637.017938099578 +571 570 1511.474870992087 +570 571 1510.478626862189 +571 571 9794.73607690728 +572 571 1721.015407799085 +571 572 1720.144918849621 +572 572 11080.92063733323 +573 572 1943.945346761584 +572 573 1943.166443585903 +573 573 12566.34653267818 +574 573 2219.495033769993 +573 574 2218.812528012878 +574 574 14210.08265950397 +575 574 2494.793810939413 +574 575 2494.185808800393 +575 575 16116.59957181159 +576 575 2857.611085915054 +22 576 3203.471168416002 +445 576 -489.863443182881 +446 576 -489.8604493963105 +575 576 2857.076607057393 +576 576 18217.38193447778 +587 576 -949.3396525370741 +23 577 -2484.754132913622 +450 577 -42.91800205699118 +455 577 -42.89420143835365 +547 577 -830.295344213637 +577 577 10596.28379167699 +578 577 -3445.189560112656 +577 578 -3151.015517176423 +578 578 11814.99253587428 +579 578 -4439.535053778465 +578 579 -4138.933873821166 +579 579 13575.91187645144 +580 579 -5564.683932157882 +579 580 -5250.659341003439 +580 580 15575.48270993896 +581 580 -6758.98759475642 +18 581 -7744.589939538137 +296 581 -1374.746382814173 +325 581 -2589.506196578616 +368 581 -1374.708303625723 +580 581 -6431.38717845065 +581 581 17427.88962588804 +24 582 -2484.753285445929 +451 582 -42.89420204176007 +460 582 -42.91638537924862 +489 582 -830.295060700301 +582 582 10596.27934304662 +583 582 -3445.185327193247 +582 583 -3151.011691551919 +583 583 11814.98216209118 +584 583 -4439.527228545907 +583 584 -4138.926801405608 +584 584 13575.89458124172 +585 584 -5564.673115064576 +584 585 -5250.649041763738 +585 585 15575.46090991505 +586 585 -6758.974062351266 +20 586 -7744.546866855329 +372 586 -1374.707172665791 +401 586 -2589.491780842607 +436 586 -1374.724770171681 +585 586 -6431.374529181391 +586 586 17427.82975500674 +22 587 -2484.753285445929 +445 587 -42.89420204176007 +446 587 -42.91638537924862 +576 587 -830.295060700301 +587 587 10596.27934304663 +588 587 -3445.185327193247 +587 588 -3151.011691551919 +588 588 11814.98216209118 +589 588 -4439.527228545907 +588 589 -4138.926801405608 +589 589 13575.89458124172 +590 589 -5564.673115064576 +589 590 -5250.649041763738 +590 590 15575.46090991505 +591 590 -6758.974062351266 +16 591 -7744.547280147544 +162 591 -1374.690493440248 +191 591 -2589.491919244246 +292 591 -1374.741587898678 +590 591 -6431.374529181391 +591 591 17427.83022718784 +1026 591 -459.6757113818358 +21 592 -2484.754132913622 +441 592 -42.89420143835365 +456 592 -42.91800205699118 +518 592 -830.295344213637 +592 592 10596.28379167699 +593 592 -3445.189560112656 +592 593 -3151.015517176423 +593 593 11814.99253587428 +594 593 -4439.535053778465 +593 594 -4138.933873821166 +594 594 13575.91187645144 +595 594 -5564.683932157882 +594 595 -5250.659341003439 +595 595 15575.48270993896 +596 595 -6758.98759475642 +13 596 -7743.249269905795 +158 596 -1374.458919843844 +220 596 -2589.057230401322 +440 596 -1374.497167697948 +595 596 -6431.38717845065 +596 596 17426.34584622594 +1022 596 -459.5981873881037 +6 597 -5.916625103403247 +30 597 -18.10436884956627 +31 597 -5.926450552912467 +100 597 5.163749649237705 +101 597 99.86932580444946 +192 597 -15.91576718090562 +597 597 688.4301735227036 +598 597 42.61101847404765 +605 597 100.2702702502577 +606 597 5.168853543596747 +882 597 -90.19159363664123 +883 597 -16.1943021732019 +1172 597 -78.99198179685702 +1201 597 -23.91858705614609 +99 598 19.1991010793881 +100 598 153.9580663080654 +101 598 1.700428581872995 +597 598 32.50221905611679 +598 598 1044.970017201182 +599 598 131.7519322446137 +605 598 1.698995825626328 +606 598 153.9679220316426 +607 598 19.20469343983726 +1172 598 -22.25035873003661 +1201 598 -142.2812780250702 +1230 598 -37.30736075516879 +98 599 42.21533503996462 +99 599 249.0030298410593 +100 599 14.35857023254398 +598 599 115.3207102364987 +599 599 1651.109823172065 +600 599 275.008165022765 +606 599 14.35728188645852 +607 599 249.0141619720731 +608 599 42.22087275928791 +1201 599 -34.59164780673237 +1230 599 -246.4574367414291 +1259 599 -59.61802362184116 +97 600 80.85250904233646 +98 600 412.5720470197197 +99 600 35.0754659534024 +599 600 246.5164871555033 +600 600 2668.13188838786 +601 600 511.8879707242619 +607 600 35.07431006320176 +608 600 412.5829505344342 +609 600 80.85735549294837 +1230 600 -54.89806715871438 +1259 600 -419.0547391583348 +1288 600 -97.69079683189041 +96 601 147.5415373332565 +97 601 697.8444365926631 +98 601 69.57341313998879 +600 601 460.1189419479092 +601 601 4413.432526823989 +602 601 916.717358311615 +608 601 69.57231168336597 +609 601 697.8513784051647 +610 601 147.5443912894497 +1259 601 -89.0964508749625 +1288 601 -712.6201488002115 +1317 601 -164.003259204386 +95 602 265.2724273967863 +96 602 1201.933973698744 +97 602 128.6027001500168 +601 602 820.3974856799673 +602 602 7468.422597510547 +603 602 1627.257261125646 +609 602 128.6010068401838 +610 602 1201.927371667058 +611 602 265.2706718923934 +1288 602 -147.9882042943731 +1317 602 -1223.962568351365 +1346 602 -281.5172390945997 +94 603 476.623625636198 +95 603 2103.743129209531 +96 603 232.0185438558065 +602 603 1446.309281661468 +603 603 12905.70467739779 +604 603 2898.886385183745 +610 603 232.0143546728358 +611 603 2103.70352872078 +612 603 476.6122160864489 +1317 603 -251.4012209647342 +1346 603 -2131.884162947893 +1375 603 -492.7626395427461 +5 604 867.2960197718613 +65 604 5245.732067286343 +66 604 867.263498658143 +94 604 3734.093837731038 +95 604 416.5009208371359 +250 604 -873.2207892533522 +603 604 2557.834000744826 +604 604 22709.77510849159 +611 604 416.4903277953683 +612 604 3733.975761840959 +1027 604 -5224.443771959382 +1028 604 -873.1894511955235 +1346 604 -435.9653248464638 +1375 604 -3767.227678045479 +30 605 -5.927377982616354 +31 605 -17.96460242362621 +32 605 -5.935581030105951 +597 605 100.1045661453033 +598 605 5.163398919745907 +605 605 690.2001352246834 +606 605 42.62370097985907 +613 605 100.4274762938849 +614 605 5.172043848230947 +882 605 -16.0854616116158 +883 605 -91.29537474998219 +884 605 -16.30798892353411 +597 606 1.703119178483362 +598 606 153.9653121179016 +599 606 19.19901978137852 +605 606 32.51457158073428 +606 606 1045.045840357117 +607 606 131.7674230665899 +613 606 1.700955399942309 +614 606 153.9833689018607 +615 606 19.20848812267113 +598 607 14.36169136820977 +599 607 249.0118860826582 +600 607 42.215538001244 +606 607 115.3359919132259 +607 607 1651.196705117141 +608 607 275.0248429604856 +614 607 14.35981673424434 +615 607 249.0321345486157 +616 607 42.22500383358928 +599 608 35.07879164948601 +600 608 412.5816282958248 +601 608 80.85282182018898 +607 608 246.5331442110801 +608 608 2668.22210431445 +609 608 511.9038028320612 +615 608 35.07722878192205 +616 608 412.601724274847 +617 608 80.86116876812397 +600 609 69.57656805111682 +601 609 697.8525385263063 +602 609 147.5414882594574 +608 609 460.1351526810491 +609 609 4413.501670586172 +610 609 916.7251042693874 +616 609 69.57513163663296 +617 609 697.865876484752 +618 609 147.5465006670388 +601 610 128.6050776298931 +602 610 1201.933855220221 +603 610 265.2702829152267 +609 610 820.4067582698033 +610 610 7468.412654545707 +611 610 1627.243081929288 +617 610 128.602582530508 +618 610 1201.92627765117 +619 610 265.268235847976 +602 611 232.0183709400388 +603 611 2103.72023801759 +604 611 476.6157105898978 +610 611 1446.29928870534 +611 611 12905.49106696386 +612 611 2898.818518071539 +618 611 232.0122562722792 +619 611 2103.660712364766 +620 611 476.598598124983 +65 612 867.2733941509232 +66 612 5245.54087569104 +67 612 867.225588076293 +603 612 416.4950903870428 +604 612 3734.012854659463 +611 612 2557.777046586206 +612 612 22709.07453039078 +619 612 416.4786951905015 +620 612 3733.836235757799 +1027 612 -873.1974946670703 +1028 612 -5224.252793954613 +1029 612 -873.1517879493813 +31 613 -5.932291163548795 +32 613 -17.89838396434169 +33 613 -5.934718503972391 +605 613 100.3717448480669 +606 613 5.164972129459509 +613 613 690.9065120558658 +614 613 42.64035270664104 +621 613 100.3819419050234 +622 613 5.174091074040968 +883 613 -16.2708601139488 +884 613 -91.71440645479862 +885 613 -16.27419277555888 +605 614 1.706121836160687 +606 614 153.9797990625723 +607 614 19.20116609760632 +613 614 32.53091149575937 +614 614 1045.128864300246 +615 614 131.7861702791241 +621 614 1.703789397417479 +622 614 153.9924243600698 +623 614 19.21070949182081 +606 615 14.36538734062911 +607 615 249.0288531868321 +608 615 42.21803087981657 +614 615 115.3545699381434 +615 615 1651.288364590993 +616 615 275.044060137209 +622 615 14.36282518135195 +623 615 249.0417801015783 +624 615 42.22709640158323 +607 616 35.082832337046 +608 616 412.599682742615 +609 616 80.85533595667208 +615 616 246.5522934892626 +616 616 2668.309838027452 +617 616 511.9195869359759 +623 616 35.08002771794565 +624 616 412.6097105181415 +625 616 80.86251793662302 +608 617 69.58052940111557 +609 617 697.8670307908951 +610 617 147.5427389273405 +616 617 460.1511810396198 +617 617 4413.553199005258 +618 617 916.7294763876628 +624 617 69.5770921510092 +625 617 697.8670723551218 +626 617 147.5459053049834 +609 618 128.6076389444924 +610 618 1201.934055261152 +611 618 265.2677292668455 +617 618 820.4122988215358 +618 618 7468.357954215888 +619 618 1627.219123310478 +625 618 128.6025653264819 +626 618 1201.908800259647 +627 618 265.2627611056741 +610 619 232.0172048182603 +611 619 2103.682314776899 +612 619 476.6034534894454 +618 619 1446.278921229481 +619 619 12905.17321977283 +620 619 2898.727603539173 +626 619 232.0075294841705 +627 619 2103.599300678206 +628 619 476.5823080814048 +66 620 867.2386529448877 +67 620 5245.307532400616 +68 620 867.1863358675864 +611 620 416.4847509544009 +612 620 3733.884452039728 +619 620 2557.695392650595 +620 620 22708.17063362079 +627 620 416.4637867852876 +628 620 3733.679166458122 +1028 620 -873.1620570751597 +1029 620 -5224.019729734327 +1030 620 -873.11233913689 +32 621 -5.92866788377318 +33 621 -17.93720341019327 +34 621 -5.924673838709142 +613 621 100.4313911472193 +614 621 5.167635904668414 +621 621 690.3050717323839 +622 621 42.65561419834503 +629 621 100.1267208239266 +630 621 5.174849852461302 +884 621 -16.30677412220816 +885 621 -91.30693971551554 +886 621 -16.09002387210725 +613 622 1.708273532048427 +614 622 153.9887942300977 +615 622 19.20394467610925 +621 622 32.54601528465666 +622 622 1045.177965023105 +623 622 131.8017100505764 +629 622 1.706383322040722 +630 622 153.9943799284196 +631 622 19.21138562294046 +614 623 14.36767620825181 +615 623 249.0382905053592 +616 623 42.22063333617162 +622 623 115.3697808111502 +623 623 1651.341067271063 +624 623 275.0585196254975 +630 623 14.36530452474099 +631 623 249.0446457174599 +632 623 42.22775473086799 +615 624 35.08496899271765 +616 624 412.607288808533 +617 624 80.85708895140723 +623 624 246.5660308560869 +624 624 2668.357488460643 +625 624 511.9307323130336 +631 624 35.08226171883683 +632 624 412.6135385922448 +633 624 80.86325845730983 +616 625 69.58185649093912 +617 625 697.8674115559581 +618 625 147.5423551298331 +624 625 460.1610113167055 +625 625 4413.577214369337 +626 625 916.7335833856072 +632 625 69.57891915843823 +633 625 697.8715456443852 +634 625 147.546874378029 +617 626 128.6069743634526 +618 626 1201.915518310244 +619 626 265.262432591924 +625 626 820.4142251263258 +626 626 7468.315946776149 +627 626 1627.205946560777 +633 626 128.603831771722 +634 626 1201.913455114246 +635 626 265.2640049016644 +618 627 232.0119391241794 +619 627 2103.619108509254 +620 627 476.5869974051451 +626 627 1446.262813069196 +627 627 12904.97181507852 +628 627 2898.675878580414 +634 627 232.0080176637204 +635 627 2103.600639016577 +636 627 476.5830392761776 +67 628 867.199012592465 +68 628 5245.172692507274 +69 628 867.1843966789586 +619 628 416.4691013458014 +620 628 3733.724346804751 +627 628 2557.640668915898 +628 628 22707.61174677631 +635 628 416.4623645980853 +636 628 3733.665488005667 +1029 628 -873.1219511388991 +1030 628 -5223.885305733255 +1031 628 -873.1093108407116 +8 629 -5.909683617474249 +33 629 -5.917078536873486 +34 629 -18.05716982619367 +92 629 5.174554288547828 +93 629 99.89786660078643 +163 629 -15.92040120281134 +621 629 100.2877785848597 +622 629 5.170457154246733 +629 629 688.614228940166 +630 629 42.66642526066614 +885 629 -16.19558747592213 +886 629 -90.21172241152748 +1404 629 -79.03636616795943 +1433 629 -23.92514559580557 +91 630 19.21099791287861 +92 630 153.9960861276842 +93 630 1.708428285886267 +621 630 1.709264815681907 +622 630 153.9916288826813 +623 630 19.20672433150104 +629 630 32.55672223941798 +630 630 1045.204312003658 +631 630 131.8123138774027 +1404 630 -22.25781802624232 +1433 630 -142.3340478216769 +1462 630 -37.31506881089284 +90 631 42.22740783122536 +91 631 249.0468179025735 +92 631 14.36739956484847 +622 631 14.36846704322976 +623 631 249.0418710497234 +624 631 42.22324750380506 +630 631 115.3800025188248 +631 631 1651.370964862351 +632 631 275.0684982037561 +1433 631 -34.60029979331923 +1462 631 -246.5147807438998 +1491 631 -59.62650800374362 +89 632 80.86297430246523 +90 632 412.616151136718 +91 632 35.08428681427286 +623 632 35.08550223118127 +624 632 412.611410978955 +625 632 80.8594273953195 +631 632 246.5750468324196 +632 632 2668.388388306796 +633 632 511.9393493829708 +1462 632 -54.90735319025666 +1491 632 -419.1098878970965 +88 633 147.5464580706687 +89 633 697.8734934019851 +90 633 69.58068048922662 +624 633 69.58209094137862 +625 633 697.8714791088271 +626 633 147.5444147525327 +632 633 460.1678358223611 +633 633 4413.601038062974 +634 633 916.7394036269141 +1491 633 -89.10473049143458 +87 634 265.2627664276628 +88 634 1201.911228398897 +89 634 128.6049350437544 +625 634 128.6068370132757 +626 634 1201.917798872358 +627 634 265.2637329817401 +633 634 820.4170447733943 +634 634 7468.315998428434 +635 634 1627.205754728972 +86 635 476.5791565892215 +87 635 2103.58651495598 +88 635 232.007545145619 +626 635 232.0109413535985 +627 635 2103.614214950374 +628 635 476.5864026257104 +634 635 1446.257923412894 +635 635 12904.90520118959 +636 635 2898.659183882479 +7 636 867.1734375671058 +68 636 867.193835786655 +69 636 5245.1146948642 +86 636 3733.621883231049 +87 636 416.4584653103547 +221 636 -873.0973614808485 +627 636 416.4660033017624 +628 636 3733.698365150787 +635 636 2557.617359853719 +636 636 22707.36960417393 +1030 636 -873.1164096355525 +1031 636 -5223.827710714417 +8 637 -5.909435176931838 +40 637 -18.05382997030447 +41 637 -5.917131532402664 +92 637 5.174819591929078 +93 637 99.90511142093652 +163 637 -15.92104594542478 +637 637 688.6628225191474 +638 637 42.67386356639246 +645 637 100.2976400954082 +646 637 5.174486157000239 +1404 637 -79.04110641573612 +1433 637 -23.92687249568098 +91 638 19.21235601359278 +92 638 154.0089235479286 +93 638 1.709299762258633 +637 638 32.56317990892319 +638 638 1045.287964669363 +639 638 131.8265335936636 +645 638 1.709658572007491 +646 638 154.0087710532076 +647 638 19.21209400338914 +1404 638 -22.25902617702508 +1433 638 -142.3437446008939 +1462 638 -37.31793913967499 +90 639 42.23052165735703 +91 639 249.0682808565911 +92 639 14.36945493983239 +638 639 115.3924193143516 +639 639 1651.50652069505 +640 639 275.0932229899799 +646 639 14.36981456948953 +647 639 249.0689999752854 +648 639 42.2304303798676 +1433 639 -34.60248881910222 +1462 639 -246.5325909012062 +1491 639 -59.63101972075649 +89 640 80.86842901013829 +90 640 412.649597302481 +91 640 35.08813307462629 +639 640 246.5971945467414 +640 640 2668.599317461049 +641 640 511.9790314307517 +647 640 35.08856160750362 +648 640 412.6523426040592 +649 640 80.86894582213253 +1462 640 -54.91110244455747 +1491 640 -419.1395094976693 +88 641 147.5541526887806 +89 641 697.9209837010249 +90 641 69.58696260829097 +640 641 460.2048059857805 +641 641 4413.904693634353 +642 641 916.7937304722561 +648 641 69.58779637766523 +649 641 697.928678198474 +650 641 147.5559528473732 +1491 641 -89.11070780999293 +87 642 265.2703640733592 +88 642 1201.968431775758 +89 642 128.613887039517 +641 642 820.4710806071092 +642 642 7468.688189951616 +643 642 1627.26086127776 +649 642 128.6156791404058 +650 642 1201.985991734448 +651 642 265.2746244515019 +86 643 476.5783591905341 +87 643 2103.629277867049 +88 643 232.0178876542413 +642 643 1446.321895886461 +643 643 12905.20373204849 +644 643 2898.665727046914 +650 643 232.0216268678494 +651 643 2103.666200447229 +652 643 476.5874008426494 +7 644 867.1409181963797 +50 644 5244.930958953082 +51 644 867.1594203640619 +86 644 3733.574832017672 +87 644 416.4645642595871 +221 644 -873.0650283809626 +643 644 2557.658267976748 +644 644 22707.13689798948 +651 644 416.4722520719051 +652 644 3733.649299288334 +40 645 -5.922642270898669 +41 645 -17.92281169765293 +42 645 -5.927753561758266 +637 645 100.1341924481868 +638 645 5.174942640615914 +645 645 690.36910770387 +646 645 42.67390823743023 +653 645 100.4422030640857 +654 645 5.174630350950332 +637 646 1.70906611140779 +638 646 154.0085746538266 +639 646 19.21253522297295 +645 646 32.56309106975344 +646 646 1045.287931604989 +647 646 131.8269914720649 +653 646 1.709394520375168 +654 646 154.0091230619641 +655 646 19.21242669070772 +638 647 14.36924232387197 +639 647 249.068684671753 +640 647 42.23080232290081 +646 647 115.3924299670188 +647 647 1651.515527784232 +648 647 275.0957424231405 +654 647 14.36966231351394 +655 647 249.0718580792206 +656 647 42.23135887463171 +639 648 35.08801084690077 +640 648 412.6518670162015 +641 648 80.86925505818692 +647 648 246.598680553563 +648 648 2668.628848949655 +649 648 511.9865859085522 +655 648 35.08885569155338 +656 648 412.6604880695274 +657 648 80.87107669163964 +640 649 69.58726885566699 +641 649 697.9278985942773 +642 649 147.5561228005919 +648 649 460.2102135118499 +649 649 4413.979583151588 +650 649 916.8128855080997 +656 649 69.589079942745 +657 649 697.9476517663441 +658 649 147.5608205519378 +641 650 128.61513678747 +642 650 1201.98471547488 +643 650 265.2746351875499 +649 650 820.48594821501 +650 650 7468.85674579799 +651 650 1627.303120335107 +657 650 128.6192478544668 +658 650 1202.026697797794 +659 650 265.2847575562031 +642 651 232.0210647316337 +643 651 2103.664563554738 +644 651 476.5873274819799 +650 651 1446.355947437181 +651 651 12905.55525868727 +652 651 2898.75274632178 +658 651 232.0296232167077 +659 651 2103.749047287363 +660 651 476.6078545741223 +50 652 867.1591780099891 +51 652 5245.107999454091 +52 652 867.2005731516681 +643 652 416.4717287370328 +644 652 3733.647196520188 +651 652 2557.729857128 +652 652 22707.84628461773 +659 652 416.4889620575448 +660 652 3733.814767880502 +41 653 -5.929829081048196 +42 653 -17.86934329118813 +43 653 -5.929880812604999 +645 653 100.389629234601 +646 653 5.174885170314345 +653 653 691.0049267085506 +654 653 42.67369596585169 +661 653 100.3887156171229 +662 653 5.174867607755081 +645 654 1.709117343798557 +646 654 154.0090544642272 +647 654 19.21265690719514 +653 654 32.56280805517979 +654 654 1045.285947510768 +655 654 131.8271323250622 +661 654 1.708975678197874 +662 654 154.007868322841 +663 654 19.21257033318288 +646 655 14.36935817506527 +647 655 249.0716424286456 +648 655 42.23152469271184 +654 655 115.3922631050043 +655 655 1651.520068976513 +656 655 275.0974325475484 +662 655 14.3691632883195 +663 655 249.0702187976005 +664 655 42.23139456081847 +647 656 35.08854838295224 +648 656 412.6602266849255 +649 656 80.87124246371646 +655 656 246.5996094890971 +656 656 2668.647099014396 +657 656 511.9913233946705 +663 656 35.08831199951852 +664 656 412.6583140389338 +665 656 80.87096388445201 +648 657 69.58883347799724 +649 657 697.9472265292575 +650 657 147.5608764699855 +656 657 460.2134688565404 +657 657 4414.028303120984 +658 657 916.8257046079393 +664 657 69.58843322745349 +665 657 697.9448143174791 +666 657 147.5605426770382 +649 658 128.6189565167808 +650 658 1202.026059383468 +651 658 265.2847879059013 +657 658 820.4957951787558 +658 658 7468.96883283384 +659 658 1627.331426336388 +665 658 128.6185081523662 +666 658 1202.023225367134 +667 658 265.2843741793884 +650 659 232.0293685033216 +651 659 2103.748363328223 +652 659 476.607852487828 +658 659 1446.378508469015 +659 659 12905.79189130257 +660 659 2898.811895524811 +666 659 232.0288050372975 +667 659 2103.74490669298 +668 659 476.6073088983953 +51 660 867.2003926768233 +52 660 5245.230677752637 +53 660 867.2004169732361 +651 660 416.4887152222691 +652 660 3733.813587710134 +659 660 2557.778154808399 +660 660 22708.33351420279 +667 660 416.4880066250109 +668 660 3733.811228916464 +42 661 -5.927672205511275 +43 661 -17.92284682996741 +44 661 -5.922725151138573 +653 661 100.4413277666152 +654 661 5.174516652577573 +661 661 690.369974607396 +662 661 42.67383551150448 +669 661 100.1354655119878 +670 661 5.17507042369024 +653 662 1.709404355677036 +654 662 154.0080001402518 +655 662 19.21225213365843 +661 662 32.56301837742808 +662 662 1045.288991953527 +663 662 131.8271072826898 +669 662 1.709096790705717 +670 662 154.0101999210409 +671 662 19.21277779418165 +654 663 14.36959107017404 +655 663 249.0704360959868 +656 663 42.23111476192407 +662 663 115.3925340082903 +663 663 1651.517883461389 +664 663 275.0962775220227 +670 663 14.36936389692688 +671 663 249.0708734453889 +672 663 42.23118343818272 +655 664 35.08870876072985 +656 664 412.6586393088817 +657 664 80.87073408747095 +663 664 246.5991957389358 +664 664 2668.631506541989 +665 664 511.9868031114843 +671 664 35.08829955897521 +672 664 412.654536580748 +673 664 80.86965854516788 +656 665 69.58882094967858 +657 665 697.9453727862265 +658 665 147.5604187981652 +664 665 460.2104561594091 +665 665 4413.982593383527 +666 665 916.8135159671697 +672 665 69.58761803048706 +673 665 697.9311594846009 +674 665 147.5566987191645 +657 666 128.6189003269597 +658 666 1202.024044826051 +659 666 265.2843182953147 +665 666 820.4866215549132 +666 666 7468.860815729449 +667 666 1627.303765353292 +673 666 128.6157212863932 +674 666 1201.988909212848 +675 666 265.2753502303302 +658 667 232.0291875703702 +659 667 2103.746220417826 +660 667 476.6074340235543 +666 667 1446.356626916427 +667 667 12905.55631583127 +668 667 2898.752156405351 +674 667 232.0218175259691 +675 667 2103.668456302432 +676 667 476.5877250918356 +52 668 867.2005320700824 +53 668 5245.109215438712 +54 668 867.1594472920384 +659 668 416.4884753094802 +660 668 3733.812807009287 +667 668 2557.729512858805 +668 668 22707.84881870132 +675 668 416.4722705390312 +676 668 3733.649977815692 +9 669 -5.909467726967941 +43 669 -5.917100815648709 +44 669 -18.05411336997608 +78 669 99.90564515778186 +79 669 5.174861153293026 +297 669 -15.92111411290648 +661 669 100.2988954405692 +662 669 5.174495306725998 +669 669 688.6673715583432 +670 669 42.67413222363111 +78 670 1.70931870358203 +79 670 154.0096801611701 +80 670 19.21244828565529 +661 670 1.709774966635939 +662 670 154.0103689074797 +663 670 19.21221878544751 +669 670 32.56340821315377 +670 670 1045.294090050369 +671 670 131.8272057584174 +79 671 14.3695270913304 +80 671 249.0692564736441 +81 671 42.23066525399432 +662 671 14.37005990189632 +663 671 249.0712402660971 +664 671 42.23074623732489 +670 671 115.3930676742358 +671 671 1651.514883948305 +672 671 275.0945211381339 +80 672 35.0882730516321 +81 672 412.6507710135162 +82 672 80.86859144449689 +663 672 35.08897224166668 +664 672 412.655185537569 +665 672 80.8693187335291 +671 672 246.5984745306285 +672 672 2668.609142545789 +673 672 511.9802385515565 +81 673 69.58713200141565 +82 673 697.9222330508389 +83 673 147.5543700156836 +664 673 69.58828150053172 +665 673 697.9321468717594 +666 673 147.5565211851036 +672 673 460.206136440012 +673 673 4413.916408888988 +674 673 916.795838170234 +82 674 128.6140980423581 +83 674 1201.970017351765 +84 674 265.2706301392497 +665 674 128.6163401320165 +666 674 1201.990212313837 +667 674 265.2752676392033 +673 674 820.4733124509142 +674 674 7468.704725367284 +675 674 1627.26374347768 +83 675 232.0181763769621 +84 675 2103.630797666014 +85 675 476.5784829963439 +666 675 232.0224079997453 +667 675 2103.670053890663 +668 675 476.5877495545823 +674 675 1446.325053820618 +675 675 12905.21904129984 +676 675 2898.666964610326 +10 676 867.1409783456639 +53 676 867.1597988537267 +54 676 5244.931980308991 +84 676 416.4647904052364 +85 676 3733.575529059368 +326 676 -873.0650869817862 +667 676 416.4728577590532 +668 676 3733.652521832496 +675 676 2557.660348324427 +676 676 22707.14673615722 +9 677 -5.909190908762774 +25 677 -18.0532989278061 +26 677 -5.917700204640367 +78 677 99.90145152957825 +79 677 5.174441865068241 +297 677 -15.92043747026671 +677 677 688.6505521131555 +678 677 42.67343370333752 +685 677 100.2968906666981 +686 677 5.174915076617834 +78 678 1.709274320038601 +79 678 154.0051457341075 +80 678 19.21185846539368 +677 678 32.56275686843647 +678 678 1045.274771088504 +679 678 131.8253576759882 +685 678 1.709022621048291 +686 678 154.0078015377263 +687 678 19.2124418540281 +79 679 14.36921842056829 +80 679 249.0652956164935 +81 679 42.23022178799238 +678 679 115.3910014419786 +679 679 1651.495479220048 +680 679 275.0926717739295 +686 679 14.36911876238379 +687 679 249.06806254286 +688 679 42.23082618401146 +80 680 35.08790726654188 +81 680 412.6494879743166 +82 680 80.86889756457447 +679 680 246.5958844762873 +680 680 2668.597599315823 +681 680 511.9806599841576 +687 680 35.08794284322458 +688 680 412.6519062224882 +689 680 80.86936607821043 +81 681 69.58720169885794 +82 681 697.9283016567547 +83 681 147.5566344747257 +680 681 460.2048482404413 +681 681 4413.928132664847 +682 681 916.8023240620743 +688 681 69.58726739557419 +689 681 697.9292062121156 +690 681 147.5565766119464 +82 682 128.6156005535095 +83 682 1201.992853876746 +84 682 265.2772596796718 +681 682 820.4764285794228 +682 682 7468.772208710788 +683 682 1627.285208654066 +689 682 128.6154063884665 +690 682 1201.989150055019 +691 682 265.275944281771 +83 683 232.0231102350652 +84 683 2103.689191666923 +85 683 476.5941067831029 +682 683 1446.339856650031 +683 683 12905.41030755388 +684 683 2898.720111452887 +690 683 232.0220157174998 +691 683 2103.675082467276 +692 683 476.5900646446617 +10 684 867.1750363260088 +60 684 5245.051462384877 +61 684 867.1654376856984 +84 684 416.4770630565798 +85 684 3733.706189379973 +326 684 -873.0987667379392 +683 684 2557.700821914656 +684 684 22707.59645590542 +691 684 416.4738243698008 +692 684 3733.670839251514 +25 685 -5.922039460758189 +26 685 -17.92308844530132 +27 685 -5.928039818759865 +677 685 100.133511601249 +678 685 5.174446783900176 +685 685 690.381094834856 +686 685 42.67430567776408 +693 685 100.4474065059235 +694 685 5.175095128608296 +677 686 1.709590162667714 +678 686 154.0078926681662 +679 686 19.21200341963532 +685 686 32.56350810032885 +686 686 1045.299904092482 +687 686 131.8278095693909 +693 686 1.709491088963929 +694 686 154.014506747704 +695 686 19.21307164446918 +678 687 14.36969663420305 +679 687 249.0682170055519 +680 687 42.23040684854055 +686 687 115.3935073348274 +687 687 1651.526122800448 +688 687 275.0966724859995 +694 687 14.37005184248024 +695 687 249.0763547920133 +696 687 42.23180716980033 +679 688 35.08846265528194 +680 688 412.6521645359846 +681 688 80.86903102845802 +687 688 246.600251212444 +688 688 2668.631580027813 +689 688 511.9850476136421 +695 688 35.08928179412085 +696 688 412.6612960199698 +697 688 80.87051726910411 +680 689 69.58776616806902 +681 689 697.9298021877279 +682 689 147.5563762217885 +688 689 460.2101596483762 +689 689 4413.958077308337 +690 689 916.8049286772521 +696 689 69.58889949393908 +697 689 697.9388506886178 +698 689 147.5577246829058 +681 690 128.6159324325977 +682 690 1201.990196718626 +683 690 265.2758896771481 +689 690 820.4810358092963 +690 690 7468.781330993067 +691 690 1627.281522644423 +697 690 128.617180765115 +698 690 1201.996425350676 +699 690 265.2761421982407 +682 691 232.022530144122 +683 691 2103.676464765163 +684 691 476.5901077977387 +690 691 1446.340104244174 +691 691 12905.36449648281 +692 691 2898.701541625823 +698 691 232.0231728504887 +699 691 2103.673690174626 +700 691 476.587828711498 +60 692 867.1656924427905 +61 692 5244.998607614223 +62 692 867.1574385845986 +683 692 416.4743075218184 +684 692 3733.672844605844 +691 692 2557.689653103485 +692 692 22707.423766345 +699 692 416.4731745450563 +700 692 3733.648238136419 +26 693 -5.92949617838986 +27 693 -17.87047818054608 +28 693 -5.929423014203355 +685 693 100.3948219266528 +686 693 5.174860216963754 +693 693 691.0349464159094 +694 693 42.67491399471763 +701 693 100.3947334758518 +702 693 5.174785328746381 +685 694 1.709769755924979 +686 694 154.014475226714 +687 694 19.21281205338069 +693 694 32.56404397558631 +694 694 1045.317270172435 +695 694 131.8296634356064 +701 694 1.709846472755874 +702 694 154.0141947880427 +703 694 19.21269954344009 +686 695 14.37031037011289 +687 695 249.0763968804458 +688 695 42.23160217710431 +694 695 115.395397879952 +695 695 1651.54662073202 +696 695 275.0991379529622 +702 695 14.37035871257579 +703 695 249.0756711757234 +704 695 42.23137716677287 +687 696 35.08957171070611 +688 696 412.6615617882238 +689 696 80.87040669695182 +695 696 246.6030303912773 +696 696 2668.651915637431 +697 696 511.9872594183653 +703 696 35.08953316041382 +704 696 412.6598056466185 +705 696 80.86994119598812 +688 697 69.58918474262101 +689 697 697.9391333776498 +690 697 147.5575907055463 +696 697 460.2131474373141 +697 697 4413.974162724096 +698 697 916.8060142477284 +704 697 69.58892217156846 +705 697 697.9355597803069 +706 697 147.5567128055366 +689 698 128.6173821451896 +690 698 1201.996858092763 +691 698 265.2761307364761 +697 698 820.4836378311593 +698 698 7468.77961411789 +699 698 1627.27680302771 +705 698 128.6167723405101 +706 698 1201.989675422617 +707 698 265.2743415899802 +690 699 232.0234368259965 +691 699 2103.674460063995 +692 699 476.5878719846 +698 699 1446.338493214426 +699 699 12905.31525472209 +700 699 2898.684468362667 +706 699 232.0220460854123 +707 699 2103.660308093323 +708 699 476.5844567418858 +61 700 867.1575628708031 +62 700 5244.953871138037 +63 700 867.1506106566719 +691 700 416.4734263925102 +692 700 3733.649254559268 +699 700 2557.67841138518 +700 700 22707.27009503949 +707 700 416.4706283892521 +708 700 3733.621294733501 +27 701 -5.928095458165741 +28 701 -17.92312001190323 +29 701 -5.922002460855312 +693 701 100.4472999202898 +694 701 5.175134695444825 +701 701 690.38114285218 +702 701 42.67428770255835 +709 701 100.1336311812913 +710 701 5.174401421830227 +693 702 1.709429618661355 +694 702 154.0141774155353 +695 702 19.213062940779 +701 702 32.56348106384271 +702 702 1045.300345022595 +703 702 131.8279191726225 +709 702 1.709607181221072 +710 702 154.0083687693539 +711 702 19.21206800404287 +694 703 14.36995891367307 +695 703 249.0755465298374 +696 703 42.23167837535383 +702 703 115.3935848490943 +703 703 1651.527307902599 +704 703 275.0969051298532 +710 703 14.36980867801431 +711 703 249.0694691656398 +712 703 42.23064360730421 +695 704 35.08910245735206 +696 704 412.6594574155168 +697 704 80.87013932555773 +703 704 246.6004287810191 +704 704 2668.633611656771 +705 704 511.9853952019635 +711 704 35.08869528415194 +712 704 412.654798959467 +713 704 80.86956921247642 +696 705 69.58852156026394 +697 705 697.9351088508668 +698 705 147.5568847221162 +704 705 460.2104451543569 +705 705 4413.96259464254 +706 705 916.8061874327876 +712 705 69.58825332734467 +713 705 697.9351599690235 +714 705 147.5576691820269 +697 706 128.6164304262263 +698 706 1201.988964021394 +699 706 265.2743722645878 +705 706 820.4820359179432 +706 706 7468.791362027484 +707 706 1627.28387455827 +713 706 128.6170005423297 +714 706 1202.001004394231 +715 706 265.2784503377812 +698 707 232.0216580253534 +699 707 2103.659059448537 +700 707 476.5843451691323 +706 707 1446.342026285384 +707 707 12905.38506889665 +708 707 2898.70653291223 +714 707 232.0246537226539 +715 707 2103.697568016461 +716 707 476.595129414662 +62 708 867.150514655084 +63 708 5245.006819833734 +64 708 867.1755733872079 +699 708 416.4702101343235 +700 708 3733.619912997822 +707 708 2557.693979483575 +708 708 22707.4597807867 +715 708 416.4785894711173 +716 708 3733.713459137674 +11 709 -5.909171243641977 +28 709 -5.91777074039525 +29 709 -18.05325938415683 +70 709 99.90125956043727 +71 709 5.174425970899531 +373 709 -15.92041227740361 +701 709 100.297007987388 +702 709 5.174980152460156 +709 709 688.650550328038 +710 709 42.67328708670454 +70 710 1.709263259708379 +71 710 154.0049364816645 +72 710 19.21184719722281 +701 710 1.708950038991597 +702 710 154.0082470452691 +703 710 19.21258987485196 +709 710 32.56258368350436 +710 710 1045.275890559495 +711 710 131.8256800871958 +71 711 14.36920500136238 +72 711 249.0652067012555 +73 711 42.23022653498197 +702 711 14.36910279679326 +703 711 249.0692131122197 +704 711 42.23112882028995 +710 711 115.391210795837 +711 711 1651.499439976459 +712 711 275.0935290648305 +72 712 35.0879059050696 +73 712 412.6496446915231 +74 712 80.8689701285862 +703 712 35.08805394201913 +704 712 412.6544030734546 +705 712 80.86995199957845 +711 712 246.5965112573904 +712 712 2668.60616709884 +713 712 511.9825340267021 +73 713 69.58724297558574 +74 713 697.9291877417331 +75 713 147.5568866718402 +704 713 69.58764572582416 +705 713 697.9343637165416 +706 713 147.5578757168892 +712 713 460.2063064783918 +713 713 4413.947069840867 +714 713 916.8070402758892 +74 714 128.6157943062965 +75 714 1201.995003695569 +76 714 265.2777842371356 +705 714 128.6163753685008 +706 714 1201.99978372719 +707 714 265.2785320411035 +713 714 820.4802481779692 +714 714 7468.810819041695 +715 714 1627.294295830731 +75 715 232.0235381038675 +76 715 2103.693635624312 +77 715 476.5952703718814 +706 715 232.0240781288566 +707 715 2103.69623100433 +708 715 476.5951770747441 +714 715 1446.347335823771 +715 715 12905.48538654147 +716 715 2898.73831444755 +12 716 867.1774905744929 +63 716 867.1751619054276 +64 716 5245.088276371729 +76 716 416.4779760076998 +77 716 3733.715918174722 +402 716 -873.1011886631771 +707 716 416.4780842831005 +708 716 3733.710974051224 +715 716 2557.71601865088 +716 716 22707.74576725734 +11 717 -5.909947522630079 +35 717 -18.05778364923843 +36 717 -5.916442375912117 +70 717 99.90172776998357 +71 717 5.174955948509341 +373 717 -15.92103282018869 +717 717 688.6263572825626 +718 717 42.66697009968021 +725 717 100.2883745906915 +726 717 5.169957987704187 +70 718 1.708455189740562 +71 718 154.0000694215834 +72 718 19.21151028579423 +717 718 32.55728745464132 +718 718 1045.21640685383 +719 718 131.8132375479439 +725 718 1.709973677966726 +726 718 153.9920906057266 +727 718 19.20619499146736 +71 719 14.3676569874654 +72 719 249.0499643405849 +73 719 42.22770634996716 +718 719 115.3812796486984 +719 719 1651.378139932342 +720 719 275.0682233912819 +726 719 14.36915664171903 +727 719 249.0415677245667 +728 719 42.22257098628039 +72 720 35.0845205159014 +73 720 412.616026017917 +74 720 80.86240798659607 +719 720 246.575743775158 +720 720 2668.381004748811 +721 720 511.9355921558023 +727 720 35.08602567414304 +728 720 412.6094243780358 +729 720 80.85842263219786 +73 721 69.58037440208599 +74 721 697.8651614021328 +75 721 147.5437289608454 +720 721 460.1661085216782 +721 721 4413.558375898374 +722 721 916.7262420190793 +728 721 69.5822400062945 +729 721 697.8657474353845 +730 721 147.5424561259537 +74 722 128.6030153703192 +75 722 1201.884792381714 +76 722 265.2553995645334 +721 722 820.4080223269193 +722 722 7468.1956274033 +723 722 1627.173103319888 +729 722 128.6061219754304 +730 722 1201.904107866121 +731 722 265.2599128405291 +75 723 232.0019427502666 +76 723 2103.521982394653 +77 723 476.5620219862597 +722 723 1446.233129033883 +723 723 12904.61929843266 +724 723 2898.583996084825 +730 723 232.0085659579458 +731 723 2103.584170648493 +732 723 476.5785184011251 +12 724 867.1369254718763 +55 724 5244.959400426503 +56 724 867.1782254072136 +76 724 416.4449289836598 +77 724 3733.479914461517 +402 724 -873.0612598266108 +723 724 2557.557391797534 +724 724 22706.75811016912 +731 724 416.4600717729534 +732 724 3733.636742289817 +35 725 -5.925308733318646 +36 725 -17.93689273469259 +37 725 -5.928324508006492 +717 725 100.127235626908 +718 725 5.175391639757017 +725 725 690.2929559042773 +726 725 42.65523025820279 +733 725 100.426304834572 +734 725 5.167131222102553 +717 726 1.705825564092004 +718 726 153.9945742764747 +719 726 19.21185029395184 +725 726 32.54561877362261 +726 726 1045.165234866661 +727 726 131.8006161784482 +733 726 1.708240704074628 +734 726 153.9837449762213 +735 726 19.20330796458875 +718 727 14.36475529252156 +719 727 249.0437823451555 +720 727 42.2279325358023 +726 727 115.3684808024123 +727 727 1651.329195868363 +728 727 275.0575428739384 +734 727 14.36737111039465 +735 727 249.0346386889373 +736 727 42.22032989335219 +719 728 35.08155006891202 +720 728 412.6105707300924 +721 728 80.86291235202955 +727 728 246.5644228204175 +728 728 2668.353202819914 +729 728 511.9319083489162 +735 728 35.08472708421046 +736 728 412.6083520087548 +737 728 80.85802661139793 +720 729 69.57791304543713 +721 729 697.8643149108475 +722 729 147.5453463714557 +728 729 460.160777344735 +729 729 4413.593724661847 +730 729 916.7400692655084 +736 729 69.58241575540687 +737 729 697.8799239993741 +738 729 147.5462836313013 +721 730 128.602003714416 +722 730 1201.89749927232 +723 730 265.2603267649486 +729 730 820.4179680701999 +730 730 7468.381854649622 +731 730 1627.225662288591 +737 730 128.6097780262757 +738 730 1201.953278929056 +739 730 265.272839770538 +722 731 232.0045220596073 +723 731 2103.566954434176 +724 731 476.5748568565222 +730 731 1446.277123160407 +731 731 12905.14248940517 +732 731 2898.72174497957 +738 731 232.0199194443556 +739 731 2103.709163822823 +740 731 476.6105105922187 +55 732 867.1683716890859 +56 732 5245.274277805989 +57 732 867.249079905019 +723 732 416.455142943957 +724 732 3733.599267755721 +731 732 2557.676244379111 +732 732 22707.99847106665 +739 732 416.487856323935 +740 732 3733.919234591967 +36 733 -5.935126720229491 +37 733 -17.89724837285326 +38 733 -5.93267827609681 +725 733 100.3768454048493 +726 733 5.174194445821978 +733 733 690.8765658621278 +734 733 42.63914825364037 +741 733 100.3656660495541 +742 733 5.164985902273447 +725 734 1.703059010523043 +726 734 153.9872555523053 +727 734 19.21063968912485 +733 734 32.52969370885923 +734 734 1045.097462074678 +735 734 131.7835890569079 +741 734 1.705346015507939 +742 734 153.9731559572311 +743 734 19.20090369516937 +726 735 14.36180245239471 +727 735 249.0378030437387 +728 735 42.22726815536253 +734 735 115.3513898377632 +735 735 1651.261808395246 +736 735 275.0424182779271 +742 735 14.36422199972053 +743 735 249.0226603011081 +744 735 42.21786020472511 +727 736 35.07908643442038 +728 736 412.610210196699 +729 736 80.86381926571048 +735 736 246.5489240970508 +736 736 2668.305183119286 +737 736 511.9236629237955 +743 736 35.08158791593014 +744 736 412.5964856879672 +745 736 80.85590367516085 +728 737 69.57700402769328 +729 737 697.8786411331178 +730 737 147.5500300657932 +736 737 460.1515092680527 +737 737 4413.607203338952 +738 737 916.7490873072313 +744 737 69.57976509818195 +745 737 697.8726080041025 +746 737 147.5456486827697 +729 738 128.6047152749294 +730 738 1201.945251667105 +731 738 265.2732615425605 +737 738 820.4243919976448 +738 738 7468.547041512757 +739 738 1627.273736781084 +745 738 128.6087220540467 +746 738 1201.960265078245 +747 738 265.2759446649259 +730 739 232.0149129667727 +731 739 2103.687528918079 +732 739 476.6057071304452 +738 739 1446.318967169175 +739 739 12905.64957372545 +740 739 2898.855011108208 +746 739 232.0225640197055 +747 739 2103.752600075338 +748 739 476.6228848810215 +56 740 867.2361263662391 +57 740 5245.584359055849 +58 740 867.2815056969216 +731 740 416.4818764393737 +732 740 3733.871489718417 +739 740 2557.79505743634 +740 740 22709.2340380808 +747 740 416.4993032356306 +748 740 3734.046399929483 +37 741 -5.935211917902111 +38 741 -17.96434087139489 +39 741 -5.928048747921295 +733 741 100.4214111235008 +734 741 5.17146893013768 +741 741 690.1891747077974 +742 741 42.62330677313668 +749 741 100.1065366207372 +750 741 5.16403856264192 +733 742 1.700871672326052 +734 742 153.9768335846493 +735 742 19.20765946144799 +741 742 32.51415643942585 +742 742 1045.034856200612 +743 742 131.7665859525538 +749 742 1.702625849092852 +750 742 153.967623252333 +751 742 19.19975741669593 +734 743 14.35935002691118 +735 743 249.026176564687 +736 743 42.22431150311859 +742 743 115.3349062919235 +743 743 1651.188485913444 +744 743 275.0246249328342 +750 743 14.36134449004876 +751 743 249.0144591089637 +752 743 42.21629640681705 +735 744 35.07666307753741 +736 744 412.5990818732026 +737 744 80.86138013645285 +743 744 246.5322342527738 +744 744 2668.222644816042 +745 744 511.9056519723385 +751 744 35.07861575380458 +752 744 412.5841404930097 +753 744 80.85350855454968 +736 745 69.57506356822189 +737 745 697.8723878481492 +738 745 147.5491792511218 +744 745 460.1355161459336 +745 745 4413.525783850671 +746 745 916.733399371006 +752 745 69.5764860538375 +753 745 697.8539162794445 +754 745 147.5417361793156 +737 746 128.6042983775812 +738 746 1201.95382972581 +739 746 265.2763893493819 +745 746 820.4120849247083 +746 746 7468.491739123558 +747 746 1627.265284400709 +753 746 128.6048104786304 +754 746 1201.932891158051 +755 746 265.2698615230257 +738 747 232.0182603498744 +739 747 2103.733076793864 +740 747 476.6181923406396 +746 747 1446.315942549183 +747 747 12905.68152846673 +748 747 2898.868973373945 +754 747 232.0178462976036 +755 747 2103.711834953243 +756 747 476.6131411383927 +57 748 867.2686795247924 +58 748 5245.651691616917 +59 748 867.267328783159 +739 748 416.493966714972 +740 748 3734.000766779548 +747 748 2557.816508167875 +748 748 22709.49999303904 +755 748 416.4927879480067 +756 748 3733.990060532858 +6 749 -5.916894349867865 +38 749 -5.925843623861976 +39 749 -18.10510501317184 +100 749 5.16416871359896 +101 749 99.87354152079577 +192 749 -15.91644429129858 +741 749 100.272289398599 +742 749 5.168447809387857 +749 749 688.4471977929174 +750 749 42.61176890486042 +1172 749 -78.99447217172769 +1201 749 -23.9191601774121 +99 750 19.19968099544942 +100 750 153.9625898176203 +101 750 1.700478674317633 +741 750 1.699757089755488 +742 750 153.9705086397577 +743 750 19.20445332557111 +749 750 32.50292220746113 +750 750 1044.98917257497 +751 750 131.7535995277877 +1172 750 -22.25109309115461 +1201 750 -142.2845396821031 +1230 750 -37.30791339210757 +98 751 42.21577905007851 +99 751 249.006984879875 +100 751 14.35887763236361 +742 751 14.35820313754503 +743 751 249.017355159588 +744 751 42.22082907893419 +750 751 115.3226119525183 +751 751 1651.128654629113 +752 751 275.0099013058185 +1201 751 -34.59243447764241 +1230 751 -246.4606547990156 +1259 751 -59.6183204314988 +97 752 80.85221121252148 +98 752 412.5733134970382 +99 752 35.07581913255407 +743 752 35.07535853725289 +744 752 412.5863708357855 +745 752 80.85734479946184 +751 752 246.5189687032579 +752 752 2668.143999331495 +753 752 511.8878780050298 +1230 752 -54.89872215364262 +1259 752 -419.0558843657574 +1288 752 -97.69030066914593 +96 753 147.5392120057215 +97 753 697.8382335022945 +98 753 69.57334368963224 +744 753 69.57334036114554 +745 753 697.8543087325577 +746 753 147.5442973591716 +752 753 460.1205372712743 +753 753 4413.420300464057 +754 753 916.7102979218575 +1259 753 -89.09655255419882 +1288 753 -712.6144938106435 +1317 753 -164.0007256458294 +95 754 265.2659041685951 +96 754 1201.910955197915 +97 754 128.6011448835039 +745 754 128.601892197896 +746 754 1201.928473226495 +747 754 265.2700093799786 +753 754 820.3938765698186 +754 754 7468.355928156014 +755 754 1627.236808781604 +1288 754 -147.9867400550952 +1317 754 -1223.940792384202 +1346 754 -281.5105655665405 +94 755 476.6079143234989 +95 755 2103.685224416696 +96 755 232.013625495584 +746 755 232.0147897084247 +747 755 2103.698197616237 +748 755 476.6098535527207 +754 755 1446.295321359494 +755 755 12905.51352104553 +756 755 2898.832036637014 +1317 755 -251.3963448985273 +1346 755 -2131.828137229558 +1375 755 -492.746814061858 +5 756 867.2619673186508 +58 756 867.2579332056963 +59 756 5245.613455210217 +94 756 3733.9626741136 +95 756 416.4886884233239 +250 756 -873.1871151698655 +747 756 416.48926183935 +748 756 3733.957611966853 +755 756 2557.792561094195 +756 756 22709.32402357481 +1346 756 -435.953130959601 +1375 756 -3767.099021609303 +1 757 -3.790093131688963 +102 757 9.556976891361654 +103 757 -3.803483437971907 +115 757 -3.803484294152831 +116 757 9.556983662160784 +490 757 -7.015672486295011 +757 757 250.5323005208297 +758 757 9.541442709365475 +762 757 9.541441780332747 +763 757 -3.784904130196303 +102 758 -3.815141800491444 +103 758 9.769845599097419 +104 758 -3.829345235719019 +757 758 9.493092987884344 +758 758 250.8888891408738 +759 758 9.553346525299153 +762 758 -3.784904132910722 +763 758 9.486344956495083 +764 758 -3.784904163874626 +103 759 -3.83340488385152 +104 759 9.855905926771813 +105 759 -3.833404883862392 +758 759 9.536860067137125 +759 759 251.1224806870155 +760 759 9.536860067183383 +763 759 -3.784904163874632 +764 759 9.486344995602265 +765 759 -3.784904163874632 +104 760 -3.82934523574209 +105 760 9.76984559926475 +106 760 -3.815141800514235 +759 760 9.553346525295629 +760 760 250.8888891413783 +761 760 9.493092987880717 +764 760 -3.784904163874637 +765 760 9.486344956495092 +766 760 -3.784904132910723 +2 761 -3.790092831645359 +105 761 -3.803483437982501 +106 761 9.556976821141355 +107 761 9.556981295029759 +108 761 -3.803483954107582 +548 761 -7.015671976576611 +760 761 9.541442709411651 +761 761 250.5322935596917 +765 761 -3.7849041301963 +766 761 9.541441544410242 +114 762 -3.829344052553957 +115 762 9.769841398857983 +116 762 -3.815141921123566 +757 762 9.493095131564594 +758 762 -3.784904132910723 +762 762 250.8888777244571 +763 762 9.486344956495088 +767 762 9.553343126603185 +768 762 -3.784904163874636 +757 763 -3.784904135625144 +758 763 9.48634465992421 +759 763 -3.784904166589056 +762 763 9.486344659924217 +763 763 250.092689005861 +764 763 9.486344894567301 +767 763 -3.784904166589055 +768 763 9.486344894567267 +769 763 -3.784904197552966 +758 764 -3.784904166589048 +759 764 9.48634469903139 +760 764 -3.784904166589058 +763 764 9.486344894567306 +764 764 250.0926896609305 +765 764 9.486344894567232 +768 764 -3.784904197552961 +769 764 9.486344933674436 +770 764 -3.78490419755297 +759 765 -3.784904166589049 +760 765 9.486344659924212 +761 765 -3.784904135625142 +764 765 9.486344894567242 +765 765 250.0926890058608 +766 765 9.486344659924217 +769 765 -3.784904197552964 +770 765 9.486344894567274 +771 765 -3.784904166589054 +107 766 -3.815141649805769 +108 766 9.769839820285265 +109 766 -3.829343913539828 +760 766 -3.78490413291072 +761 766 9.493094596519192 +765 766 9.486344956495088 +766 766 250.8888734316748 +770 766 -3.784904163874632 +771 766 9.553343147599358 +113 767 -3.833402917921815 +114 767 9.855891439331847 +115 767 -3.833402983427231 +762 767 9.536859557071752 +763 767 -3.784904163874634 +767 767 251.122438932731 +768 767 9.486344995602265 +772 767 9.536859277945421 +773 767 -3.784904163874636 +762 768 -3.784904166589055 +763 768 9.486344894567264 +764 768 -3.784904197552959 +767 768 9.486344699031395 +768 768 250.0926896609305 +769 768 9.486344933674468 +772 768 -3.784904166589055 +773 768 9.486344894567264 +774 768 -3.784904197552964 +763 769 -3.784904197552963 +764 769 9.486344933674435 +765 769 -3.784904197552968 +768 769 9.486344933674472 +769 769 250.0926903160001 +770 769 9.486344933674422 +773 769 -3.784904197552963 +774 769 9.486344933674442 +775 769 -3.784904197552966 +764 770 -3.78490419755297 +765 770 9.486344894567273 +766 770 -3.784904166589053 +769 770 9.486344933674426 +770 770 250.0926896609304 +771 770 9.486344699031392 +774 770 -3.784904197552966 +775 770 9.486344894567271 +776 770 -3.784904166589054 +108 771 -3.833402917921817 +109 771 9.855891439331847 +110 771 -3.833402983427225 +765 771 -3.784904163874632 +766 771 9.53685927794543 +770 771 9.486344995602263 +771 771 251.1224389327309 +775 771 -3.784904163874634 +776 771 9.536859557071741 +112 772 -3.81514164980576 +113 772 9.769839820285217 +114 772 -3.82934391353982 +767 772 9.553343147599353 +768 772 -3.784904163874634 +772 772 250.8888734316746 +773 772 9.48634495649509 +777 772 9.493094596519192 +778 772 -3.784904132910722 +767 773 -3.784904166589055 +768 773 9.486344894567264 +769 773 -3.784904197552964 +772 773 9.486344659924219 +773 773 250.0926890058609 +774 773 9.486344894567292 +777 773 -3.784904135625144 +778 773 9.486344659924214 +779 773 -3.784904166589055 +768 774 -3.784904197552963 +769 774 9.48634493367444 +770 774 -3.784904197552966 +773 774 9.486344894567297 +774 774 250.0926896609304 +775 774 9.486344894567248 +778 774 -3.784904166589053 +779 774 9.486344699031388 +780 774 -3.784904166589054 +769 775 -3.784904197552966 +770 775 9.486344894567269 +771 775 -3.784904166589055 +774 775 9.486344894567248 +775 775 250.0926890058609 +776 775 9.486344659924217 +779 775 -3.784904166589055 +780 775 9.486344659924224 +781 775 -3.784904135625141 +109 776 -3.829344052553949 +110 776 9.769841398857933 +111 776 -3.815141921123558 +770 776 -3.784904163874634 +771 776 9.553343126603187 +775 776 9.486344956495088 +776 776 250.8888777244569 +780 776 -3.784904132910722 +781 776 9.493095131564598 +4 777 -3.790092831645361 +112 777 9.556981295029754 +113 777 -3.803483954107579 +117 777 9.55697682116474 +118 777 -3.803483437987842 +461 777 -7.01567197657661 +772 777 9.541441544410226 +773 777 -3.784904130196299 +777 777 250.5322935597432 +778 777 9.541442709434921 +117 778 -3.815141800525725 +118 778 9.769845599349097 +119 778 -3.829345235753719 +772 778 -3.784904132910723 +773 778 9.486344956495087 +774 778 -3.78490416387463 +777 778 9.493092987878882 +778 778 250.8888891416327 +779 778 9.553346525293909 +118 779 -3.833404883867872 +119 779 9.855905926771811 +120 779 -3.833404883846043 +773 779 -3.784904163874629 +774 779 9.486344995602263 +775 779 -3.784904163874634 +778 779 9.536860067206788 +779 779 251.1224806870155 +780 779 9.536860067113722 +119 780 -3.829345235707391 +120 780 9.769845599013085 +121 780 -3.815141800479955 +774 780 -3.784904163874634 +775 780 9.486344956495088 +776 780 -3.784904132910723 +779 780 9.553346525300862 +780 780 250.8888891406194 +781 780 9.493092987886179 +3 781 -3.790093131688963 +110 781 -3.803484294152831 +111 781 9.556983662160771 +120 781 -3.803483437966565 +121 781 9.556976891338271 +519 781 -7.015672486295011 +775 781 -3.7849041301963 +776 781 9.541441780332732 +780 781 9.541442709342199 +781 781 250.5323005207781 +4 782 -17.59481116114257 +45 782 16.87526008632798 +46 782 1.450301784084039 +117 782 2.468550321085962 +118 782 0.3222538814087805 +461 782 -10.23237456383111 +782 782 284.1451548190164 +783 782 22.05043406277284 +787 782 3.582088136813145 +788 782 -4.750443399495212 +117 783 -10.60881963519673 +118 783 9.554897749869095 +119 783 -2.589887469231086 +782 783 20.78829369710228 +783 783 312.7551167302407 +784 783 24.24441682270581 +787 783 0.393827380297294 +788 783 11.28204177429773 +789 783 -2.353941360888255 +118 784 -6.06715686009256 +119 784 11.93103687423794 +120 784 -6.067156866981014 +783 784 23.7447017589554 +784 784 323.764435268592 +785 784 23.74470169406541 +788 784 -0.7299870403423272 +789 784 13.93713731927715 +790 784 -0.7299870415781875 +119 785 -2.589887458443799 +120 785 9.554897752536974 +121 785 -10.60881963492306 +784 785 24.24441675970915 +785 785 312.7551166043668 +786 785 20.7882936971242 +789 785 -2.353941378059849 +790 785 11.28204177389986 +791 785 0.3938273803325973 +3 786 -17.59481190278779 +120 786 0.3222538814103073 +121 786 2.468550408738599 +122 786 16.87526170482446 +123 786 1.450301957934951 +519 786 -10.23237501668342 +785 786 22.05043406036874 +786 786 284.1451585872834 +790 786 -4.750443399224129 +791 786 3.5820882248155 +45 787 -12.57466654761279 +46 787 29.3992862312956 +47 787 -0.05933487687901895 +782 787 2.51493880012956 +783 787 -0.5812279589827973 +787 787 338.1719882768274 +788 787 36.04649232208679 +792 787 3.648327668734833 +793 787 -2.941330667203477 +782 788 -7.88066250546686 +783 788 9.520689334822315 +784 788 -2.380866059889937 +787 788 34.16273782322884 +788 788 373.3504625957459 +789 788 38.55590529346911 +792 788 -0.2430617738655734 +793 788 11.57866870470256 +794 788 -1.327097645673708 +783 789 -4.723131902797576 +784 789 11.97367842207712 +785 789 -4.723131911767362 +788 789 37.87026588257614 +789 789 386.6271236801207 +790 789 37.87026576255052 +793 789 -0.5220547082613116 +794 789 14.35945864850962 +795 789 -0.522054711986943 +784 790 -2.380866052385844 +785 790 9.520689338354272 +786 790 -7.880662505067897 +789 790 38.55590517653511 +790 790 373.3504623306064 +791 790 34.16273782268612 +794 790 -1.327097663219844 +795 790 11.57866870354361 +796 790 -0.2430617737896856 +122 791 -12.57466742878103 +123 791 29.39928963329203 +124 791 -0.05933482509044552 +785 791 -0.5812279589585199 +786 791 2.514938945366469 +790 791 36.04649231752231 +791 791 338.1719942335449 +795 791 -2.941330667029399 +796 791 3.648327766054358 +46 792 -9.614245742240415 +47 792 41.91438447308204 +48 792 -1.291116365162932 +787 792 2.427342147220688 +788 792 -1.252143566022606 +792 792 397.2225919810714 +793 792 49.46109832974556 +797 792 3.262423703833736 +798 792 -1.547176931694704 +787 793 -5.978043030674518 +788 793 9.82897763686621 +789 793 -2.169894265059717 +792 793 47.178777576089 +793 793 435.8602104289307 +794 793 52.21528572556196 +797 793 -0.7429911069829505 +798 793 11.86000873833758 +799 793 -0.474535604142023 +788 794 -3.660951502420444 +789 794 12.45021257779617 +790 794 -3.660951511953276 +793 794 51.40534029559365 +794 794 450.3839111074521 +795 794 51.40534012414351 +798 794 -0.3144946462782308 +799 794 14.89529640679049 +800 794 -0.3144946520792171 +789 795 -2.169894260103171 +790 795 9.828977639605469 +791 795 -5.978043030316024 +794 795 52.21528555784959 +795 795 435.8602100209091 +796 795 47.17877757497041 +799 795 -0.4745356215200971 +800 795 11.8600087358692 +801 795 -0.7429911068852881 +123 796 -9.614246574109888 +124 796 41.91438949462547 +125 796 -1.291116456732647 +790 796 -1.252143565970139 +791 796 2.42734231683891 +795 796 49.46109832366159 +796 796 397.2225994955522 +800 796 -1.547176931634109 +801 796 3.262423759441305 +47 797 -7.598798587391959 +48 797 54.19327755201028 +49 797 -2.339110024494467 +792 797 2.009614441592234 +793 797 -1.776794899839462 +797 797 458.1104751964293 +798 797 62.3594580293372 +802 797 2.591457363691056 +803 797 -0.4504336338865951 +792 798 -4.523383210028717 +793 798 10.13879115792057 +794 798 -1.955071715744966 +797 798 59.75773314352408 +798 798 498.7774959637604 +799 798 65.29273941495788 +802 798 -1.145899036328466 +803 798 12.14083152339827 +804 798 0.2471169923402048 +793 799 -2.776601331997439 +794 799 13.02539991009125 +795 799 -2.7766013414284 +798 799 64.3820738063221 +799 799 514.0894476350038 +800 799 64.38207358575619 +803 799 -0.1094119771434752 +804 799 15.52135306788074 +805 799 -0.1094119847262967 +794 800 -1.955071712914497 +795 800 10.13879115930942 +796 800 -4.523383209766953 +799 800 65.29273919832961 +800 800 498.7774954125429 +801 800 59.75773314199054 +804 800 0.2471169753256142 +805 800 12.14083151928067 +806 800 -1.145899036222007 +124 801 -7.598799229878864 +125 801 54.19328339284782 +126 801 -2.33911019796899 +795 801 -1.776794899758038 +796 801 2.009614606340783 +800 801 62.35945802238854 +801 801 458.1104831162424 +805 801 -0.450433633910464 +806 801 2.591457396286678 +11 802 -3.264957563456059 +28 802 0.2995507528320189 +29 802 1.147842073267455 +48 802 -6.179487030926175 +49 802 66.0089421173173 +373 802 -14.48390561484618 +797 802 1.349601261729454 +798 802 -2.198159680350431 +802 802 517.4114114969427 +803 802 74.33137386973738 +27 803 0.7061368582106553 +28 803 11.25366342449886 +29 803 -1.52861775181875 +797 803 -3.385409529499899 +798 803 10.44882235043035 +799 803 -1.742214683197552 +802 803 71.57266948773366 +803 803 557.8717970766761 +804 803 77.28394301673629 +26 804 -0.03579369940069732 +27 804 14.78252436713607 +28 804 -0.03579373061846347 +798 804 -2.029113317121343 +799 804 13.68001830091773 +800 804 -2.029113326194302 +803 804 76.32298471881964 +804 804 573.1628979953441 +805 804 76.32298461765035 +25 805 -1.528617776684166 +26 805 11.25366367117532 +27 805 0.7061368496042331 +799 805 -1.7422146821872 +800 805 10.44882235013634 +801 805 -3.385409529322992 +804 805 77.28394280057275 +805 805 557.871797321592 +806 805 71.57266938552566 +9 806 -3.264956708444101 +25 806 1.147845509578932 +26 806 0.2995507866215679 +125 806 -6.179487491285622 +126 806 66.00896151862173 +297 806 -14.48391778345887 +800 806 -2.19815968025063 +801 806 1.34960136961157 +805 806 74.33137398003417 +806 806 517.4114348139487 +3 807 -17.5945328264199 +110 807 0.3219454354772067 +111 807 2.46882923698657 +122 807 16.87627680242985 +123 807 1.450164208531299 +519 807 -10.23231422285827 +807 807 284.1482430519669 +808 807 22.05108436189586 +812 807 3.582272620638646 +813 807 -4.75003638775731 +109 808 -2.590006178546569 +110 808 9.55517161093049 +111 808 -10.60836215367641 +807 808 20.78899979625108 +808 808 312.7538296297175 +809 808 24.24301863838531 +812 808 0.3936333829947749 +813 808 11.28222004856012 +814 808 -2.354015693096171 +108 809 -6.066951108853834 +109 809 11.93115719241295 +110 809 -6.066874145966272 +808 809 23.74341220242511 +809 809 323.7592808446777 +810 809 23.74356784777662 +813 809 -0.7302753809930635 +814 809 13.93711223411101 +815 809 -0.7302097840022101 +107 810 -10.6084316947662 +108 810 9.555109350138416 +109 810 -2.589956561693106 +809 810 24.2431867806831 +810 810 312.7535170437932 +811 810 20.78869954543892 +814 810 -2.354031996649946 +815 810 11.28219155614116 +816 810 0.3936602745601077 +2 811 -17.59455012434043 +107 811 2.46880826875428 +108 811 0.3220072310444539 +127 811 16.87621161775007 +128 811 1.450172626643706 +548 811 -10.23231719200787 +810 811 22.05077816507379 +811 811 284.1475775801897 +815 811 -4.750147221951089 +816 811 3.582283972561353 +122 812 -12.57438070204455 +123 812 29.40100320397315 +124 812 -0.0594593535666359 +807 812 2.515055009660616 +808 812 -0.581493728148005 +812 812 338.1779982374962 +813 812 36.04742061627404 +817 812 3.648345860781017 +818 812 -2.94098927373328 +807 813 -7.880274417039262 +808 813 9.520925075019733 +809 813 -2.381000492969831 +812 813 34.16378439459616 +813 813 373.3470226478579 +814 813 38.55321797584642 +817 813 -0.2432209430921839 +818 813 11.57875762361828 +819 813 -1.327233177387832 +808 814 -4.722969592496488 +809 814 11.97381705706962 +810 814 -4.72302049087373 +813 814 37.86774567722849 +814 814 386.6162363901881 +815 814 37.8680616838315 +818 814 -0.5223587311002529 +819 814 14.35937122848127 +820 814 -0.5223034611364721 +809 815 -2.380953690796651 +810 815 9.520900569425947 +811 815 -7.880346187086796 +814 815 38.55355316558253 +815 815 373.3465311829519 +816 815 34.16326332526895 +819 815 -1.327234956662197 +820 815 11.57871154635759 +821 815 -0.2432016428120667 +127 816 -12.57439584469564 +128 816 29.40088961229781 +129 816 -0.05945029830358362 +810 816 -0.5814351291382964 +811 816 2.51508241108381 +815 816 36.04689368887834 +816 816 338.1766219243833 +820 816 -2.941096865590067 +821 816 3.648350014824203 +123 817 -9.614024443476527 +124 817 41.91677445127801 +125 817 -1.291223208472115 +812 817 2.427302022820772 +813 817 -1.252372210050481 +817 817 397.2315423196147 +818 817 49.46228886443249 +822 817 3.262364950447441 +823 817 -1.546885817937181 +812 818 -5.97772360190219 +813 818 9.82913070062089 +814 818 -2.170044613508594 +817 818 47.18012238576578 +818 818 435.8544793421707 +819 818 52.21141703709961 +822 818 -0.7431109043716475 +823 818 11.86003945775779 +824 818 -0.4747060918187049 +813 819 -3.660861069983749 +814 819 12.45028826215926 +815 819 -3.660897652221522 +818 819 51.40166897828945 +819 819 450.3671245127112 +820 819 51.40212881360767 +823 819 -0.314817049944617 +824 819 14.89514603883859 +825 819 -0.3147578571791101 +814 820 -2.170001928144085 +815 820 9.829088224877282 +816 820 -5.977795848273098 +819 820 52.21189818139659 +820 820 435.853842394002 +821 820 47.17941137437022 +824 820 -0.474699362084948 +825 820 11.86003696576805 +826 820 -0.7431044510064115 +128 821 -9.614036689983458 +129 821 41.91660613837115 +130 821 -1.291218729951527 +815 821 -1.252326065810753 +816 821 2.427322188306434 +820 821 49.46157333208318 +821 821 397.2294473474601 +825 821 -1.546976656394575 +826 821 3.262396110521816 +124 822 -7.598652985838658 +125 822 54.19631372449658 +126 822 -2.339196013405589 +817 822 2.009504144683095 +818 822 -1.776990581109555 +822 822 458.1222214656026 +823 822 62.36093009800143 +827 822 2.59120084363942 +828 822 -0.4501713437375425 +817 823 -4.523113013658719 +818 823 10.13888584286251 +819 823 -1.955240266927873 +822 823 59.75935477446946 +823 823 498.7695527221061 +824 823 65.28775829415713 +827 823 -1.146008421922714 +828 823 12.14085083542951 +829 823 0.2469221221515383 +818 824 -2.776548157669582 +819 824 13.02540769676486 +820 824 -2.776572949584281 +823 824 64.37730870970401 +824 824 514.0668020242331 +825 824 64.3779182521246 +828 824 -0.1097371956007667 +829 824 15.52114918514708 +830 824 -0.1096747915122869 +819 825 -1.955199073742827 +820 825 10.13888437603131 +821 825 -4.523165310882156 +824 825 65.2883869853548 +825 825 498.7687927333908 +826 825 59.75844182006153 +829 825 0.2469329474524429 +830 825 12.14085963848149 +831 825 -1.146007666857304 +129 826 -7.598656227182421 +130 826 54.19611176883298 +131 826 -2.339189486684239 +820 826 -1.776950006776044 +821 826 2.009549412355899 +825 826 62.36001623822551 +826 826 458.1194243583521 +830 826 -0.4502546773858462 +831 826 2.591225501962807 +9 827 -3.265032734949408 +43 827 0.2997855201661999 +44 827 1.147681835654467 +125 827 -6.179429304518456 +126 827 66.01259438275767 +297 827 -14.48451817612466 +822 827 1.349296343611062 +823 827 -2.198326157134712 +827 827 517.4260535578201 +828 827 74.33314570894666 +42 828 0.7059343388358386 +43 828 11.25367663315813 +44 828 -1.528691753667788 +822 828 -3.385199547164522 +823 828 10.44890029952409 +824 828 -1.742394452435583 +827 828 71.57459087801257 +828 828 557.8617888024781 +829 828 77.27793052370666 +41 829 -0.03604883820886684 +42 829 14.78228767994036 +43 829 -0.0361064369429247 +823 829 -2.029077786156835 +824 829 13.679968787161 +825 829 -2.02909944372839 +828 829 76.31719860530639 +829 829 573.1345969755025 +830 829 76.31795324390586 +40 830 -1.528699911557501 +41 830 11.25369099802378 +42 830 0.7059481033329504 +824 830 -1.742351763490936 +825 830 10.44890984184178 +826 830 -3.385249893762017 +829 830 77.2787040304128 +830 830 557.8609053573441 +831 830 71.57349532884228 +8 831 -3.265027480771822 +40 831 1.147714579993384 +41 831 0.2997188379709925 +130 831 -6.179432351273567 +131 831 66.01233391323569 +163 831 -14.48446537427308 +825 831 -2.198290557420069 +826 831 1.349335725669565 +830 831 74.33204970120656 +831 831 517.4225425153802 +2 832 -17.59481116114257 +105 832 0.3222538814091624 +106 832 2.468550321087164 +127 832 16.87526008632798 +128 832 1.450301784084039 +548 832 -10.23237456383111 +832 832 284.1451548179097 +833 832 22.05043406216938 +837 832 3.582088136737555 +838 832 -4.750443399427167 +104 833 -2.589887466523329 +105 833 9.554897750538773 +106 833 -10.60881963512803 +832 833 20.78829369710779 +833 833 312.7551166986445 +834 833 24.24441680689274 +837 833 0.3938273803061563 +838 833 11.28204177419787 +839 833 -2.35394136519859 +103 834 -6.067156865251917 +104 834 11.93103687423794 +105 834 -6.067156861821656 +833 834 23.7447017426671 +834 834 323.7644352685921 +835 834 23.74470171035374 +838 834 -0.7299870406525377 +839 834 13.93713731927713 +840 834 -0.7299870412679716 +102 835 -10.60881963499176 +103 835 9.554897751867294 +104 835 -2.589887461151556 +834 835 24.24441677552223 +835 835 312.755116635963 +836 835 20.7882936971187 +839 835 -2.353941373749516 +840 835 11.28204177399974 +841 835 0.3938273803237351 +1 836 -17.59481190278779 +102 836 2.468550408737391 +103 836 0.3222538814099227 +132 836 16.87526170482446 +133 836 1.450301957934951 +490 836 -10.23237501668342 +835 836 22.05043406097221 +836 836 284.1451585883902 +840 836 -4.750443399292174 +841 836 3.582088224891089 +127 837 -12.57466654761279 +128 837 29.3992862312956 +129 837 -0.05933487687901895 +832 837 2.514938800109972 +833 837 -0.5812279589767044 +837 837 338.1719882751289 +838 837 36.04649232094105 +842 837 3.648327668673414 +843 837 -2.941330667159779 +832 838 -7.880662505366711 +833 838 9.520689335708887 +834 838 -2.380866058006291 +837 838 34.16273782309261 +838 838 373.3504625291921 +839 838 38.55590526411694 +842 838 -0.2430617738465246 +843 838 11.57866870441167 +844 838 -1.327097650078009 +833 839 -4.723131905049125 +834 839 11.97367842207712 +835 839 -4.723131909515816 +838 839 37.87026585244799 +839 839 386.6271236801207 +840 839 37.87026579267874 +843 839 -0.5220547091965049 +844 839 14.35945864850964 +845 839 -0.5220547110517462 +834 840 -2.380866054269487 +835 840 9.520689337467692 +836 840 -7.880662505168043 +839 840 38.55590520588724 +840 840 373.3504623971604 +841 840 34.16273782282235 +844 840 -1.327097658815541 +845 840 11.57866870383453 +846 840 -0.2430617738087344 +132 841 -12.57466742878103 +133 841 29.39928963329203 +134 841 -0.05933482509044552 +835 841 -0.5812279589646137 +836 841 2.51493894538606 +840 841 36.04649231866806 +841 841 338.1719942352435 +845 841 -2.941330667073096 +846 841 3.648327766115781 +128 842 -9.614245742240414 +129 842 41.91438447308204 +130 842 -1.291116365162931 +837 842 2.427342147182056 +838 842 -1.252143566009433 +842 842 397.2225919790744 +843 842 49.46109832821839 +847 842 3.262423703786105 +848 842 -1.547176931679495 +837 843 -5.978043030584529 +838 843 9.828977637553809 +839 843 -2.169894263815587 +842 843 47.17877757580822 +843 843 435.8602103265114 +844 843 52.2152856834638 +847 843 -0.742991106958435 +848 843 11.86000873771797 +849 843 -0.4745356085041799 +838 844 -3.660951504813309 +839 844 12.45021257779616 +840 844 -3.660951509560403 +843 844 51.40534025255725 +844 844 450.3839111074521 +845 844 51.40534016717991 +848 844 -0.314494647734362 +849 844 14.89529640679048 +850 844 -0.3144946506230948 +839 845 -2.169894261347309 +840 845 9.828977638917898 +841 845 -5.978043030406009 +844 845 52.21528559994774 +845 845 435.8602101233282 +846 845 47.17877757525119 +849 845 -0.474535617157942 +850 845 11.8600087364888 +851 845 -0.7429911069098001 +133 846 -9.614246574109888 +134 846 41.91438949462547 +135 846 -1.291116456732647 +840 846 -1.252143565983308 +841 846 2.427342316877542 +845 846 49.46109832518874 +846 846 397.2225994975492 +850 846 -1.54717693164932 +851 846 3.262423759488946 +129 847 -7.598798587391959 +130 847 54.19327755201028 +131 847 -2.339110024494465 +842 847 2.009614441547548 +843 847 -1.776794899819025 +847 847 458.1104751943195 +848 847 62.35945802759299 +852 847 2.591457363654509 +853 847 -0.4504336338925814 +842 848 -4.523383209963008 +843 848 10.13879115826917 +844 848 -1.955071715034464 +847 848 59.75773314313915 +848 848 498.777495825397 +849 848 65.29273936058109 +852 848 -1.145899036301742 +853 848 12.1408315223647 +854 848 0.2471169880692692 +843 849 -2.776601334364749 +844 849 13.02539991009123 +845 849 -2.776601339061095 +848 849 64.38207375095689 +849 849 514.0894476350037 +850 849 64.38207364112137 +853 849 -0.1094119790468646 +854 849 15.52135306788073 +855 849 -0.1094119828229161 +844 850 -1.955071713625001 +845 850 10.13879115896079 +846 850 -4.523383209832657 +849 850 65.29273925270641 +850 850 498.7774955509063 +851 850 59.75773314237548 +854 850 0.2471169795965498 +855 850 12.14083152031425 +856 850 -1.14589903624873 +134 851 -7.598799229878864 +135 851 54.19328339284782 +136 851 -2.33911019796899 +845 851 -1.776794899778478 +846 851 2.00961460638548 +850 851 62.35945802413275 +851 851 458.1104831183522 +855 851 -0.4504336339044723 +856 851 2.591457396323239 +8 852 -3.264955245211656 +33 852 0.2994778139989656 +34 852 1.14762521482767 +130 852 -6.179487030926175 +131 852 66.00891703357216 +163 852 -14.4838792262211 +847 852 1.349601261684558 +848 852 -2.198159680325377 +852 852 517.4104526367164 +853 852 74.3310734754817 +885 852 -15.84286878173804 +886 852 -88.1477592193155 +32 853 0.7059818686569237 +33 853 11.25291253137733 +34 853 -1.528634194688417 +847 853 -3.385409529455492 +848 853 10.44882235035654 +849 853 -1.742214682943906 +852 853 71.57249932191141 +853 853 557.8691508990782 +854 853 77.28333624046736 +884 853 -16.55573116810147 +885 853 -93.6149915936814 +886 853 -15.77005369397729 +31 854 -0.0359965810575904 +32 854 14.78103762180303 +33 854 -0.03587482396064168 +848 854 -2.029113319398805 +849 854 13.68001830091773 +850 854 -2.029113323916844 +853 854 76.32255745223814 +854 854 573.1579762219191 +855 854 76.32205047961357 +883 854 -16.56909082776607 +884 854 -95.68214498683665 +885 854 -16.56953580589063 +30 855 -1.528786856847185 +31 855 11.2516541093022 +32 855 0.7059601271209637 +849 855 -1.742214682440849 +850 855 10.44882235021014 +851 855 -3.385409529367399 +854 855 77.28319401029191 +855 855 557.8646423739167 +856 855 71.57148230268693 +882 855 -15.76913814114654 +883 855 -93.61170493923818 +884 855 -16.55557298211617 +6 856 -3.265017998175228 +30 856 1.145962103137602 +31 856 0.2993158828895641 +135 856 -6.179487491285622 +136 856 66.00766134579342 +192 856 -14.48278012253988 +850 856 -2.19815968027568 +851 856 1.349601369656472 +855 856 74.33032888162137 +856 856 517.4027405627269 +882 856 -88.14220140116123 +883 856 -15.84216933600485 +1 857 -17.5945328264199 +115 857 0.3219454354772076 +116 857 2.468829236986572 +132 857 16.87627680242985 +133 857 1.450164208531299 +490 857 -10.23231422285827 +857 857 284.1482430519676 +858 857 22.05108436189621 +862 857 3.582272620638696 +863 857 -4.750036387757349 +114 858 -2.590006178548212 +115 858 9.555171610930092 +116 858 -10.60836215367645 +857 858 20.78899979625108 +858 858 312.7538296297365 +859 858 24.24301863839491 +862 858 0.3936333829947696 +863 858 11.28222004856017 +864 858 -2.354015693093553 +113 859 -6.066951108854884 +114 859 11.93115719241295 +115 859 -6.06687414596522 +858 859 23.74341220243499 +859 859 323.7592808446777 +860 859 23.74356784776673 +863 859 -0.7302753809928761 +864 859 13.93711223411102 +865 859 -0.7302097840023967 +112 860 -10.60843169476616 +113 860 9.555109350138816 +114 860 -2.589956561691463 +859 860 24.24318678067351 +860 860 312.7535170437741 +861 860 20.78869954543891 +864 860 -2.354031996652562 +865 860 11.28219155614111 +866 860 0.393660274560113 +4 861 -17.59455012434043 +45 861 16.87621161775007 +46 861 1.450172626643706 +112 861 2.46880826875428 +113 861 0.3220072310444548 +461 861 -10.23231719200787 +860 861 22.05077816507343 +861 861 284.147577580189 +865 861 -4.750147221951051 +866 861 3.582283972561312 +132 862 -12.57438070204455 +133 862 29.40100320397315 +134 862 -0.0594593535666359 +857 862 2.515055009660633 +858 862 -0.5814937281480068 +862 862 338.1779982374971 +863 862 36.04742061627468 +867 862 3.648345860781053 +868 862 -2.940989273733305 +857 863 -7.880274417039317 +858 863 9.5209250750192 +859 863 -2.381000492970971 +862 863 34.16378439459622 +863 863 373.3470226478963 +864 863 38.55321797586337 +867 863 -0.2432209430921937 +868 863 11.57875762361841 +869 863 -1.327233177387313 +858 864 -4.722969592495113 +859 864 11.97381705706963 +860 864 -4.723020490875098 +863 864 37.86774567724579 +864 864 386.6162363901881 +865 864 37.8680616838142 +868 864 -0.5223587310991302 +869 864 14.35937122848126 +870 864 -0.5223034611375965 +859 865 -2.380953690795504 +860 865 9.520900569426477 +861 865 -7.880346187086735 +864 865 38.5535531655656 +865 865 373.3465311829135 +866 865 34.16326332526887 +869 865 -1.327234956662716 +870 865 11.57871154635748 +871 865 -0.2432016428120525 +45 866 -12.57439584469564 +46 866 29.40088961229781 +47 866 -0.05945029830358362 +860 866 -0.5814351291382929 +861 866 2.515082411083799 +865 866 36.04689368887772 +866 866 338.1766219243823 +870 866 -2.94109686559004 +871 866 3.648350014824189 +133 867 -9.614024443476527 +134 867 41.91677445127801 +135 867 -1.291223208472115 +862 867 2.427302022820793 +863 867 -1.252372210050482 +867 867 397.2315423196159 +868 867 49.46228886443328 +872 867 3.262364950447477 +873 867 -1.546885817937186 +862 868 -5.977723601902235 +863 868 9.82913070062088 +864 868 -2.170044613507361 +867 868 47.18012238576593 +868 868 435.8544793422168 +869 868 52.21141703711835 +872 868 -0.7431109043716582 +873 868 11.86003945775808 +874 868 -0.4747060918141717 +863 869 -3.660861069983249 +864 869 12.45028826215925 +865 869 -3.66089765222202 +868 869 51.40166897830873 +869 869 450.3671245127113 +870 869 51.40212881358839 +873 869 -0.3148170499448906 +874 869 14.89514603883858 +875 869 -0.314757857178833 +864 870 -2.170001928145325 +865 870 9.829088224877314 +866 870 -5.97779584827305 +869 870 52.21189818137788 +870 870 435.853842393956 +871 870 47.17941137437008 +874 870 -0.4746993620894813 +875 870 11.86003696576777 +876 870 -0.7431044510063991 +46 871 -9.614036689983458 +47 871 41.91660613837115 +48 871 -1.291218729951529 +865 871 -1.252326065810751 +866 871 2.427322188306416 +870 871 49.4615733320824 +871 871 397.2294473474591 +875 871 -1.546976656394564 +876 871 3.262396110521788 +134 872 -7.598652985838658 +135 872 54.19631372449658 +136 872 -2.339196013405589 +867 872 2.009504144683113 +868 872 -1.776990581109569 +872 872 458.1222214656037 +873 872 62.36093009800235 +877 872 2.591200843639434 +878 872 -0.4501713437375354 +867 873 -4.523113013658756 +868 873 10.13888584286182 +869 873 -1.955240266931 +872 873 59.75935477446966 +873 873 498.7695527221854 +874 873 65.28775829418848 +877 873 -1.146008421922726 +878 873 12.14085083543014 +879 873 0.2469221221521245 +868 874 -2.776548157667387 +869 874 13.02540769676486 +870 874 -2.776572949586479 +873 874 64.37730870973581 +874 874 514.0668020242332 +875 874 64.37791825209277 +878 874 -0.1097371955988891 +879 874 15.52114918514707 +880 874 -0.109674791514152 +869 875 -1.955199073739706 +870 875 10.138884376032 +871 875 -4.523165310882124 +874 875 65.28838698532348 +875 875 498.7687927333116 +876 875 59.75844182006134 +879 875 0.2469329474518496 +880 875 12.1408596384809 +881 875 -1.146007666857288 +47 876 -7.598656227182423 +48 876 54.19611176883298 +49 876 -2.339189486684241 +870 876 -1.77695000677603 +871 876 2.009549412355877 +875 876 62.36001623822459 +876 876 458.119424358351 +880 876 -0.4502546773858462 +881 876 2.591225501962793 +6 877 -3.265094057649666 +38 877 0.299550789623801 +39 877 1.145799978301447 +135 877 -6.179429304518456 +136 877 66.01129440778477 +192 877 -14.48338074777537 +872 877 1.349296343611087 +873 877 -2.198326157134725 +877 877 517.4173664746827 +878 877 74.33210146116588 +37 878 0.7057576698772667 +38 878 11.25166859352705 +39 878 -1.528860660410311 +872 878 -3.385199547164547 +873 878 10.44890029952456 +874 878 -1.742394452433492 +877 878 71.57340493564837 +878 878 557.8546391652517 +879 878 77.27718193916795 +36 879 -0.03612995537991104 +37 879 14.78080126099824 +38 879 -0.03630914769001414 +873 879 -2.029077786156359 +874 879 13.67996878716101 +875 879 -2.029099443728859 +878 879 76.31626508097307 +879 879 573.1296763022119 +880 879 76.31752592278994 +35 880 -1.528716440624262 +36 880 11.25293965456305 +37 880 0.7057931359591336 +874 880 -1.742351763493023 +875 880 10.44890984184131 +876 880 -3.385249893761989 +879 880 77.27809735798861 +880 880 557.8582577634741 +881 880 71.57332461721498 +11 881 -3.265025205242422 +35 881 1.147496788072559 +36 881 0.299645835195685 +48 881 -6.179432351273569 +49 881 66.01230802605238 +373 881 -14.48443828890605 +875 881 -2.198290557420055 +876 881 1.349335725669562 +880 881 74.33174900583171 +881 881 517.4215792967784 +6 882 -55.19450168765755 +30 882 -326.8619821969691 +31 882 -62.23448223137989 +101 882 -16.16736306652367 +136 882 -14.20743848182314 +192 882 158.5651890297825 +193 882 -53.41314483515903 +597 882 -94.89092278809341 +605 882 -16.30227062206379 +855 882 -16.02196580496807 +856 882 -83.44906660366209 +882 882 1160.17070129813 +883 882 167.0572439721826 +887 882 -308.5107368387084 +888 882 -60.84146837164975 +1172 882 -11.57408707486891 +1173 882 -17.89254191786407 +30 883 -60.32936132848804 +31 883 -349.8740593833026 +32 883 -64.57309844502234 +597 883 -16.25108159579993 +605 883 -95.46056982955989 +613 883 -16.35728526082606 +854 883 -16.5825083518973 +855 883 -89.47171847438693 +856 883 -15.24850660030181 +882 883 163.961083304639 +883 883 1202.895847361624 +884 883 170.1090452837955 +887 883 -58.83791812842742 +888 883 -332.3852074830761 +889 883 -63.33213805489075 +31 884 -63.92117166871184 +32 884 -358.292531212375 +33 884 -63.92836769345428 +605 884 -16.34193689328625 +613 884 -95.6784332655468 +621 884 -16.34181587722821 +853 884 -16.27479157439302 +854 884 -91.74799463098654 +855 884 -16.27459788593282 +883 884 169.0372830935938 +884 884 1219.200382325883 +885 884 169.0469182317992 +888 884 -62.64528985634882 +889 884 -341.1320661474283 +890 884 -62.6529724681319 +32 885 -64.57651085582364 +33 885 -349.9309778421552 +34 885 -60.34512440905305 +613 885 -16.35994673714577 +621 885 -95.47381853532113 +629 885 -16.25360688215817 +852 885 -15.24890545217183 +853 885 -89.4731293358338 +854 885 -16.58257767012174 +884 885 170.1122545730721 +885 885 1202.996797824912 +886 885 163.9809698376888 +889 885 -63.33580668766761 +890 885 -332.4446896301735 +891 885 -58.85471992986753 +8 886 -55.21440918979143 +33 886 -62.24751943031988 +34 886 -326.959732552694 +93 886 -16.17187629023529 +131 886 -14.20794470087532 +163 886 158.5900760480082 +164 886 -53.4343021967939 +621 886 -16.30677012627361 +629 886 -94.91419054104108 +852 886 -83.45149126407762 +853 886 -16.022281209233 +885 886 167.0724568511788 +886 886 1160.344895987486 +890 886 -60.85540743331481 +891 886 -308.6125719172662 +1404 886 -11.55326113609444 +1405 886 -17.89703140949836 +192 887 -53.96211231075516 +193 887 170.9755566606246 +194 887 -51.88193653605917 +882 887 -314.3172257074348 +883 887 -61.34367270218191 +887 887 1288.697776260963 +888 887 178.9393473469195 +892 887 -289.5359604265474 +893 887 -59.94690482274765 +1172 887 -17.38339225561187 +1173 887 -21.88403482916372 +1174 887 -20.35273271256018 +882 888 -59.33921351149062 +883 888 -338.2581212473809 +884 888 -63.81796878875134 +887 888 175.6609032629104 +888 888 1334.50905176601 +889 888 181.890548162076 +892 888 -57.77436174159769 +893 888 -314.9995005397989 +894 888 -62.68929658005357 +883 889 -63.13095168899469 +884 889 -347.0375689014126 +885 889 -63.13860125409813 +888 889 180.7537319001496 +889 889 1352.212073563325 +890 889 180.763433275221 +893 889 -61.94219161841217 +894 889 -324.3572947663099 +895 889 -61.95067697848405 +884 890 -63.82159679488382 +885 890 -338.3177708543877 +886 890 -59.35592338333694 +889 890 181.8932380696737 +890 890 1334.618106948653 +891 890 175.6803571893887 +894 890 -62.69337447961794 +895 890 -315.0635312449199 +896 890 -57.79285981528364 +163 891 -53.98315554688567 +164 891 170.9997388293693 +165 891 -51.9051273582636 +885 891 -61.35751252777166 +886 891 -314.4193706629507 +890 891 178.9537456604904 +891 891 1288.885544352614 +895 891 -59.96230719661868 +896 891 -289.6450673043802 +1404 891 -17.38792876926249 +1405 891 -21.8607729756751 +1406 891 -20.35739844319047 +193 892 -52.55844416002604 +194 892 188.0666074635493 +195 892 -50.34268533651394 +887 892 -296.7061087367051 +888 892 -60.57314255021856 +892 892 1462.259426217334 +893 892 195.5385979772317 +897 892 -269.0887488414626 +898 892 -59.11657212443696 +1173 892 -19.72238952064793 +1174 892 -35.21562892366403 +1175 892 -23.20954400828975 +887 893 -58.39558774155421 +888 893 -322.2956838096683 +889 893 -63.29674903597702 +892 893 191.9386015656782 +893 893 1513.080376718598 +894 893 198.4085037583965 +897 893 -56.76371501232549 +898 893 -296.2341041194247 +899 893 -62.14407759396113 +888 894 -62.54815343323123 +889 894 -331.71077707581 +890 894 -62.55660835281708 +893 894 197.1583391343328 +894 894 1532.98843554663 +895 894 197.1683752884031 +898 894 -61.33189301337852 +899 894 -306.240407381007 +900 894 -61.34126559314352 +889 895 -63.3007778367747 +890 895 -322.3600581276811 +891 895 -58.41399173698587 +894 895 198.4105718216253 +895 895 1513.202884578695 +896 895 191.9579652475975 +899 895 -62.14862424096726 +900 895 -296.3029082775671 +901 895 -56.78408812244978 +164 896 -52.58151940112882 +165 896 188.0904662381717 +166 896 -50.36810862798644 +890 896 -60.58843545852321 +891 896 -296.815828736111 +895 896 195.5522842959777 +896 896 1462.469683595544 +900 896 -59.13361156200158 +901 896 -269.2053861934756 +1405 896 -19.72708030273726 +1406 896 -35.18962828698459 +1407 896 -23.21453213333513 +194 897 -51.11303461053797 +195 897 206.8853562330988 +196 897 -46.08355428453571 +892 897 -277.2707301099168 +893 897 -59.83850767028285 +897 897 1661.101159679987 +898 897 213.5428229715792 +902 897 -227.9583580806797 +903 897 -55.39100989257426 +1174 897 -22.48831955331037 +1175 897 -51.96222945948043 +1176 897 -26.44908530889589 +892 898 -57.47524383425611 +893 898 -304.612872584127 +894 898 -62.84637502150719 +897 898 209.5946240494709 +898 898 1717.515244353746 +899 898 216.208805849515 +902 898 -52.93531833102645 +903 898 -255.7697179756153 +904 898 -58.64792673012823 +893 899 -62.0309164169664 +894 899 -314.7053749725418 +895 899 -62.04026703810661 +898 899 214.8361272113997 +899 899 1739.925212864344 +900 899 214.8463304768149 +903 899 -57.7966245108191 +904 899 -266.0359483628587 +905 899 -57.80666663665406 +894 900 -62.85086703250125 +895 900 -304.682235696692 +896 900 -57.49553324125026 +899 900 216.2099582865465 +900 900 1717.653261049202 +901 900 209.6133184323605 +904 900 -58.65289441262318 +905 900 -255.8407005395114 +906 900 -52.95712668362918 +165 901 -51.13835649713433 +166 901 206.9081475837442 +167 901 -46.11064474535545 +895 901 -59.85543841461163 +896 901 -277.388344134552 +900 901 213.5551492880662 +901 901 1661.337218194869 +905 901 -55.40937530614676 +906 901 -228.078009823029 +1406 901 -22.49329643027266 +1407 901 -51.93385722934379 +1408 901 -26.45422433865419 +195 902 -46.97419358861797 +196 902 227.4801183593873 +197 902 -41.21564712772367 +897 902 -237.4378494342649 +898 902 -56.23608919264751 +902 902 1887.81817105155 +903 902 232.901134750571 +907 902 -180.9808446823489 +908 902 -51.02701004118465 +1175 902 -25.61123047192811 +1176 902 -72.75420454775667 +1177 902 -30.07849352687339 +897 903 -53.76278731339762 +898 903 -265.539858696024 +899 903 -59.4724703926904 +902 903 228.5867098078178 +903 903 1950.365435423629 +904 903 235.196062762713 +907 903 -48.49844918907111 +908 903 -209.0729156916744 +909 903 -54.5080809035765 +898 904 -58.61547703077644 +899 904 -275.9309321392577 +900 904 -58.62550920296646 +903 904 233.6948123301128 +904 904 1975.569296996361 +905 904 233.704922660665 +908 904 -53.62741353458168 +909 904 -219.4462859288431 +910 904 -53.63806409084869 +899 905 -59.47737655204273 +900 905 -265.611688910204 +901 905 -53.78452697551808 +904 905 235.1959222598117 +905 905 1950.5210613965 +906 905 228.6039251914091 +909 905 -54.51348246148279 +910 905 -209.1449744384756 +911 905 -48.52158673173365 +166 906 -47.001202604052 +167 906 227.5008228545011 +168 906 -41.24426153833915 +900 906 -56.25434845498532 +901 906 -237.5589600206325 +905 906 232.9112307103379 +906 906 1888.083389740057 +910 906 -51.04665170378257 +911 906 -181.1015966846691 +1407 906 -25.61630922729192 +1408 906 -72.72409716454874 +1409 906 -30.08387321820282 +196 907 -42.17311733982369 +197 907 250.3918522298393 +198 907 -34.15816526909822 +902 907 -191.1924274471537 +903 907 -51.94660862421237 +907 907 2145.61650092975 +908 907 254.2140035724326 +912 907 -116.3151363187318 +913 907 -44.30323061136943 +1176 907 -29.17354244620104 +1177 907 -97.47386084068316 +1178 907 -34.23863886905792 +902 908 -49.3931287509461 +903 908 -219.6646195516743 +904 908 -55.40802626261949 +907 908 249.4957424674947 +908 908 2215.088485178344 +909 908 255.9804002497156 +912 908 -41.78993263485013 +913 908 -143.5818730619239 +914 908 -47.94939581193236 +903 909 -54.51915772388834 +904 909 -230.1995706493879 +905 909 -54.52981452912491 +908 909 254.3379304535911 +909 909 2243.471059730862 +910 909 254.3477386347811 +913 909 -47.06968456171396 +914 909 -153.6239259282818 +915 909 -47.08068735733659 +904 910 -55.41336359079877 +905 910 -219.7378083092497 +906 910 -49.41622288642737 +909 910 255.9786011086437 +910 910 2215.264551474794 +911 910 249.5107791323028 +914 910 -47.95518462139506 +915 910 -143.652006356792 +916 910 -41.81391428794024 +167 911 -42.20168254350553 +168 911 250.4096074962392 +169 911 -34.18770478140737 +905 911 -51.96615773138258 +906 911 -191.3151006340264 +910 911 254.2210808787109 +911 911 2145.915476298922 +915 911 -44.32380549946535 +916 911 -116.4319334870664 +1408 911 -29.17880654564581 +1409 911 -97.44285061763003 +1410 911 -34.24414804619199 +197 912 -35.19681898259294 +198 912 276.0707650869425 +199 912 -26.06466809116604 +907 912 -127.4137565372268 +908 912 -45.31236643211552 +912 912 2440.33578418557 +913 912 277.8336417290158 +917 912 -42.29719459057375 +918 912 -36.45127093791609 +1177 912 -33.25260891128288 +1178 912 -126.8590837704467 +1179 912 -38.87837252587016 +907 913 -42.7657655975601 +908 913 -155.1636202805201 +909 913 -48.93984825020129 +912 913 272.680733027995 +913 913 2517.524893088458 +914 913 278.8713690187717 +917 913 -34.013417666911 +918 913 -68.00184603484607 +919 913 -40.2298243356384 +908 914 -48.04902010510218 +909 914 -165.4099723038128 +910 914 -48.06004782974075 +913 914 277.0775527203565 +914 914 2549.483003749964 +915 914 277.0867585374899 +918 914 -39.37206616948762 +919 914 -77.41190935719727 +920 914 -39.38325138030255 +909 915 -48.9455695351562 +910 915 -155.2352111782688 +911 915 -42.78973234522812 +914 915 278.867460277487 +915 915 2517.724342411308 +916 915 272.6926676956793 +919 915 -40.23598274976848 +920 915 -68.06793713418547 +921 915 -34.03794266411759 +168 916 -35.22634521698099 +169 916 276.0844463963585 +170 916 -26.09477029178623 +910 916 -45.332864129467 +911 916 -127.5330064559898 +915 916 277.8366911531299 +916 916 2440.673307778676 +920 916 -36.47257456145414 +921 916 -42.40654827186187 +1409 916 -33.25793943189788 +1410 916 -126.8281852659091 +1411 916 -38.88403122436134 +198 917 -27.12271505339227 +199 917 304.8638139599085 +200 917 -16.62966369218032 +912 917 -53.62285948521088 +913 917 -37.49026494990109 +917 917 2772.354593173217 +918 917 304.2247143785038 +922 917 43.74977013113686 +923 917 -27.1483928639171 +1178 917 -37.86983545260733 +1179 917 -160.3769713735541 +1180 917 -44.1215595815661 +912 918 -35.01248109366534 +913 918 -79.88736435812459 +914 918 -41.25240013841808 +917 918 298.583180209321 +918 918 2858.299791109035 +919 918 304.37147281546 +922 918 -24.85838450380166 +923 918 20.49801731050599 +924 918 -31.01816579040703 +913 919 -40.38115565484738 +914 919 -89.53365306529449 +915 919 -40.39238400681545 +918 919 302.4081035578976 +919 919 2894.315683582659 +920 919 302.4165150722714 +923 919 -30.20798051116503 +924 919 12.08695703758893 +925 919 -30.21913990270818 +914 920 -41.25849196624526 +915 920 -79.95516468090307 +916 920 -35.0370220016744 +919 920 304.3650691076133 +920 920 2858.526204417586 +921 920 298.5913435764894 +924 920 -31.0246704795912 +925 920 20.43852586174845 +926 920 -24.88309076176877 +169 921 -27.152842076524 +170 921 304.8726235393078 +171 921 -16.65990064201674 +915 921 -37.51151274221975 +916 921 -53.73506399753134 +920 921 304.2229506880115 +921 921 2772.736532742895 +925 921 -27.17017528954461 +926 921 43.65202828271293 +1410 921 -37.87526109069538 +1411 921 -160.3472230622795 +1412 921 -44.12734677336167 +199 922 -17.71384582048764 +200 922 337.8271321128723 +201 922 -5.750342611900944 +917 922 32.12624111392623 +918 922 -28.22329173415159 +922 922 3153.203498344441 +923 922 334.3373768917648 +927 922 143.1334313942796 +928 922 -16.30901892399831 +1179 922 -43.08434067662346 +1180 922 -199.1168267909594 +1181 922 -50.11925127681072 +917 923 -25.88675618420489 +918 923 8.237623550490198 +919 923 -32.07875989344228 +922 923 328.1516169285475 +923 923 3249.081153425805 +924 923 333.3898395992256 +927 923 -14.23877865434153 +928 923 123.2326896941063 +929 923 -20.23338554450491 +918 924 -31.25270501987781 +919 924 -0.4420345554404861 +920 924 -31.26392551188535 +923 924 331.2383377842884 +924 924 3289.707114910967 +925 924 331.2456843788075 +928 924 -19.4964982869708 +929 924 116.1958765801243 +930 924 -19.50743185796498 +919 925 -32.08519852685673 +920 925 8.176168937916657 +921 925 -25.91150802576814 +924 925 333.3804593913684 +925 925 3249.338537274328 +926 925 328.155126251819 +929 925 -20.24022428634585 +930 925 123.1823935291803 +931 925 -14.26333497588212 +170 926 -17.744143979211 +171 926 337.8300157712936 +172 926 -5.780331326936881 +920 926 -28.24503873808511 +921 926 32.02524960437118 +925 926 334.3297865890249 +926 926 3153.636468222002 +930 926 -16.33105895673241 +931 926 143.0514943745943 +1411 926 -43.08984129967193 +1412 926 -199.0892961781209 +1413 926 -50.1251267045585 +200 927 -6.806551834822169 +201 927 374.8374541207381 +202 927 5.516300106121346 +922 927 131.7943789308393 +923 927 -17.36504170895996 +927 927 3578.501271626207 +928 927 368.1975880070612 +932 927 247.4674386357305 +933 927 -5.063080327407761 +1180 927 -49.10556221424424 +1181 927 -242.1346602293688 +1182 927 -56.65233600464436 +922 928 -15.24460136855895 +923 928 111.2183677207957 +924 928 -21.27772107448737 +927 928 361.3949634387403 +928 928 3685.608309494402 +929 928 366.0100908150018 +932 928 -3.248756910264124 +933 928 231.3602039588557 +934 928 -9.032753698065971 +923 929 -20.52356872748463 +924 929 103.8966178919962 +925 929 -20.53457674523883 +928 929 363.6456882866262 +929 929 3731.427840806688 +930 929 363.6518339010897 +933 929 -8.382482909453849 +934 929 225.8923359384162 +935 929 -8.39309855111054 +924 930 -21.28449745000668 +925 930 111.1659734917024 +926 930 -15.26922771242622 +929 930 365.9973627599058 +930 930 3685.900883978612 +931 930 361.3932662642408 +934 930 -9.039938036763445 +935 930 231.3205006244681 +936 930 -3.273037625962836 +171 931 -6.836631216257732 +172 931 374.8337646658548 +173 931 5.486692532057731 +925 931 -17.38706654145038 +926 931 131.7089913233938 +930 931 368.1834716648224 +931 931 3578.992237343522 +935 931 -5.08530574891579 +936 931 247.4034831198474 +1412 931 -49.11111695127208 +1413 931 -242.1102629226672 +1414 931 -56.65837536985173 +201 932 4.482988438123346 +202 932 417.7858474368645 +203 932 18.84406113588211 +927 932 236.3613187394407 +928 932 -6.103710766962188 +932 932 4068.390255678428 +933 932 407.5593314687193 +937 932 371.5669427839964 +938 932 8.287624895597947 +1181 932 -55.65790738769769 +1182 932 -291.2153588011244 +1183 932 -64.4908061563842 +927 933 -4.236133209983951 +928 933 219.5468751109589 +929 933 -10.06390662664389 +932 933 400.0498522995472 +933 933 4188.412318028101 +934 933 403.9361376734021 +937 933 9.771592493941302 +938 933 360.2420665826296 +939 933 4.292458337709473 +928 934 -9.395192710751484 +929 934 213.7803056095015 +930 934 -9.405894056279266 +933 934 401.3282686260249 +934 934 4240.189120577415 +935 934 401.3330060921284 +938 934 4.829335598742777 +939 934 356.7644565281121 +940 934 4.819208790651299 +929 935 -10.07103171062637 +930 935 219.5049602447189 +931 935 -4.260504337434078 +934 935 403.9195550692555 +935 935 4188.745421031354 +936 935 400.0421547874679 +939 935 4.284897767411604 +940 935 360.2158151793521 +941 935 9.747824722557802 +172 936 4.453265809402069 +173 936 417.7746372686201 +174 936 18.81509626599624 +930 936 -6.125938013376569 +931 936 236.2937457471403 +935 936 407.5377031527226 +936 936 4068.948089443402 +940 936 8.265335072806405 +941 936 371.5255813954273 +1413 936 -55.6635976986168 +1414 936 -291.1949620191064 +1415 936 -64.49693711031364 +202 937 17.87026719442105 +203 937 465.8137857959642 +204 937 31.61083970224118 +932 937 361.0902919084448 +933 937 7.300909377666066 +937 937 4611.550212574502 +938 937 451.7245902912848 +942 937 492.7037259086455 +943 937 21.02254877978701 +1182 937 -63.55148936506461 +1183 937 -344.9425632180822 +1184 937 -72.58004543397151 +932 938 8.838400860262901 +933 938 349.0614385271781 +934 938 3.313067019201974 +937 938 443.4166249812903 +938 938 4746.054314150138 +939 938 446.5365613539478 +942 938 22.18132634125295 +943 938 486.0900655615492 +944 938 16.98286543046172 +933 939 3.868588271888036 +934 939 345.2861531658835 +935 939 3.858370197483382 +938 939 443.653720673177 +939 939 4804.482739129428 +940 939 443.6569687442721 +943 939 17.40758093839653 +944 939 484.5891315714608 +945 939 17.39791106568162 +934 940 3.305560822678313 +935 940 349.0329740661668 +936 940 8.81453014308482 +939 940 446.5157604877398 +940 940 4746.432789853152 +941 940 443.4024722108102 +944 940 16.97489499006155 +945 940 486.0772455623234 +946 940 22.15797194654097 +173 941 17.84117268489695 +174 941 465.7945168180986 +175 941 31.58238218751369 +935 941 7.278604188665636 +936 941 361.0453269395865 +940 941 451.694815133838 +941 941 4612.182947792803 +945 941 21.00010526917925 +946 941 492.6848006392303 +1414 941 -63.55726290033518 +1415 941 -344.9268029121906 +1416 941 -72.58641800306668 +203 942 30.6909412373649 +204 942 521.9451213042782 +205 942 47.44680096567231 +937 942 482.798915120406 +938 942 20.08568906970321 +942 942 5240.16893522754 +943 942 503.5241697699378 +947 942 644.1935439750881 +948 942 36.7932995799268 +1183 942 -71.69101570243248 +1184 942 -406.1581996311994 +1185 942 -82.89920978160147 +937 943 21.2976688675903 +938 943 475.4905775655594 +939 943 16.05163158219812 +942 943 494.2857262827056 +943 943 5391.48359586315 +944 943 496.5697764567751 +947 943 37.54589704595486 +948 943 643.4592063098852 +949 943 32.69892789684857 +938 944 16.49496723460208 +939 944 473.6955650005068 +940 944 16.48520275163986 +943 944 493.3667026002448 +944 944 5457.603225389859 +945 944 493.368306786953 +948 944 32.9826003292721 +949 944 644.4399911405148 +950 944 32.97350911597368 +939 945 16.04371131062435 +940 945 475.4755644133539 +941 945 21.2742031237905 +944 945 496.5441860015462 +945 945 5391.914513446771 +946 945 494.26434802533 +949 945 32.69044140771598 +950 945 643.4631948850179 +951 945 37.52304307385252 +174 946 30.66234448548421 +175 946 521.9168577816213 +176 946 47.41892831113039 +940 946 20.06322011371334 +941 946 482.7764319918934 +945 946 503.4852087425202 +946 946 5240.888344105438 +950 946 36.77065398206952 +951 946 644.2025588858664 +1415 946 -71.69702809402422 +1416 946 -406.1477036245165 +1417 946 -82.90575681037856 +204 947 46.59911051819168 +205 947 584.3136865026057 +206 947 61.72355894908697 +942 947 635.0601682269202 +943 947 35.92635498424686 +947 947 5933.184958185063 +948 947 561.2673109861114 +952 947 783.313759083244 +953 947 50.92226816998701 +1184 947 -82.07867497984705 +1185 947 -472.759779992817 +1186 947 -92.87938775550438 +942 948 36.72999561196437 +943 948 633.6630335160301 +944 948 31.83616656050804 +947 948 550.9870427453259 +948 948 6103.183693493069 +949 948 552.4186513343209 +952 948 51.31064753042909 +953 948 787.9024035019891 +954 948 46.74275000420119 +943 949 32.13777290647351 +944 949 634.3629381448548 +945 949 32.12858804116076 +948 949 548.8569006430879 +949 949 6177.821195430208 +950 949 548.856808935974 +953 949 46.89975926144589 +954 949 791.1464640751881 +955 949 46.89112785986137 +944 950 31.82772536719649 +945 950 633.664922371772 +946 950 36.70702822110724 +949 950 552.3878811662364 +950 950 6103.672664987617 +951 950 550.9580018587282 +954 950 46.73372488182016 +955 950 787.9217863288106 +956 950 51.28806714579713 +175 951 46.57109675233524 +176 951 584.2758956879027 +177 951 61.69599210442284 +945 951 35.90367750663773 +946 951 635.0657872348029 +950 951 561.2185102579566 +951 951 5934.000369766252 +955 951 50.89926167461855 +956 951 783.348295458846 +1416 951 -82.0848728781524 +1417 951 -472.7549411553307 +1418 951 -92.88629124814555 +205 952 60.94281124791322 +206 952 657.5005926150714 +207 952 80.62604678461015 +947 952 774.8971417539959 +948 952 50.12106666970454 +952 952 6739.365358387467 +953 952 629.2620514943119 +957 952 969.2036592192098 +958 952 69.54260874910315 +1185 952 -92.1226866302168 +1186 952 -549.0576256593556 +1187 952 -106.526697017943 +947 953 50.55797476670767 +948 953 778.8583075734819 +949 953 45.94464054751055 +952 953 617.7564912017317 +953 953 6931.201072875691 +954 953 618.2847114930402 +957 953 69.4664458635323 +958 953 980.6623806356735 +959 953 65.22680823748198 +948 954 46.11875375938872 +949 954 781.8362070075627 +950 954 46.11003120397166 +953 954 614.3010640999765 +954 954 7015.758087384762 +955 954 614.2991433498314 +958 954 65.22183113347492 +959 954 986.8453181634835 +960 954 65.21373382473608 +949 955 45.93565642744676 +950 955 778.8756970875158 +951 955 50.53528176856969 +954 955 618.2480586678317 +955 955 6931.757506202068 +956 955 617.7189229450399 +959 955 65.21702687057514 +960 955 980.7016539009167 +961 955 69.44404761284279 +176 956 60.91510481432407 +177 956 657.4522024012729 +178 956 80.59864533984995 +950 956 50.09802442151577 +951 956 774.9284622595972 +955 956 629.2021804225035 +956 956 6740.292432410982 +960 956 69.51897047793562 +961 956 969.2711179304289 +1417 956 -92.12925560810208 +1418 956 -549.0589477012163 +1419 956 -106.5339447052339 +206 957 79.90577017017851 +207 957 739.7477570530907 +208 957 97.33251664297416 +952 957 961.4355551606448 +953 957 68.80141538751943 +957 957 7639.985132747472 +958 957 705.8576297829181 +962 957 1135.971737789193 +963 957 85.89856612330023 +1186 957 -105.8278808042998 +1187 957 -633.3793546406027 +1188 957 -119.2558019439786 +952 958 68.77116542380799 +953 958 972.3025718303469 +954 958 64.48788893514015 +957 958 692.9720330477599 +958 958 7856.301660966034 +959 958 692.5631743601039 +962 958 85.42021306136557 +963 958 1153.455023469859 +964 958 81.42140013895668 +953 959 64.49913494817896 +954 959 978.2343208952526 +955 959 64.49094983348634 +958 959 688.1042165932234 +959 959 7951.952103379512 +960 959 688.1003709736959 +963 959 81.2761645648275 +964 959 1162.231110674219 +965 959 81.26845423426224 +954 960 64.47814484652459 +955 960 972.3399612583648 +956 960 68.74865712381501 +959 960 692.5200647098044 +960 960 7856.933412727747 +961 960 692.925250461311 +964 960 81.41087123255775 +965 960 1153.511895213383 +966 960 85.39775828559895 +177 961 79.87823270017554 +178 961 739.6879114302134 +179 961 97.30499540203897 +955 961 68.77773928497415 +956 961 961.4999806888425 +960 961 705.7856947575792 +961 961 7641.036942482357 +965 961 85.87415897394698 +966 961 1136.068291234503 +1418 961 -105.8348101194092 +1419 961 -633.3871953142789 +1420 961 -119.2635427434826 +207 962 96.69865582287233 +208 962 833.2456642821952 +209 962 119.1084998114063 +957 962 1129.133259999672 +958 962 85.2448623348541 +962 962 8657.230053333979 +963 962 793.1735828866076 +967 962 1355.304258530097 +968 962 107.1018462095311 +1187 962 -118.6403204911679 +1188 962 -727.4734655264485 +1189 962 -136.3711015111075 +957 963 84.80771617348033 +958 963 1146.086827543396 +959 963 80.76928852006994 +962 963 778.7087831264045 +963 963 8901.370727555797 +964 963 777.3464867716941 +967 963 106.1252383749046 +968 963 1380.381869726763 +969 963 102.3762112178141 +958 964 80.63864252696763 +959 964 1154.637890866798 +960 964 80.63085230655135 +963 964 772.3433512240158 +964 964 9009.593379484077 +965 964 772.3375074761212 +968 964 102.0571840731321 +969 964 1392.445515809028 +970 964 102.0498592909866 +959 965 80.7587920297681 +960 965 1146.142009852476 +961 965 84.78516021967519 +964 965 777.2962391718297 +965 965 8902.087668399714 +966 965 778.6520342265358 +969 965 102.3646421138415 +970 965 1380.460961290051 +971 965 106.1024447464879 +178 966 96.67100978934124 +179 966 833.1734165171611 +180 966 119.0804899821895 +960 966 85.22041847147213 +961 966 1129.227097577493 +965 966 793.0884430669205 +966 966 8658.423016619132 +970 966 107.0762059380071 +971 966 1355.437549002514 +1419 966 -118.647774256606 +1420 966 -727.4881631777724 +1421 966 -136.3794213338947 +208 967 118.5231336864035 +209 967 939.8553624554614 +210 967 139.6673003313591 +962 967 1348.987242166043 +963 967 106.4970992292689 +967 967 9812.203712025883 +968 967 892.9005069727351 +972 967 1564.57378207125 +973 967 127.0179329060235 +1188 967 -135.802336935831 +1189 967 -833.4414241695827 +1190 967 -153.1264992509658 +962 968 105.5591364048043 +963 968 1373.56903499916 +964 968 101.7726317603705 +967 968 876.6356988397472 +968 968 10087.97062877942 +969 968 874.2584957444139 +972 968 125.5842292267315 +973 968 1596.714630596515 +974 968 122.0174125361681 +963 969 101.4673089918399 +964 969 1385.421942847552 +965 969 101.4599084971898 +968 969 868.6349927595315 +969 969 10210.46023914932 +970 969 868.6269891796003 +973 969 121.5390419225024 +974 969 1611.851258357145 +975 969 121.5319857573076 +964 970 101.7610923027604 +965 970 1373.646543062855 +966 970 105.5362461451503 +969 970 874.2002582831371 +970 970 10088.78406153593 +971 970 876.5679246688834 +974 970 122.0047865012113 +975 970 1596.814509323319 +976 970 125.5608870862662 +179 971 118.495004868094 +180 971 939.769384352213 +181 971 139.6385511274182 +965 971 106.4714225232816 +966 971 1349.117990264853 +970 971 892.8006618215497 +971 971 9813.556633825716 +975 971 126.9909137992153 +976 971 1564.741432484035 +1420 971 -135.8103866343327 +1421 971 -833.4634410071833 +1422 971 -153.1355041786618 +209 972 139.1550130822006 +210 972 1060.299632674804 +211 972 165.2620006318616 +967 972 1559.044200642912 +968 972 126.4879491951564 +972 972 11111.57353910984 +973 972 1005.776466137181 +977 972 1827.068138982228 +978 972 151.6948511616542 +1189 972 -152.6284826168474 +1190 972 -951.6780553379842 +1191 972 -174.520355464296 +967 973 125.0884774995612 +968 973 1590.746513792648 +969 973 121.488238675627 +972 973 987.4684458452231 +973 973 11423.0721743035 +974 973 984.0435705757329 +977 973 149.7177753861605 +978 973 1867.75136011984 +979 973 146.3103281182688 +968 974 121.022022852804 +969 974 1605.696667715962 +970 974 121.0148990754477 +973 974 977.7155967543588 +974 974 11561.65050705461 +975 974 977.7053214712503 +978 974 145.6427132507283 +979 974 1886.622430428844 +980 974 145.6358662350116 +969 975 121.4756383825292 +970 975 1590.84499043785 +971 975 125.0650485637189 +974 975 983.976482424642 +975 975 11423.99425038923 +976 975 987.3886590055088 +979 975 146.2963143694103 +980 975 1867.876433546054 +981 975 149.6934743973448 +180 976 139.1261571363751 +181 976 1060.198677268754 +182 976 165.231992059793 +970 976 126.4608964345834 +971 976 1559.209602198675 +975 976 1005.660450613365 +976 976 11113.10661867499 +980 976 151.6658715450282 +981 976 1827.277460026681 +1421 976 -152.6372476244836 +1422 976 -951.7078129040669 +1423 976 -174.5302104831489 +210 977 164.7939819905571 +211 977 1198.075837926876 +212 977 191.0942652330037 +972 977 1822.015524647495 +973 977 151.2101349297898 +977 977 12593.55076091087 +978 977 1135.047364966938 +982 977 2093.905653589411 +983 977 176.5029021257666 +1190 977 -174.0651881225594 +1191 977 -1085.746417497393 +1192 977 -196.633703512372 +972 978 149.2646300673771 +973 978 1862.294774030049 +974 978 145.8261982569615 +977 978 1114.401590908242 +978 978 12945.84312782176 +979 978 1109.847198767396 +982 978 173.9935128597498 +983 978 2143.067790056494 +984 978 170.6928671412924 +973 979 145.1698044917742 +974 979 1880.994006510555 +975 979 145.1628947285072 +978 979 1102.713071862914 +979 979 13102.76838012598 +980 979 1102.700311633472 +983 979 169.8400331849171 +984 979 2165.660163145924 +985 979 169.8332992390167 +974 980 145.8122078778387 +975 980 1862.41855477475 +976 980 149.2402481738773 +979 980 1109.770124342203 +980 980 12946.88891567923 +981 980 1114.308379746635 +984 980 170.6773844390621 +985 980 2143.21796394656 +986 980 173.9680186414505 +181 981 164.7638740186322 +182 981 1197.958130347902 +183 981 191.0627121619871 +975 981 151.1811232881725 +976 981 1822.222773933596 +980 981 1134.913178996828 +981 981 12595.28905156883 +985 981 176.4717364014002 +986 981 2094.156499865701 +1422 981 -174.0748214135008 +1423 981 -1085.784539198593 +1424 981 -196.644511680547 +211 982 190.6855323021849 +212 982 1352.854514417846 +213 982 221.690513645398 +977 982 2089.492477892058 +978 982 176.0792207913309 +982 982 14254.02494929296 +983 982 1280.438346367971 +987 982 2411.694644172194 +988 982 205.783237151412 +1191 982 -196.236065637942 +1192 982 -1235.167175611209 +1193 982 -223.3022628946304 +977 983 173.5976082895202 +978 983 2138.299515312384 +979 983 170.269591639545 +982 983 1257.158889396139 +983 983 14652.14115397996 +984 983 1251.416394222248 +987 983 202.6649426140775 +988 983 2470.691868413754 +989 983 199.4312844159091 +978 984 169.4266380145608 +979 984 2160.740796618075 +980 984 169.4198485931905 +983 984 1243.373823478075 +984 984 14829.6516664323 +985 984 1243.358408929817 +988 984 198.3668210242996 +989 984 2497.616358822017 +990 984 198.3601107316202 +979 985 170.2541292442839 +980 985 2138.448552144132 +981 985 173.5720423030099 +984 985 1251.328245196908 +985 985 14653.32559294389 +986 985 1257.05095724351 +989 985 199.4139962869926 +990 985 2470.871218396807 +991 985 202.6377921940172 +182 986 190.6538911236686 +183 986 1352.718418689114 +184 986 221.6568357307466 +980 986 176.0480262136838 +981 986 2089.741502952731 +985 986 1280.284108094594 +986 986 14255.99327702171 +990 986 205.7492652677652 +991 986 2411.993787922493 +1423 986 -196.246678411535 +1424 986 -1235.214233187642 +1425 986 -223.3142301747042 +212 987 221.3201163557541 +213 987 1530.501296169059 +214 987 254.6961445539941 +982 987 2407.694963325015 +983 987 205.3990330296666 +987 987 16156.10368142975 +988 987 1447.442748203044 +992 987 2756.132142528137 +993 987 237.2791372922576 +1192 987 -222.9418287825716 +1193 987 -1405.65191031635 +1194 987 -252.5163393553691 +982 988 202.3060560286089 +983 988 2466.368756386985 +984 988 199.0473722450149 +987 988 1421.139279855569 +988 988 16606.75288060938 +989 988 1414.094570431342 +992 988 233.5210483589505 +993 988 2825.58033212188 +994 988 230.3081827662656 +983 989 197.9919199806077 +984 989 2493.155598390869 +985 989 197.9851589333238 +988 989 1405.008786822993 +989 989 16807.84434755162 +990 989 1404.990427501514 +993 989 229.0215787155573 +994 989 2857.12184167892 +995 989 229.0147993910611 +984 990 199.0301024452468 +985 990 2466.547070168323 +986 990 202.2788397793807 +989 990 1413.993831125032 +990 990 16608.09598514383 +991 990 1421.014731073748 +994 990 230.2888864831361 +995 990 2825.790755829828 +996 990 233.4918996855342 +183 991 221.286357672588 +184 991 1530.344428669971 +185 991 254.6599182883895 +985 991 205.3650343678136 +986 991 2407.992448206599 +990 991 1447.265781804086 +991 991 16158.335306836 +995 991 237.2419464270426 +996 991 2756.48274757498 +1424 991 -222.9536177456712 +1425 991 -1405.7087843056 +1426 991 -252.5296182869508 +213 992 254.3726365345076 +214 992 1729.057375420171 +215 992 291.7240396994424 +987 992 2752.638498091034 +988 992 236.9433912800587 +992 992 18278.62786620233 +993 992 1634.234786951513 +997 992 3143.98854283072 +998 992 272.5303984829358 +1193 992 -252.2014705803476 +1194 992 -1595.267592638525 +1195 992 -285.6873764172483 +987 993 233.2075152463197 +988 993 2821.803074764015 +989 993 229.9726395396347 +992 993 1604.545846336264 +993 993 18787.98579182639 +994 993 1596.109383635208 +997 993 268.0710647701163 +998 993 3225.005302938408 +999 993 264.8336155381781 +988 994 228.6939454333452 +989 994 2853.223860511025 +990 994 228.6871214474834 +993 994 1585.85549790544 +994 994 19015.41183246469 +995 994 1585.833955286093 +998 994 263.3037647725773 +999 994 3261.670223881366 +1000 994 263.2968195649893 +989 995 229.9533592148667 +990 995 2822.012589462624 +991 995 233.1783085323549 +994 995 1595.994686253937 +995 995 18789.50596008894 +996 995 1604.403008234808 +999 995 264.8120116660361 +1000 995 3225.250182704959 +1001 995 268.0394783990018 +184 996 254.3363390894055 +185 996 1728.87762910576 +186 996 291.6847174326044 +990 996 236.9061765921606 +991 996 2752.987648448443 +995 996 1634.032701307714 +996 996 18281.1533560325 +1000 996 272.4894198074935 +1001 996 3144.396236034133 +1425 996 -252.214592909999 +1426 996 -1595.335058918416 +1427 996 -285.7021725128753 +214 997 291.432750371624 +215 997 1957.762365968189 +216 997 334.396418696251 +992 997 3140.842631564313 +993 997 272.2279638097598 +997 997 20720.33609608265 +998 997 1849.501292850128 +1002 997 3592.32740188093 +1003 997 313.0748436817152 +1194 997 -285.4038217839212 +1195 997 -1812.829367615484 +1196 997 -324.2888495173461 +992 998 267.7887015238613 +993 998 3221.603230840688 +994 998 264.5313266023003 +997 998 1815.911277149466 +998 998 21297.27142112507 +999 998 1805.924452565366 +1002 998 307.8241269327348 +1003 998 3686.515955510718 +1004 998 304.5113141233866 +993 999 263.0086259193336 +994 999 3258.159097999233 +995 999 263.0016402641126 +998 999 1794.324440659584 +999 999 21554.99481138562 +1000 999 1794.29931896835 +1003 999 302.707195633956 +1004 999 3729.026704053962 +1005 999 302.6999720623642 +994 1000 264.5097370635427 +995 1000 3221.847289318957 +996 1000 267.7570625083415 +999 1000 1805.793779593726 +1000 1000 21298.99515820824 +1001 1000 1815.747610653554 +1004 1000 304.4869986090727 +1005 1000 3686.800119193522 +1006 1000 307.789539877289 +185 1001 291.393363566122 +186 1001 1957.556549800959 +187 1001 334.3532969950019 +995 1001 272.1869633776547 +996 1001 3141.249010850761 +1000 1001 1849.270517399979 +1001 1001 20723.19948341733 +1005 1001 313.0293282329619 +1006 1001 3592.80021120092 +1426 1001 -285.4184762686828 +1427 1001 -1812.90865911072 +1428 1001 -324.3054294533311 +215 1002 334.1416163762606 +216 1002 2212.187785329599 +217 1002 379.5730567430087 +997 1002 3589.575408253812 +998 1002 312.8102054806678 +1002 1002 23433.99640921877 +1003 1002 2089.077695501164 +1007 1002 4068.128728747938 +1008 1002 355.9348926840493 +1195 1002 -324.0407827406721 +1196 1002 -2054.136190497743 +1197 1002 -365.4724683497648 +997 1003 307.5770945800813 +998 1003 3683.539343113016 +999 1003 304.2467780743051 +1002 1003 2051.143886890648 +1003 1003 24086.09972893159 +1004 1003 2039.48153105478 +1007 1003 349.8582430125566 +1008 1003 4176.152292261653 +1009 1003 346.4290842389954 +998 1004 302.4489332147451 +999 1004 3725.954455477303 +1000 1004 302.4416741011111 +1003 1004 2026.382477209221 +1004 1004 24377.50944950395 +1005 1004 2026.353457184776 +1008 1004 344.3389133299117 +1009 1004 4224.812980095508 +1010 1004 344.331327927028 +999 1005 304.2224750734431 +1000 1005 3683.822786453195 +1001 1005 307.5424612106054 +1004 1005 2039.333174428013 +1005 1005 24088.04970020514 +1006 1005 2050.957267867083 +1009 1005 346.4018545048158 +1010 1005 4176.477771527615 +1011 1005 349.8203290422457 +186 1006 334.0984379128606 +187 1006 2211.953227192838 +188 1006 379.5257315836495 +1000 1006 312.7646707898733 +1001 1006 3590.047065421934 +1005 1006 2088.815223119467 +1006 1006 23437.23534412813 +1010 1006 355.8844376486032 +1011 1006 4068.670040239838 +1427 1006 -324.0572383884788 +1428 1006 -2054.228334285874 +1429 1006 -365.4909876257259 +216 1007 379.3448653074258 +217 1007 2506.34117029185 +218 1007 435.1700091110148 +1002 1007 4065.664047957875 +1003 1007 355.6978320136658 +1007 1007 26568.84186133996 +1008 1007 2366.156305331482 +1012 1007 4654.7975803074 +1013 1007 408.610734736561 +1196 1007 -365.2502878236669 +1197 1007 -2332.427240097335 +1198 1007 -416.4646613335003 +1002 1008 349.6369834688634 +1003 1008 4173.486070167276 +1004 1008 346.1920973148096 +1007 1008 2323.19876113198 +1008 1008 27307.81698240491 +1009 1008 2309.643497048567 +1012 1008 401.533365885954 +1013 1008 4779.693983369316 +1014 1008 397.9192477398575 +1003 1009 344.107558252169 +1004 1009 4222.060940083109 +1005 1009 344.0999409065266 +1008 1009 2294.810642702724 +1009 1009 27638.14528249918 +1010 1009 2294.777189363835 +1013 1009 395.4827350039509 +1014 1009 4835.866003263356 +1015 1009 395.4746263040187 +1004 1010 346.1648787700245 +1005 1010 4173.810902971099 +1006 1010 349.5990278367666 +1009 1010 2309.474779976255 +1010 1010 27310.02821195941 +1011 1010 2322.985804377221 +1014 1010 397.888387309151 +1015 1010 4780.069888669053 +1016 1010 401.4911889686198 +187 1011 379.2974890987807 +188 1011 2506.073618055651 +189 1011 435.1173069901264 +1005 1011 355.6473595983092 +1006 1011 4066.204325655022 +1010 1011 2365.857389468566 +1011 1011 26572.5145183986 +1015 1011 408.5540509940828 +1016 1011 4655.422530756505 +1428 1011 -365.2686955010317 +1429 1011 -2332.533931241584 +1430 1011 -416.485583527547 +217 1012 434.969923215124 +218 1012 2832.103807040766 +219 1012 490.5525625342586 +1007 1012 4652.636398210343 +1008 1012 408.4028303702283 +1012 1012 30038.53331561456 +1013 1012 2673.085996140106 +1017 1012 5240.101420636222 +1018 1012 461.0358263408965 +1197 1012 -416.2698314475651 +1198 1012 -2640.071069384844 +1199 1012 -467.5071419604914 +1007 1013 401.3393398308463 +1008 1013 4777.355821217639 +1009 1013 397.7113958407037 +1012 1013 2624.562048395835 +1013 1013 30873.70550313522 +1014 1013 2608.947893995955 +1017 1013 452.9697649537864 +1018 1013 5381.732505337543 +1019 1013 449.1444392539065 +1008 1014 395.2798305197634 +1009 1014 4833.452476427844 +1010 1014 395.2716937339214 +1013 1014 2592.193840529447 +1014 1014 31247.11939841549 +1015 1014 2592.155540690036 +1018 1014 446.3658894067331 +1019 1014 5445.361629507375 +1020 1014 446.3572102529499 +1009 1015 397.680545209411 +1010 1015 4777.731158749712 +1011 1015 401.2971262561433 +1014 1015 2608.756696438673 +1015 1015 30876.20588040879 +1016 1015 2624.320089781123 +1019 1015 449.1099286172848 +1020 1015 5382.158470191845 +1021 1015 452.9232301446416 +188 1016 434.9171761846242 +189 1016 2831.799912502411 +190 1016 490.4943702200164 +1010 1016 408.346131287089 +1011 1016 4653.260440839539 +1015 1016 2672.746887904348 +1016 1016 30042.68601739793 +1020 1016 460.972835529893 +1021 1016 5240.809413943083 +1429 1016 -416.2906555884314 +1430 1016 -2640.19363427809 +1431 1016 -467.5305080152734 +218 1017 490.3742241706835 +219 1017 3210.203991088581 +220 1017 563.3350429182801 +1012 1017 5238.17509268309 +1013 1017 460.8504903565125 +1017 1017 34063.5967772716 +1018 1017 3029.403858843159 +1022 1017 6010.209321391038 +1023 1017 529.8714080277309 +1198 1017 -467.3334782051706 +1199 1017 -2996.574600057886 +1200 1017 -534.839087810029 +1012 1018 452.7968150746039 +1013 1018 5379.648251341697 +1014 1018 448.9591415481885 +1017 1018 2974.417548604314 +1018 1018 35010.39698979296 +1019 1018 2956.450377879368 +1022 1018 520.5203574684718 +1023 1018 6173.690924711194 +1024 1018 516.3810500422862 +1013 1019 446.1850077925834 +1014 1019 5443.210121145038 +1015 1019 446.1763035517108 +1018 1019 2937.465796382962 +1019 1019 35433.79731934147 +1020 1019 2937.421932635649 +1023 1019 513.1581918117427 +1024 1019 6247.066430926281 +1025 1019 513.1486945775115 +1014 1020 448.9246396376445 +1015 1020 5380.073709494072 +1016 1020 452.7502475041398 +1019 1020 2956.233157322039 +1020 1020 35013.23273265523 +1021 1020 2974.142092706593 +1024 1020 516.3417053748259 +1025 1020 6174.182279795192 +1026 1020 520.4679495545001 +189 1021 490.315991725256 +190 1021 3209.858109919934 +191 1021 563.2694588589555 +1015 1021 460.7874858017142 +1016 1021 5238.882275900261 +1020 1021 3029.018267862152 +1021 1021 34068.30628233653 +1025 1021 529.7999999724204 +1026 1021 6011.025820735743 +1430 1021 -467.3567567253234 +1431 1021 -2996.715334164182 +1432 1021 -534.8656680440145 +13 1022 636.4016495245603 +137 1022 -596.8408003173537 +158 1022 6763.025501242621 +159 1022 600.0602080228822 +219 1022 563.1782054489465 +220 1022 3626.990701030818 +596 1022 -535.9378677829752 +1017 1022 6008.515203831059 +1018 1022 529.708396657282 +1022 1022 38498.95079252933 +1023 1022 3422.226598640907 +1199 1022 -534.6863544000596 +1200 1022 -3389.133308238956 +158 1023 589.231422561595 +159 1023 6950.126671460465 +160 1023 585.393986215405 +1017 1023 520.3682500876774 +1018 1023 6171.85779564901 +1019 1023 516.2180664905344 +1022 1023 3360.120529522449 +1023 1023 39568.72587636018 +1024 1023 3339.579412736589 +159 1024 581.6566893238319 +160 1024 7033.872065043067 +161 1024 581.6474976215131 +1018 1024 512.9990963556509 +1019 1024 6245.174099964559 +1020 1024 512.9895770217915 +1023 1024 3318.137404090469 +1024 1024 40047.18779610407 +1025 1024 3318.087437439501 +160 1025 585.3505526071054 +161 1025 6950.687655984853 +162 1025 589.1756630570906 +1019 1025 516.1787294914463 +1020 1025 6172.348704675762 +1021 1025 520.3158133013802 +1024 1025 3339.333555798055 +1025 1025 39571.93093534157 +1026 1025 3359.80824396451 +16 1026 636.3317006173822 +150 1026 -596.869452146511 +161 1026 599.9826880122588 +162 1026 6763.957243349174 +190 1026 563.1125860259378 +191 1026 3626.598648552815 +591 1026 -536.0233108534392 +1020 1026 529.6369764665884 +1021 1026 6009.330990104083 +1025 1026 3421.789873013438 +1026 1026 38504.27350565902 +1431 1026 -534.7128575571284 +1432 1026 -3389.293839391845 +5 1027 -2616.146947092133 +65 1027 -15649.98907622642 +66 1027 -2616.051872311167 +94 1027 -769.1317394721169 +250 1027 5380.025111087837 +251 1027 -2774.423213999755 +604 1027 -4593.830339289781 +612 1027 -769.1037481609277 +1027 1027 32607.31799423534 +1028 1027 5379.830390794277 +1032 1027 -16578.65952178523 +1033 1027 -2774.322277158286 +1375 1027 1540.706084253111 +1376 1027 -817.280194689801 +65 1028 -2616.077539948331 +66 1028 -15649.41570760382 +67 1028 -2615.93844171827 +604 1028 -769.1126034190256 +612 1028 -4593.664777624179 +620 1028 -769.0704453162194 +1027 1028 5379.882509734297 +1028 1028 32606.13850231955 +1029 1028 5379.598804801954 +1032 1028 -2774.349583115904 +1033 1028 -16578.05087152726 +1034 1028 -2774.201775448432 +66 1029 -2615.971549863626 +67 1029 -15648.71583086873 +68 1029 -2615.819945222006 +612 1029 -769.0819698386466 +620 1029 -4593.454499786691 +628 1029 -769.033977227498 +1028 1029 5379.66602969313 +1029 1029 32604.69998033837 +1030 1029 5379.357322837499 +1033 1029 -2774.236995289864 +1034 1029 -16577.30782368629 +1035 1029 -2774.075912629673 +67 1030 -2615.85128656014 +68 1030 -15648.31143848499 +69 1030 -2615.811042753249 +620 1030 -769.0449925257199 +628 1030 -4593.319547643032 +636 1030 -769.0279947519282 +1029 1030 5379.420931697625 +1030 1030 32603.87350040364 +1031 1030 5379.345003120627 +1034 1030 -2774.109230702778 +1035 1030 -16576.87820911895 +1036 1030 -2774.066162652438 +7 1031 -2615.775756616424 +68 1031 -2615.834250053862 +69 1031 -15648.13761169858 +86 1031 -769.0172866966742 +221 1031 5379.274164982908 +222 1031 -2774.028605004738 +628 1031 -769.0361692385412 +636 1031 -4593.254968811315 +1030 1031 5379.392087880033 +1031 1031 32603.52167416599 +1035 1031 -2774.090821387736 +1036 1031 -16576.69332611198 +250 1032 -2774.239575651253 +251 1032 5854.742270123459 +252 1032 -3095.395057915011 +1027 1032 -16585.25415324165 +1028 1032 -2774.138661282987 +1032 1032 35593.23987801734 +1033 1032 5854.530373496567 +1037 1032 -18473.20151181761 +1038 1032 -3095.282252222992 +1375 1032 -816.4849120772186 +1376 1032 1665.774440992046 +1377 1032 -913.8263980628039 +1027 1033 -2774.165952450645 +1028 1033 -16584.64554544158 +1029 1033 -2774.018200480588 +1032 1033 5854.587071615128 +1033 1033 35591.95458540893 +1034 1033 5854.278426311274 +1037 1033 -3095.312864529129 +1038 1033 -18472.52128542431 +1039 1033 -3095.147451408029 +1028 1034 -2774.053401224716 +1029 1034 -16583.90257222314 +1030 1034 -2773.892387849991 +1033 1034 5854.351552577434 +1034 1034 35590.3871953334 +1035 1034 5854.015932967373 +1038 1034 -3095.186932812588 +1039 1034 -18471.69068684961 +1040 1034 -3095.006705719702 +1029 1035 -2773.925687683338 +1030 1035 -16583.47308732793 +1031 1035 -2773.882748204046 +1034 1035 5854.085055723908 +1035 1035 35589.48767388707 +1036 1035 5854.003926715207 +1039 1035 -3095.044011327048 +1040 1035 -18471.2100448787 +1041 1035 -3094.995394786632 +221 1036 -2773.845225485246 +222 1036 5853.927116470389 +223 1036 -3094.953274741471 +1030 1036 -2773.907393348057 +1031 1036 -16583.28832337047 +1035 1036 5854.05505443432 +1036 1036 35589.10545420564 +1040 1036 -3095.022980476163 +1041 1036 -18471.00288224629 +251 1037 -3095.122806427626 +252 1037 6596.029695053643 +253 1037 -3522.432244424721 +1032 1037 -18482.97851809993 +1033 1037 -3095.010034041827 +1037 1037 40248.67213051283 +1038 1037 6595.790921447282 +1042 1037 -20992.71047351186 +1043 1037 -3522.303608133968 +1376 1037 -912.6478647236902 +1377 1037 1861.700148582485 +1378 1037 -1042.310502349323 +1032 1038 -3095.040624492284 +1033 1038 -18482.29835347612 +1034 1038 -3094.875293909859 +1037 1038 6595.854813901429 +1038 1038 40247.22127855162 +1039 1038 6595.507076313685 +1042 1038 -3522.338649118334 +1043 1038 -20991.93472071798 +1044 1038 -3522.149710830596 +1033 1039 -3094.914747087474 +1034 1039 -18481.4678639774 +1035 1039 -3094.734622688511 +1038 1039 6595.589473306109 +1039 1039 40245.45218015255 +1040 1039 6595.211679805992 +1043 1039 -3522.194899614081 +1044 1039 -20990.98724757157 +1045 1039 -3521.989107275656 +1034 1040 -3094.77190129659 +1035 1040 -18480.98741318131 +1036 1040 -3094.723475363598 +1039 1040 6595.289452183237 +1040 1040 40244.43820210869 +1041 1040 6595.200033120234 +1044 1040 -3522.031742200851 +1045 1040 -20990.43843998402 +1046 1040 -3521.975678125311 +222 1041 -3094.681407102999 +223 1041 6595.113833355459 +224 1041 -3521.92745246571 +1035 1041 -3094.751040914388 +1036 1041 -18480.78042641811 +1040 1041 6595.257496107038 +1041 1041 40244.00825208933 +1045 1041 -3522.007169501356 +1046 1041 -20990.20147493386 +252 1042 -3522.048412968626 +253 1042 7433.776698259517 +254 1042 -3942.826295438235 +1037 1042 -21006.49486013388 +1038 1042 -3521.919823614171 +1042 1042 45573.78135607241 +1043 1042 7433.507531902056 +1047 1042 -23450.52993072153 +1048 1042 -3942.6819124535 +1377 1042 -1040.64986623666 +1378 1042 2076.707577680008 +1379 1042 -1170.746745017161 +1037 1043 -3521.954833913381 +1038 1043 -21005.71919230787 +1039 1043 -3521.766011929081 +1042 1043 7433.579561397362 +1043 1043 45572.14218089384 +1044 1043 7433.187644265277 +1047 1043 -3942.721438011289 +1048 1043 -23449.65920405462 +1049 1043 -3942.508909966307 +1038 1044 -3521.811161071136 +1039 1044 -21004.77187014202 +1040 1044 -3521.605513470601 +1043 1044 7433.280523185055 +1044 1044 45570.14371816898 +1045 1044 7432.855210392889 +1048 1044 -3942.559875891287 +1049 1044 -23448.59538784766 +1050 1044 -3942.328477007252 +1039 1045 -3521.64811040658 +1040 1045 -21004.22333015553 +1041 1045 -3521.592315049443 +1044 1045 7432.942713597884 +1045 1045 45569.00013909617 +1046 1045 7432.844779407864 +1049 1045 -3942.37647311351 +1050 1045 -23447.97836289085 +1051 1045 -3942.312561434078 +223 1046 -3521.544162399762 +224 1046 7432.748114456705 +225 1046 -3942.258134158515 +1040 1046 -3521.623778052674 +1041 1046 -21003.9866119252 +1045 1046 7432.90934234325 +1046 1046 45568.51652736505 +1050 1046 -3942.3479632393 +1051 1046 -23447.71129344066 +253 1047 -3942.260815051097 +254 1047 8362.84649965978 +255 1047 -4465.519679190735 +1042 1047 -23470.83850459116 +1043 1047 -3942.116501177569 +1047 1047 51581.46602422366 +1048 1047 8362.543604244222 +1052 1047 -26496.97817116857 +1053 1047 -4465.355600058654 +1378 1047 -1168.301909610495 +1379 1047 2304.927274980947 +1380 1047 -1331.161667408629 +1042 1048 -3942.155981768173 +1043 1048 -23469.96789913284 +1044 1048 -3941.943624949532 +1047 1048 8362.624664605797 +1048 1048 51579.61607889874 +1049 1048 8362.183767084371 +1052 1048 -4465.400790344791 +1053 1048 -26495.98858154595 +1054 1048 -4465.158625306573 +1043 1049 -3941.994532761598 +1044 1049 -23468.90430010904 +1045 1049 -3941.763347030216 +1048 1049 8362.288273646929 +1049 1049 51577.36103987349 +1050 1049 8361.810503470517 +1053 1049 -4465.21688680435 +1054 1049 -26494.77906632332 +1055 1049 -4464.953351962342 +1044 1050 -3941.811287310277 +1045 1050 -23468.28766578645 +1046 1050 -3941.747771506543 +1049 1050 8361.90872437403 +1050 1050 51576.07335908801 +1051 1050 8361.802718878376 +1054 1050 -4465.008090668167 +1055 1050 -26494.07641720305 +1056 1050 -4464.93414172954 +224 1051 -3941.693451796689 +225 1051 8361.694686750108 +226 1051 -4464.87188251164 +1045 1051 -3941.783131548237 +1046 1051 -23468.02095784957 +1050 1051 8361.875058844566 +1051 1051 51575.53069752918 +1055 1051 -4464.974445983476 +1056 1051 -26493.77140774754 +254 1052 -4464.722306883999 +255 1052 9409.775746050327 +256 1052 -5009.835675174185 +1047 1052 -26525.61620661887 +1048 1052 -4464.558325136599 +1052 1052 58482.61057848743 +1053 1052 9409.434803353684 +1057 1052 -29630.5053682064 +1058 1052 -5009.650791402298 +1379 1052 -1327.71729464616 +1380 1052 2548.949636487528 +1381 1052 -1501.556919553988 +1047 1053 -4464.603452445754 +1048 1053 -26524.62678078262 +1049 1053 -4464.361528639191 +1052 1053 9409.526058926022 +1053 1053 58480.52053318141 +1054 1053 9409.029962228258 +1057 1053 -5009.70210494807 +1058 1053 -29629.39030377904 +1059 1053 -5009.428299451122 +1048 1054 -4464.419708711613 +1049 1054 -26523.41756238302 +1050 1054 -4464.156474284028 +1053 1054 9409.14758782947 +1054 1054 58477.97336346588 +1055 1054 9408.610994912178 +1058 1054 -5009.494443175394 +1059 1054 -29628.02673240538 +1060 1054 -5009.196653884132 +1049 1055 -4464.211134524357 +1050 1055 -26522.71545760997 +1051 1055 -4464.137743777799 +1054 1055 9408.721205259571 +1055 1055 58476.52270951739 +1056 1055 9408.607857873758 +1059 1055 -5009.258619455332 +1060 1055 -29627.23292315982 +1061 1055 -5009.173308581656 +225 1056 -4464.075636243126 +226 1056 9408.487316311017 +227 1056 -5009.102552152454 +1050 1056 -4464.177989207778 +1051 1056 -26522.41095412259 +1055 1056 9408.688839682945 +1056 1056 58475.91403769788 +1060 1056 -5009.218834635362 +1061 1056 -29626.8870414317 +255 1057 -5008.670277465568 +256 1057 10555.48292104269 +257 1057 -5640.274748632417 +1052 1057 -29672.36386347844 +1053 1057 -5008.485535901209 +1057 1057 66255.00439783218 +1058 1057 10555.10031595274 +1062 1057 -33226.0737772944 +1063 1057 -5640.065460529842 +1380 1057 -1496.528409506419 +1381 1057 2794.060210573805 +1382 1057 -1701.699862059458 +1052 1058 -5008.536758200335 +1053 1058 -29671.24902522458 +1054 1058 -5008.263304885096 +1057 1058 10555.20273238449 +1058 1058 66252.64753123395 +1059 1058 10554.64632328911 +1062 1058 -5640.124098793306 +1063 1058 -33224.81151751605 +1064 1058 -5639.812836843907 +1053 1059 -5008.329330562849 +1054 1059 -29669.88587021146 +1055 1059 -5008.031980069417 +1058 1059 10554.77829806752 +1059 1059 66249.77599125374 +1060 1059 10554.17791115674 +1063 1059 -5639.888405247217 +1064 1059 -33223.26697460633 +1065 1059 -5639.550134839958 +1054 1060 -5008.093831429799 +1055 1060 -29669.09284455362 +1056 1060 -5008.009336338817 +1059 1060 10554.30107266961 +1060 1060 66248.14623866709 +1061 1060 10554.1826815764 +1064 1060 -5639.620678984274 +1065 1060 -33222.36550348915 +1066 1060 -5639.521351954661 +226 1061 -5007.938801615751 +227 1061 10554.0489868554 +228 1061 -5639.44041368408 +1055 1061 -5008.054776540549 +1056 1061 -29668.74769529362 +1060 1061 10554.27290617618 +1061 1061 66247.46635029452 +1065 1061 -5639.57304084351 +1066 1061 -33221.97090790205 +256 1062 -5638.634521526667 +257 1062 11838.11430094548 +258 1062 -6333.760492533333 +1057 1062 -33284.99218013514 +1058 1062 -5638.425433351096 +1062 1062 75225.89813038691 +1063 1062 11837.68497871745 +1067 1062 -37118.17452923109 +1068 1062 -6333.523854742965 +1381 1062 -1694.63246936585 +1382 1062 3041.602160270625 +1383 1062 -1927.186754307778 +1057 1063 -5638.483944611358 +1058 1063 -33283.73021513171 +1059 1063 -5638.173177644295 +1062 1063 11837.79993750124 +1063 1063 75223.23704769718 +1064 1063 11837.17600942546 +1067 1063 -6333.590931115143 +1068 1063 -37116.74744479507 +1069 1063 -6333.237133905886 +1058 1064 -5638.248581616258 +1059 1064 -33282.18622709322 +1060 1064 -5637.910928308854 +1063 1064 11837.32409261967 +1064 1064 75219.99595485489 +1065 1064 11836.6528938359 +1068 1064 -6333.323553524897 +1069 1064 -37114.99984532864 +1070 1064 -6332.939408669379 +1059 1065 -5637.981312546292 +1060 1065 -33281.28583743595 +1061 1065 -5637.88313361429 +1064 1065 11836.79037832049 +1065 1065 75218.16431491094 +1066 1065 11836.66994829479 +1069 1065 -6333.019736573942 +1070 1065 -37113.97657455334 +1071 1065 -6332.903481619847 +227 1066 -5637.802507408342 +228 1066 11836.52215028541 +229 1066 -6332.810765918055 +1060 1066 -5637.934701888945 +1061 1066 -33280.8922602284 +1065 1066 11836.77027067447 +1066 1066 75217.40568563555 +1070 1066 -6332.962145510019 +1071 1066 -37113.52610997501 +257 1067 -6331.388556218088 +258 1067 13215.0911609239 +259 1067 -7076.818341551526 +1062 1067 -37203.3867385993 +1063 1067 -6331.152207141327 +1067 1067 85330.65953216655 +1068 1067 13214.61169457219 +1072 1067 -41191.03463494323 +1073 1067 -7076.55165207224 +1382 1067 -1916.984537814109 +1383 1067 3260.460029350693 +1384 1067 -2177.070394290181 +1062 1068 -6331.219102442069 +1063 1068 -37201.9600375219 +1064 1068 -6330.866019773238 +1067 1068 13214.74010322828 +1068 1068 85327.66318067606 +1069 1068 13214.04405439134 +1072 1068 -7076.628330622704 +1073 1068 -41189.4267641838 +1074 1068 -7076.226982479654 +1063 1069 -6330.952204726022 +1064 1069 -37200.21318373045 +1065 1069 -6330.568951390685 +1068 1069 13214.20938372909 +1069 1069 85324.01538344131 +1070 1069 13213.46355802597 +1073 1069 -7076.325742211717 +1074 1069 -41187.45584566354 +1075 1069 -7075.890441309817 +1064 1070 -6330.649049579401 +1065 1070 -37199.19143788968 +1066 1070 -6330.534454784972 +1069 1070 13213.61603074801 +1070 1070 85321.96545284073 +1071 1070 13213.49993665225 +1074 1070 -7075.981768023333 +1075 1070 -41186.29713848801 +1076 1070 -7075.845082897812 +228 1071 -6330.44219041338 +229 1071 13213.33821008788 +230 1071 -7075.738882517746 +1065 1071 -6330.592944649883 +1066 1071 -37198.74242318382 +1070 1071 13213.61062430965 +1071 1071 85321.12451075396 +1075 1071 -7075.911513986744 +1076 1071 -41185.78343889305 +258 1072 -7073.496941416896 +259 1072 14736.8342423571 +260 1072 -7939.295798073947 +1067 1072 -41310.3763565495 +1068 1072 -7073.230655519282 +1072 1072 97051.46900190806 +1073 1072 14736.29924316716 +1077 1072 -45828.51365750824 +1078 1072 -7938.993433848261 +1383 1072 -2162.815621679074 +1384 1072 3447.605455040543 +1385 1072 -2474.491259378801 +1067 1073 -7073.307085070721 +1068 1073 -41308.76894705449 +1069 1073 -7072.906735297734 +1072 1073 14736.44262628981 +1073 1073 97048.09041596827 +1074 1073 14735.66697101113 +1077 1073 -7939.081843748524 +1078 1073 -45826.69142031462 +1079 1073 -7938.623215593021 +1068 1074 -7073.005171915175 +1069 1074 -41306.79897284597 +1070 1074 -7072.571117888402 +1073 1074 14735.8514641226 +1074 1074 97043.97943226606 +1075 1074 14735.02449966805 +1078 1074 -7938.737043671795 +1079 1074 -45824.45511728087 +1080 1074 -7938.240277742413 +1069 1075 -7072.662125616555 +1070 1075 -41305.64233246054 +1071 1075 -7072.527765043516 +1074 1075 14735.19317604334 +1075 1075 97041.68503473372 +1076 1075 14735.08933633795 +1079 1075 -7938.344902252178 +1080 1075 -45823.13407458808 +1081 1075 -7938.182254312406 +229 1076 -7072.422196759293 +230 1076 14734.91353217869 +231 1076 -7938.059515976939 +1070 1076 -7072.593953140587 +1071 1076 -41305.13062299159 +1075 1076 14735.21096172113 +1076 1076 97040.75491739677 +1080 1076 -7938.257997943961 +1081 1076 -45822.54354638379 +259 1077 -7934.562855012948 +260 1077 16323.05167328201 +261 1077 -8783.163478563938 +1072 1077 -45998.61344972541 +1073 1077 -7934.261064648928 +1077 1077 110289.1908907976 +1078 1077 16322.45897620249 +1082 1077 -50111.99578476548 +1083 1077 -8782.824503642834 +1384 1077 -2454.233382958883 +1385 1077 3542.749365964606 +1386 1077 -2787.378963517098 +1072 1078 -7934.349127821658 +1073 1078 -45996.79173547315 +1074 1078 -7933.891918457569 +1077 1078 16322.61788889548 +1078 1078 110285.3951865499 +1079 1078 16321.76045877488 +1082 1078 -8782.92565583652 +1083 1078 -50109.95513959011 +1084 1078 -8782.406452631165 +1073 1079 -7934.005295852655 +1074 1079 -45994.55660052075 +1075 1079 -7933.510304051531 +1078 1079 16321.96476191159 +1079 1079 110280.7798935995 +1080 1079 16321.0566078773 +1083 1079 -8782.536634429242 +1084 1079 -50107.44711446143 +1085 1079 -8781.975066271563 +1074 1080 -7933.614478778945 +1075 1080 -45993.23838112524 +1076 1080 -7933.455143094367 +1079 1080 16321.24128525299 +1080 1080 110278.2272710953 +1081 1080 16321.16448736382 +1084 1080 -8782.093894718557 +1085 1080 -50105.9563599032 +1086 1080 -8781.900176661926 +230 1081 -7933.333305688488 +231 1081 16320.97676932334 +232 1081 -8781.759198713939 +1075 1081 -7933.530541697009 +1076 1081 -45992.65061755592 +1080 1081 16321.29645717283 +1081 1081 110277.2089052571 +1085 1081 -8781.985731359186 +1086 1081 -50105.28297563796 +260 1082 -8776.602061938924 +261 1082 18034.36646962722 +262 1082 -9817.121161187111 +1077 1082 -50347.88783823171 +1078 1082 -8776.263880473942 +1082 1082 125713.2734936435 +1083 1082 18033.71144253738 +1087 1082 -55267.43770702033 +1088 1082 -9816.736292191588 +1385 1082 -2759.388007132825 +1386 1082 3533.882066892535 +1387 1082 -3177.698064180283 +1077 1083 -8776.364565912512 +1078 1083 -50345.84768665651 +1079 1083 -8775.84732302008 +1082 1083 18033.88734189506 +1083 1083 125709.0027437269 +1084 1083 18032.94228077704 +1087 1083 -9816.853787515343 +1088 1083 -55265.12368658638 +1089 1083 -9816.25765888312 +1078 1084 -8775.976896797225 +1079 1084 -50343.34097516324 +1080 1084 -8775.417783686769 +1083 1084 18033.16816935721 +1084 1084 125703.8139017281 +1085 1084 18032.17554346791 +1088 1084 -9816.408808084658 +1089 1084 -55262.27493219386 +1090 1084 -9815.765183890744 +1079 1085 -8775.535996784522 +1080 1085 -50341.85392496602 +1081 1085 -8775.346870431234 +1084 1085 18032.37671744546 +1085 1085 125700.975209625 +1086 1085 18032.3447084314 +1089 1085 -9815.902070427401 +1090 1085 -55260.56999201402 +1091 1085 -9815.667678460812 +231 1086 -8775.207141861427 +232 1086 18032.1470018486 +233 1086 -9815.503251630542 +1080 1086 -8775.43194891655 +1081 1086 -50341.18425084106 +1085 1086 18032.48674575385 +1086 1086 125699.864808597 +1090 1086 -9815.765613218535 +1091 1086 -55259.79103966293 +261 1087 -9807.963528498451 +262 1087 19734.03739660576 +263 1087 -10718.92832250827 +1082 1087 -55596.82066037557 +1083 1087 -9807.579763348132 +1087 1087 143235.9228746678 +1088 1087 19733.32129949879 +1092 1087 -59145.13137377884 +1093 1087 -10718.49974797653 +1386 1087 -3138.788299005369 +1387 1087 3312.097310472673 +1388 1087 -3571.89558524823 +1082 1088 -9807.696631100176 +1083 1088 -55594.50693179852 +1084 1088 -9807.103227246585 +1087 1088 19733.51381172592 +1088 1088 143231.1393369702 +1089 1088 19732.48538996608 +1092 1088 -10718.63415968428 +1093 1088 -59142.56265935833 +1094 1088 -10717.96112489765 +1083 1089 -9807.253556603004 +1084 1089 -55591.65948628724 +1085 1089 -9806.613351355181 +1088 1089 19732.73223487624 +1089 1089 143225.3335548213 +1090 1089 19731.66402033566 +1093 1089 -10718.13396237158 +1094 1089 -59139.39369892726 +1095 1089 -10717.40850881396 +1084 1090 -9806.749393104419 +1085 1090 -55589.95935677952 +1086 1090 -9806.521409732853 +1089 1090 19731.87954078817 +1090 1090 143222.2027262501 +1091 1090 19731.923406949 +1094 1090 -10717.56373844821 +1095 1090 -59137.47974942141 +1096 1090 -10717.28066446889 +232 1091 -9806.358727399629 +233 1091 19731.72213354384 +234 1091 -10717.09115657452 +1085 1091 -9806.618683459379 +1086 1091 -55589.18537263836 +1090 1091 19732.07307945869 +1091 1091 143221.0105800539 +1095 1091 -10717.39096748509 +1096 1091 -59136.59242046073 +262 1092 -10706.44956822579 +263 1092 21487.79859634012 +264 1092 -11891.43309435763 +1087 1092 -59594.26403733071 +1088 1092 -10706.02249202634 +1092 1092 163710.1265853388 +1093 1092 21487.01984542876 +1097 1092 -64209.06655344724 +1098 1092 -11890.94696094559 +1387 1092 -3519.128666154573 +1388 1092 2853.4523146614 +1389 1092 -4079.899006495182 +1087 1093 -10706.15608819494 +1088 1093 -59591.69506057434 +1089 1093 -10705.48674802004 +1092 1093 21487.22992777914 +1093 1093 163704.7598924203 +1094 1093 21486.11805440421 +1097 1093 -11891.10378317858 +1098 1093 -64206.16269694293 +1099 1093 -11890.32891467851 +1088 1094 -10705.6585160671 +1089 1094 -59588.52701194026 +1090 1094 -10704.93770922751 +1093 1094 21486.3868742011 +1094 1094 163698.2536104934 +1095 1094 21485.24843269601 +1098 1094 -11890.53048272119 +1099 1094 -64202.57228977755 +1100 1094 -11889.6970090787 +1089 1095 -10705.09181099842 +1090 1095 -59586.61902100037 +1091 1095 -10704.81747054389 +1094 1095 21485.47703342435 +1095 1095 163694.8040865822 +1096 1095 21485.63262860485 +1099 1095 -11889.87642344821 +1100 1095 -64200.38343387342 +1101 1095 -11889.52940800942 +233 1096 -10704.63034126167 +234 1096 21485.43417097444 +235 1096 -11889.30671910418 +1090 1096 -10704.92687876435 +1091 1096 -59585.73811373586 +1095 1096 21485.78779550506 +1096 1096 163693.5331816595 +1100 1096 -11889.65594481823 +1101 1096 -64199.35365778141 +263 1097 -11874.51973330556 +264 1097 23101.96055497924 +265 1097 -12780.67221292269 +1092 1097 -64818.36917204612 +1093 1097 -11874.03562134674 +1097 1097 187307.4449839013 +1098 1097 23101.12687228114 +1102 1097 -66627.91226804358 +1103 1097 -12780.13499552404 +1388 1097 -4008.781442014089 +1389 1097 1979.189338773902 +1390 1097 -4589.143939866713 +1092 1098 -11874.19140273157 +1093 1098 -64815.4638839433 +1094 1098 -11873.42151239301 +1097 1098 23101.35252999646 +1098 1098 187301.4492976887 +1099 1098 23100.17408067105 +1102 1098 -12780.31398148181 +1103 1098 -66624.7282425202 +1104 1098 -12779.441951659 +1093 1099 -11873.62170868689 +1094 1099 -64811.87329177652 +1095 1099 -11872.79451391452 +1098 1099 23100.4619952469 +1099 1099 187294.1910198804 +1100 1099 23099.27899242891 +1103 1099 -12779.6719374198 +1104 1099 -66620.78020977083 +1105 1099 -12778.73530713262 +1094 1100 -11872.97243749657 +1095 1100 -64809.69154055264 +1096 1100 -11872.63726186004 +1099 1100 23099.51506814454 +1100 1100 187290.4271163386 +1101 1100 23099.84247529656 +1104 1100 -12778.93831853786 +1105 1100 -66618.34196293802 +1106 1100 -12778.51374403637 +234 1101 -11872.41779957215 +235 1101 23099.66118789929 +236 1101 -12778.25606726918 +1095 1101 -11872.76259555322 +1096 1101 -64808.66990188032 +1100 1101 23099.99744492707 +1101 1101 187289.1021257963 +1105 1101 -12778.6559078587 +1106 1101 -66617.17241214727 +264 1102 -12757.83563825866 +265 1102 24570.42522192054 +266 1102 -13958.23298769577 +1097 1102 -67451.65834805371 +1098 1102 -12757.30113541924 +1102 1102 214789.017499111 +1103 1102 24569.54471486899 +1107 1102 -70127.01298732599 +1108 1102 -13957.62853854158 +1389 1102 -4493.745160591868 +1390 1102 616.8287709643987 +1391 1102 -5233.018100654615 +1097 1103 -12757.4788202243 +1098 1103 -67448.47064847524 +1099 1103 -12756.61346523236 +1102 1103 24569.78470235772 +1103 1103 214782.3186372964 +1104 1103 24568.55777011968 +1107 1103 -13957.83628433746 +1108 1103 -70123.46052783515 +1109 1103 -13956.83689102873 +1098 1104 -12756.84172439832 +1099 1104 -67444.52006768242 +1100 1104 -12755.91354206461 +1103 1104 24568.86273600817 +1104 1104 214774.2217537237 +1105 1104 24567.66388987208 +1108 1104 -13957.10376361665 +1109 1104 -70119.04321413842 +1110 1104 -13956.03233972826 +1099 1105 -12756.11460173132 +1100 1105 -67442.08984470798 +1101 1105 -12755.7060202586 +1104 1105 24567.90156333687 +1105 1105 214770.1323340976 +1106 1105 24568.47224133625 +1109 1105 -13956.26595985033 +1110 1105 -70116.28092726412 +1111 1105 -13955.74324304668 +235 1106 -12755.45270512315 +236 1106 24568.32487126809 +237 1106 -13955.44028700997 +1100 1106 -12755.84657515123 +1101 1106 -67440.93036749522 +1105 1106 24568.62055804046 +1106 1106 214768.7739194956 +1110 1106 -13955.90565860783 +1111 1106 -70114.93180150195 +265 1107 -13929.28336542066 +266 1107 25757.57764737017 +267 1107 -14761.72286301806 +1102 1107 -71173.08784535406 +1103 1107 -13928.68233611853 +1107 1107 246688.7105136226 +1108 1107 25756.66636232743 +1112 1107 -69878.22021031221 +1113 1107 -14761.06047061187 +1390 1107 -5112.959528129044 +1391 1107 -1389.283546957946 +1392 1107 -5901.660958958104 +1102 1108 -13928.88858549272 +1103 1108 -71169.52816679672 +1104 1108 -13927.89758637722 +1107 1108 25756.9172704687 +1108 1108 246681.2384530572 +1109 1108 25755.67565403171 +1112 1108 -14761.29564773343 +1113 1108 -69874.39033414872 +1114 1108 -14760.17680728845 +1103 1109 -13928.16245456159 +1104 1109 -71165.10424305045 +1105 1109 -13927.10169802848 +1108 1109 25755.99269102814 +1109 1109 246672.2227327013 +1110 1109 25754.82542543285 +1113 1109 -14760.47893232719 +1114 1109 -69869.61148573417 +1115 1109 -14759.28009281166 +1104 1110 -13927.33293362791 +1105 1110 -71162.34982456625 +1106 1110 -13926.83050536301 +1109 1110 25755.05517538085 +1110 1110 246667.811628211 +1111 1110 25755.96516765784 +1114 1110 -14759.54305861413 +1115 1110 -69866.5720350552 +1116 1110 -14758.90160096811 +236 1111 -13926.53308693948 +237 1111 25755.87642482305 +238 1111 -14758.55087128767 +1105 1111 -13926.99090396607 +1106 1111 -71161.01212960179 +1110 1111 25756.09723794517 +1111 1111 246666.4541238284 +1115 1111 -14759.08346429314 +1116 1111 -69865.0527649381 +266 1112 -14723.90496672797 +267 1112 26496.21731603779 +268 1112 -15733.82051248568 +1107 1112 -71247.91692152849 +1108 1112 -14723.24701053359 +1112 1112 283641.5525467644 +1113 1112 26495.30037841746 +1117 1112 -69596.34033059554 +1118 1112 -15733.08776521906 +1391 1112 -5746.063674935193 +1392 1112 -4227.722320284134 +1393 1112 -6703.202856219405 +1107 1113 -14723.48046107928 +1108 1113 -71244.07378676717 +1109 1113 -14722.37248754437 +1112 1113 26495.55698024217 +1113 1113 283633.2317042513 +1114 1113 26494.35198434068 +1117 1113 -15733.35561446572 +1118 1113 -69592.1845420668 +1119 1113 -15732.09170458931 +1108 1114 -14722.67226917456 +1109 1114 -71239.28125444271 +1110 1114 -14721.48730498699 +1113 1114 26494.67354516526 +1114 1114 283623.2106632231 +1115 1114 26493.60665259573 +1118 1114 -15732.43587168238 +1119 1114 -69586.98123818191 +1120 1114 -15731.08234292947 +1109 1115 -14721.74728937735 +1110 1115 -71236.24864862976 +1111 1115 -14721.13236413439 +1114 1115 26493.81508355764 +1115 1115 283618.4903089541 +1116 1115 26495.18956189373 +1119 1115 -15731.38053930826 +1120 1115 -69583.61562295169 +1121 1115 -15730.5952782466 +237 1116 -14720.78888269625 +238 1116 26495.19337807901 +239 1116 -15730.18647984348 +1110 1116 -14721.31162620564 +1111 1116 -71234.74231760917 +1115 1116 26495.29217965941 +1116 1116 283617.1791236136 +1120 1116 -15730.80061933322 +1121 1116 -69581.89608346627 +267 1117 -15687.98099467609 +268 1117 26744.03756445197 +269 1117 -16333.0827365087 +1112 1117 -71261.56048255929 +1113 1117 -15687.25358288912 +1117 1117 326697.2090776381 +1118 1117 26743.14535604814 +1122 1117 -64989.04657167237 +1123 1117 -16332.28942481283 +1392 1117 -6516.178873377017 +1393 1117 -8013.274890297796 +1394 1117 -7581.328228711684 +1112 1118 -15687.51964912854 +1113 1118 -71257.38341696421 +1114 1118 -15686.26877947369 +1117 1118 26743.40174119026 +1118 1118 326687.9353169573 +1119 1118 26742.29707792315 +1122 1118 -16332.58724711955 +1123 1118 -64984.68766020519 +1124 1118 -16331.18719468179 +1113 1119 -15686.61047937648 +1114 1119 -71252.15666343243 +1115 1119 -15685.273691781 +1118 1119 26742.61450767043 +1119 1119 326676.7874681326 +1120 1119 26741.73160703979 +1123 1119 -16331.57013644439 +1124 1119 -64979.2077663286 +1125 1119 -16330.06877615883 +1114 1120 -15685.5684554046 +1115 1120 -71248.79468763019 +1116 1120 -15684.81540449934 +1119 1120 26741.90305223282 +1120 1120 326671.7590002657 +1121 1120 26743.89079864612 +1124 1120 -16330.40054052154 +1125 1120 -64975.58386203825 +1126 1120 -16329.44339792766 +238 1121 -15684.41541352158 +239 1121 26744.0284585449 +240 1121 -16328.97283233638 +1115 1121 -15685.01763780807 +1116 1121 -71247.08813339673 +1120 1121 26743.94846236375 +1121 1121 326670.5396066853 +1125 1121 -16329.67172509027 +1126 1121 -64973.68187625907 +268 1122 -16276.53660871988 +269 1122 26281.37321677751 +270 1122 -16938.9143871598 +1117 1122 -67050.9358074574 +1118 1122 -16275.74982334532 +1122 1122 376576.1265659663 +1123 1122 26280.55005524931 +1127 1122 -58909.74075672921 +1128 1122 -16938.05570137669 +1393 1122 -7352.589557118303 +1394 1122 -12974.74828667729 +1395 1122 -8586.952010165682 +1117 1123 -16276.04586299108 +1118 1123 -67046.54363106571 +1119 1123 -16274.66172198347 +1122 1123 26280.79710091184 +1123 1123 376565.7951249309 +1124 1123 26279.88445045111 +1127 1123 -16938.38488270651 +1128 1123 -58905.20508132486 +1129 1123 -16936.83581539013 +1118 1124 -16275.04212255314 +1119 1124 -67041.02556337844 +1120 1124 -16273.56131462328 +1123 1124 26280.18464919987 +1124 1124 376553.3990242095 +1125 1124 26279.60174253549 +1128 1124 -16937.25950237776 +1129 1124 -58899.47934699713 +1130 1124 -16935.59499694395 +1119 1125 -16273.88908771295 +1120 1125 -67037.3998889729 +1121 1125 -16272.9717611771 +1124 1125 26279.71476162732 +1125 1125 376548.0790456682 +1126 1125 26282.50391638036 +1129 1125 -16935.96307692877 +1130 1125 -58895.60227736102 +1131 1125 -16934.80709179359 +239 1126 -16272.51209258649 +240 1126 26282.83029582675 +241 1126 -16934.2667187917 +1120 1126 -16273.19631509502 +1121 1126 -67035.51030231519 +1125 1126 26282.49606886684 +1126 1126 376547.0127100118 +1130 1126 -16935.06087386145 +1131 1126 -58893.51209025896 +269 1127 -16874.01638921308 +270 1127 25142.65484806028 +271 1127 -17231.19114867221 +1122 1127 -61286.92126949865 +1123 1127 -16873.16512655539 +1127 1127 434211.5577087563 +1128 1127 25141.94731787146 +1132 1127 -48441.64939418383 +1133 1127 -17230.27675397605 +1394 1127 -8326.635897917591 +1395 1127 -19145.48927256474 +1396 1127 -9722.611675773034 +1122 1128 -16873.4927716225 +1123 1128 -61282.33881764221 +1124 1128 -16871.96175470259 +1127 1128 25142.17664258316 +1128 1128 434200.0188760166 +1129 1128 25141.5550333696 +1132 1128 -17230.63247098501 +1133 1128 -48437.09112932861 +1134 1128 -17228.9451619329 +1123 1129 -16872.38313942357 +1124 1129 -61276.55794871492 +1125 1129 -16870.74210634887 +1128 1129 25141.82561763609 +1129 1129 434186.1963416953 +1130 1129 25141.66697261448 +1133 1129 -17229.40376166059 +1134 1129 -48431.308660173 +1135 1129 -17227.58297560001 +1124 1130 -16871.10590266127 +1125 1130 -61272.67120294999 +1126 1130 -16869.99573492409 +1129 1130 25141.69966308155 +1130 1130 434180.5711491298 +1131 1130 25145.49270906142 +1134 1130 -17227.9848770797 +1135 1130 -48427.27138914887 +1136 1130 -17226.59775275903 +240 1131 -16869.46791178687 +241 1131 25146.06745105615 +242 1131 -17225.98350435124 +1125 1131 -16870.2452597827 +1126 1131 -61270.59083651524 +1130 1131 25145.39789137732 +1131 1131 434179.7061591789 +1135 1131 -17226.87673478267 +1136 1131 -48425.02379784624 +270 1132 -17156.15271594033 +271 1132 23130.09671812571 +272 1132 -17400.02968306436 +1127 1132 -51204.71103265462 +1128 1132 -17155.24682409842 +1132 1132 500833.9099205845 +1133 1132 23129.56687539995 +1137 1132 -35162.09631712324 +1138 1132 -17399.06282018937 +1395 1132 -9424.015414798321 +1396 1132 -26776.58287145779 +1397 1132 -11000.55664177481 +1127 1133 -17155.60137427565 +1128 1133 -51200.08838437939 +1129 1133 -17153.93468499657 +1132 1133 23129.76617542016 +1133 1133 500821.0062267137 +1134 1133 23129.56757182345 +1137 1133 -17399.44157865015 +1138 1133 -35157.62650512828 +1139 1133 -17397.61826229727 +1128 1134 -17154.39135732565 +1129 1134 -51194.2286128818 +1130 1134 -17152.59757843472 +1133 1134 23129.79075340326 +1134 1134 500805.5711443145 +1135 1134 23130.21823765341 +1138 1134 -17398.10765516105 +1139 1134 -35151.92493330044 +1140 1134 -17396.12882059387 +1129 1135 -17152.99488179325 +1130 1135 -51190.17102788973 +1131 1135 -17151.66090101361 +1134 1135 23130.14200528824 +1135 1135 500799.641644724 +1136 1135 23135.18874557369 +1139 1135 -17396.5635882006 +1140 1135 -35147.79543279423 +1141 1135 -17394.91674273486 +241 1136 -17151.06121924488 +242 1136 23136.08780599682 +243 1136 -17394.22348038267 +1130 1136 -17151.93504774951 +1131 1136 -51187.92953980298 +1135 1136 23134.97977688244 +1136 1136 500799.0441026214 +1140 1136 -17395.22176164523 +1141 1136 -35145.41397945711 +271 1137 -17318.8193008322 +272 1137 20389.12682466523 +273 1137 -17386.24036447296 +1132 1137 -38169.88767798269 +1133 1137 -17317.86155224501 +1137 1137 576790.764979059 +1138 1137 20388.83191303384 +1142 1137 -18259.56758836891 +1143 1137 -17385.22803680849 +1396 1137 -10679.74932345096 +1397 1137 -35761.68373907827 +1398 1137 -12446.40554716357 +1132 1138 -17318.23971293081 +1133 1138 -38165.33693545096 +1134 1138 -17316.43843846104 +1137 1138 20388.99178616241 +1138 1138 576776.2896591901 +1139 1138 20389.34106087323 +1142 1138 -17385.62391236761 +1143 1138 -18255.34269584947 +1144 1138 -17383.67381885204 +1133 1139 -17316.92654707866 +1134 1139 -38159.5369040859 +1135 1139 -17314.97680055624 +1138 1139 20389.50267642421 +1139 1139 576758.9923361305 +1140 1139 20390.66934761651 +1143 1139 -17384.18687029758 +1144 1139 -18249.91674326477 +1145 1139 -17382.05402412573 +1134 1140 -17315.40697872147 +1135 1140 -38155.37548023907 +1136 1140 -17313.81785411723 +1139 1140 20390.45855914074 +1140 1140 576752.714257462 +1141 1140 20397.00023631752 +1144 1140 -17382.51904183557 +1145 1140 -18245.79511587647 +1146 1140 -17380.58048988223 +242 1141 -17313.14042109803 +243 1141 20398.29695186133 +244 1141 -17379.8039427196 +1135 1141 -17314.11773453666 +1136 1141 -38152.99492602794 +1140 1141 20396.65190605787 +1141 1141 576752.4237212159 +1145 1141 -17380.91179486754 +1146 1141 -18243.31739213728 +272 1142 -17298.26108504633 +273 1142 16770.30593917218 +274 1142 -17191.40145448109 +1137 1142 -21538.27781077296 +1138 1142 -17297.25853714956 +1142 1142 664355.3832776133 +1143 1142 16770.31798875671 +1147 1142 2628.507662834039 +1148 1142 -17190.35138762034 +1397 1142 -12101.07643845132 +1398 1142 -46410.3566742165 +1399 1142 -14095.38275050646 +1137 1143 -17297.65446914155 +1138 1143 -21533.95331880848 +1139 1143 -17295.72796323752 +1142 1143 16770.42487434109 +1143 1143 664339.104174749 +1144 1143 16771.48052935069 +1147 1143 -17190.75746763487 +1148 1143 2632.31113929415 +1149 1143 -17188.69150796516 +1138 1144 -17296.24047223627 +1139 1144 -21528.40502631664 +1140 1144 -17294.138992909 +1143 1144 16771.56067638369 +1144 1144 664319.6670296537 +1145 1144 16773.65904520679 +1148 1144 -17189.21988530571 +1149 1144 2637.241514956113 +1150 1144 -17186.9376824873 +1139 1145 -17294.5994479246 +1140 1145 -21524.2383158204 +1141 1145 -17292.72366957634 +1144 1145 16773.28078467873 +1145 1145 664313.0067244514 +1146 1145 16781.61696052996 +1149 1145 -17187.42994904533 +1150 1145 2641.242070818516 +1151 1145 -17185.16350733121 +243 1146 -17291.96434256718 +244 1146 16783.40314363037 +245 1146 -17184.29901652057 +1140 1146 -17293.04950732775 +1141 1146 -21521.7555522096 +1145 1146 16781.09775215996 +1146 1146 664313.0841542799 +1150 1146 -17185.52146450003 +1151 1146 2643.77337623807 +273 1147 -17101.3003055044 +274 1147 12510.85416070574 +275 1147 -16985.92031700882 +1142 1147 -750.5708761119458 +1143 1147 -17100.26016077821 +1147 1147 762773.5528109444 +1148 1147 12511.23173854966 +1152 1147 25574.72285896305 +1153 1147 -16984.83378921689 +1398 1147 -13743.64594175944 +1399 1147 -58458.14403049895 +1400 1147 -15911.99653267005 +1142 1148 -17100.66698576753 +1143 1148 -746.653752150909 +1144 1148 -17098.62489533893 +1147 1148 12511.27689445162 +1148 1148 762755.2075492311 +1149 1148 12513.17102812708 +1152 1148 -16985.24557811367 +1153 1148 25577.99440486458 +1154 1148 -16983.06554760356 +1143 1149 -17099.15354581894 +1144 1149 -741.5827850249625 +1145 1149 -17096.90332558584 +1148 1149 12513.15615390651 +1149 1149 762733.3120721478 +1150 1149 12516.34753573362 +1153 1149 -16983.60392473301 +1154 1149 25582.28979753953 +1155 1149 -16981.16919414798 +1144 1150 -17097.39131868842 +1145 1150 -737.5258340271575 +1146 1150 -17095.18942078599 +1149 1150 12515.775661928 +1150 1150 762726.191293468 +1151 1150 12526.16608760499 +1154 1150 -16981.68749044998 +1155 1150 25586.09629828356 +1156 1150 -16979.06657248669 +244 1151 -17094.34263739252 +245 1151 12528.52063618018 +246 1151 -16978.10936735817 +1145 1151 -17095.54187565 +1146 1151 -734.9835230523131 +1150 1151 12525.44988787737 +1151 1151 762726.6640089713 +1155 1151 -16979.4522969965 +1156 1151 25588.65192459497 +274 1152 -16893.83962855297 +275 1152 7479.208013116044 +276 1152 -16615.4790643681 +1147 1152 22099.95520969474 +1148 1152 -16892.76315073493 +1152 1152 876136.0240653596 +1153 1152 7480.025102426913 +1157 1152 53867.52215126678 +1158 1152 -16614.36230132291 +1399 1152 -15554.13950000871 +1400 1152 -72370.43244974277 +1401 1152 -18068.27329795855 +1147 1153 -16893.17635048796 +1148 1153 22103.35391210919 +1149 1153 -16891.02043864627 +1152 1153 7479.995444624339 +1153 1153 876115.2887401069 +1154 1153 7482.897261337966 +1157 1153 -16614.77242529724 +1158 1153 53870.04647608045 +1159 1153 -16612.48513532714 +1148 1154 -16891.5598783004 +1149 1154 22107.80744638024 +1150 1154 -16889.15770010822 +1153 1154 7482.767705439997 +1154 1154 876090.5464022728 +1155 1154 7487.259736478867 +1158 1154 -16613.02477054008 +1159 1154 53873.43980433268 +1160 1154 -16610.43488512538 +1149 1155 -16889.67200634029 +1150 1155 22111.68122387624 +1151 1155 -16887.11730910491 +1154 1155 7486.459263950437 +1155 1155 876082.8879747463 +1156 1155 7499.246941453599 +1159 1155 -16610.97734609435 +1160 1155 53876.92236964653 +1161 1155 -16607.94416020976 +245 1156 -16886.1782698698 +246 1156 7502.272491085481 +247 1156 -16606.884698403 +1150 1156 -16887.49750163232 +1151 1156 22114.25359797055 +1155 1156 7498.299526675451 +1156 1156 876083.8105198966 +1160 1156 -16608.35966477587 +1161 1156 53879.4588509517 +275 1157 -16525.39009960999 +276 1157 1950.806935213124 +277 1157 -16387.71676506033 +1152 1157 50447.90369669146 +1153 1157 -16524.2830876576 +1157 1157 1002059.687903112 +1158 1157 1952.117289030379 +1162 1157 82113.48272443301 +1163 1157 -16386.56474418559 +1400 1157 -17719.4178586843 +1401 1157 -87722.57533415241 +1402 1157 -20328.77429326679 +1152 1158 -16524.69516687618 +1153 1158 50450.56217673192 +1154 1158 -16522.4312269808 +1157 1158 1952.005441963662 +1158 1158 1002036.251767697 +1159 1158 1956.041026561477 +1162 1158 -16386.97205514455 +1163 1158 82115.23330258191 +1164 1158 -16384.57000743021 +1153 1159 -16522.97259524989 +1154 1159 50454.12302317124 +1155 1159 -16520.41443991227 +1158 1159 1955.784936097712 +1159 1159 1002008.286003437 +1160 1159 1961.734015514521 +1163 1159 -16385.10968773683 +1164 1159 82117.68895063334 +1165 1159 -16382.35437062538 +1154 1160 -16520.95333099624 +1155 1160 50457.6799266646 +1156 1160 -16517.98517508103 +1159 1160 1960.679777294012 +1160 1160 1001999.985539389 +1161 1160 1976.134467057265 +1164 1160 -16382.92183961347 +1165 1160 82120.82807442543 +1166 1160 -16379.46299301807 +246 1161 -16516.94354848334 +247 1161 1979.910506798209 +248 1161 -16378.29705750225 +1155 1161 -16518.39534788093 +1156 1161 50460.23764302588 +1160 1161 1974.93010404093 +1161 1161 1002001.37891925 +1165 1161 -16379.90994388579 +1166 1161 82123.33583666463 +276 1162 -16299.89207796261 +277 1162 -4249.502647401103 +278 1162 -16064.00831219689 +1157 1162 78761.87079049271 +1158 1162 -16298.74949162807 +1162 1162 1147392.677599886 +1163 1162 -4247.624510362672 +1167 1162 117826.4817053811 +1168 1162 -16062.81996411755 +1401 1162 -19989.65041669869 +1402 1162 -105262.243625582 +1403 1162 -23172.7531464463 +1157 1163 -16299.15920247374 +1158 1163 78763.76052591148 +1159 1163 -16296.7797027689 +1162 1163 -4247.830843494492 +1163 1163 1147366.105591845 +1164 1163 -4242.484491264266 +1167 1163 -16063.21903181709 +1168 1163 117827.2094460099 +1169 1163 -16060.69158332688 +1158 1164 -16297.32166832414 +1159 1164 78766.39046969308 +1160 1164 -16294.59718132067 +1163 1164 -4242.886168585435 +1164 1164 1147334.394930451 +1165 1164 -4235.257348914405 +1168 1164 -16061.22533367147 +1169 1164 117828.4215798528 +1170 1164 -16058.27956357174 +1159 1165 -16295.1614568977 +1160 1165 78769.60936364846 +1161 1165 -16291.76622222919 +1164 1165 -4236.602967378516 +1165 1165 1147325.329475791 +1166 1165 -4218.08098092259 +1169 1165 -16058.87448710888 +1170 1165 117831.086337566 +1171 1165 -16054.88991607152 +247 1166 -16290.61772747867 +248 1166 -4213.439427073798 +249 1166 -16053.59626997802 +1160 1166 -16292.20804442667 +1161 1166 78772.14197777378 +1165 1166 -4219.580149698988 +1166 1166 1147327.248368317 +1170 1166 -16055.37439066912 +1171 1166 117833.5352546485 +14 1167 -5636.681729663775 +144 1167 -23062.24082771958 +145 1167 210229.4572821261 +146 1167 -5636.033093675247 +277 1167 -15980.93382363751 +278 1167 -10857.22471766364 +1162 1167 114640.9348098905 +1163 1167 -15979.75434012138 +1167 1167 1304726.795972559 +1168 1167 -10854.7298811058 +1402 1167 -22852.67823724202 +1403 1167 -124155.9303307083 +145 1168 -5636.173858819609 +146 1168 210225.43939749 +147 1168 -5634.592985497166 +1162 1168 -15980.15608237345 +1163 1168 114641.8010399454 +1164 1168 -15977.64978358563 +1167 1168 -10855.04231324537 +1168 1168 1304696.873183323 +1169 1168 -10848.26804482583 +146 1169 -5634.802032769305 +147 1169 210220.7233602752 +148 1169 -5632.743219183267 +1163 1169 -15978.18618363483 +1164 1169 114643.1870393841 +1165 1169 -15975.2694912301 +1168 1169 -10848.83203424554 +1169 1169 1304661.166371942 +1170 1169 -10839.37920034304 +147 1170 -5633.12255189705 +148 1170 210219.9786362426 +149 1170 -5629.086376339819 +1164 1170 -15975.86162896255 +1165 1170 114645.9332219636 +1166 1170 -15971.93741245094 +1169 1170 -10841.04216147106 +1170 1170 1304651.308065278 +1171 1170 -10819.20238120152 +15 1171 -5627.984374557149 +148 1171 -5629.46089798964 +149 1171 210220.9129619453 +157 1171 -23059.4597355331 +248 1171 -15970.66030799918 +249 1171 -10813.62210624766 +1165 1171 -15972.41709231032 +1166 1171 114648.4090360424 +1170 1171 -10821.02071566597 +1171 1171 1304653.813771248 +6 1172 -88.46561163772287 +30 1172 -15.7779645559012 +39 1172 -15.77849542956021 +100 1172 -138.43004804198 +101 1172 -445.8511115075133 +192 1172 -57.79293779371437 +193 1172 -97.38534232422322 +597 1172 -79.24727828872989 +598 1172 -23.71666084177676 +749 1172 -79.25000866031175 +750 1172 -23.7174342279467 +882 1172 -16.187183718959 +887 1172 -17.59781249894289 +1172 1172 1429.947872537937 +1173 1172 -430.1188960821875 +1201 1172 67.17057115098142 +1202 1172 -149.5264141526291 +192 1173 -94.67181927475173 +193 1173 -113.4765160547892 +194 1173 -110.0891608444112 +882 1173 -17.0450719381461 +887 1173 -27.54365984615451 +892 1173 -20.16055284854701 +1172 1173 -436.6736380813674 +1173 1173 1583.716985846832 +1174 1173 -417.1271995347425 +1201 1173 -146.7518798576234 +1202 1173 20.0329858172977 +1203 1173 -166.8550267110222 +193 1174 -106.7317225192326 +194 1174 -185.4114967067082 +195 1174 -124.8664512868909 +887 1174 -19.47634064898408 +892 1174 -42.2531493479085 +897 1174 -23.13497910747044 +1173 1174 -425.4102008172564 +1174 1174 1794.998007176335 +1175 1174 -403.1600706212191 +1202 1174 -163.2801735838431 +1203 1174 -41.93889913142308 +1204 1174 -187.6464275223126 +194 1175 -121.0273806028558 +195 1175 -275.5989326405999 +196 1175 -141.6268239545889 +892 1175 -22.35223805989391 +897 1175 -60.62675282853129 +902 1175 -26.58487600254461 +1174 1175 -412.8522121671802 +1175 1175 2036.875357791813 +1176 1175 -362.727165932298 +1203 1175 -183.3772402553496 +1204 1175 -125.7190349730087 +1205 1175 -209.3865650126202 +195 1176 -137.169861950237 +196 1176 -387.3392091666913 +197 1176 -160.4663465464109 +897 1176 -25.67569931066746 +902 1176 -83.32157295958299 +907 1176 -30.46552013276036 +1175 1176 -374.2577660380632 +1176 1176 2312.205293759436 +1177 1176 -314.3649969435493 +1204 1176 -204.2013350899597 +1205 1176 -236.7994033236388 +1206 1176 -233.9782220086282 +196 1177 -155.6556569766762 +197 1177 -519.9047451790921 +198 1177 -182.1610965902708 +902 1177 -29.48369043662623 +907 1177 -110.2138795489271 +912 1177 -34.97745524172491 +1176 1177 -327.1287623622056 +1177 1177 2625.653497351234 +1178 1177 -241.9938662636769 +1205 1177 -228.1200124756623 +1206 1177 -375.7252910450345 +1207 1177 -260.6503943295592 +197 1178 -176.9227815347971 +198 1178 -677.1638415028143 +199 1178 -206.4643095672888 +907 1178 -33.90782272436968 +912 1178 -142.0845569723414 +917 1178 -40.03708932974934 +1177 1178 -256.2466062440847 +1178 1178 2983.801426255052 +1179 1178 -156.0218640933618 +1206 1178 -253.9800998161365 +1207 1178 -548.4809887518427 +1208 1178 -290.0269602656089 +198 1179 -201.1097099948419 +199 1179 -856.2277718463852 +200 1179 -234.0534357458604 +912 1179 -38.94320032269217 +917 1179 -178.3744379701739 +922 1179 -45.78733302691701 +1178 1179 -170.9513939420074 +1179 1179 3388.228975318311 +1180 1179 -52.69988332734917 +1207 1179 -282.9123708064468 +1208 1179 -752.2870528678267 +1209 1179 -322.454855927743 +199 1180 -228.5496608706128 +200 1180 -1062.869961151031 +201 1180 -265.7410128060129 +917 1180 -44.66248510578746 +922 1180 -220.2577533157434 +927 1180 -52.39171968477994 +1179 1180 -68.40157910584955 +1180 1180 3852.242551249479 +1181 1180 69.55397211842916 +1208 1180 -314.8493604922637 +1209 1180 -994.383047776989 +1210 1180 -358.6708336131879 +200 1181 -260.3648182099918 +201 1181 -1292.076092187221 +202 1181 -300.3440716370886 +922 1181 -51.29252151350949 +927 1181 -266.7381489535925 +932 1181 -59.58480410951118 +1180 1181 53.89037031551173 +1181 1181 4371.595355145495 +1182 1181 199.6891385580791 +1209 1181 -350.9740207300117 +1210 1181 -1268.333325620409 +1211 1181 -398.2832808827019 +201 1182 -295.0723629908509 +202 1182 -1553.355038592456 +203 1182 -341.9757854826115 +927 1182 -58.50660446572176 +932 1182 -319.7529437491992 +937 1182 -68.23000794252502 +1181 1182 184.0398341005314 +1182 1182 4970.026657308619 +1183 1182 356.2661941780019 +1210 1182 -390.4979456047167 +1211 1182 -1584.816730925523 +1212 1182 -444.7100904278246 +202 1183 -336.9981345810054 +203 1183 -1839.211939514044 +204 1183 -384.9726961847026 +932 1183 -67.21165496010023 +937 1183 -377.7914875908617 +942 1183 -77.12892209261975 +1182 1183 341.2464555021326 +1183 1183 5634.53608914849 +1184 1183 509.7784761080796 +1211 1183 -437.159425684061 +1212 1183 -1933.826908769459 +1213 1183 -493.5654960827904 +203 1184 -380.2630380052514 +204 1184 -2164.791669971843 +205 1184 -439.9041244641182 +937 1184 -76.16516098464342 +942 1184 -443.9405816841802 +947 1184 -88.48099885013788 +1183 1184 495.368033840052 +1184 1184 6403.708822964607 +1185 1184 702.0669776994786 +1212 1184 -486.2579525678865 +1213 1184 -2332.331609269054 +1214 1184 -554.8118477523755 +204 1185 -435.5584796546896 +205 1185 -2518.949897176644 +206 1185 -493.0263492114651 +942 1185 -87.59154689122248 +947 1185 -515.9368681673761 +952 1185 -99.42883072553863 +1184 1185 688.6135574084427 +1185 1185 7252.309415467561 +1186 1185 878.6854181842705 +1213 1185 -547.9406910540793 +1214 1185 -2766.070791779006 +1215 1185 -615.4324052219672 +205 1186 -489.0196503948158 +206 1186 -2924.640059091692 +207 1186 -565.7156579429081 +947 1186 -98.60861664700288 +952 1186 -598.4602195911011 +957 1186 -114.3873671960747 +1185 1186 866.160568528616 +1186 1186 8239.515066522235 +1187 1186 1113.700770071855 +1214 1186 -608.9983192434192 +1215 1186 -3261.383054984176 +1216 1186 -697.4195932615796 +206 1187 -562.0161193791662 +207 1187 -3372.988269565456 +208 1187 -633.4951875793262 +952 1187 -113.6299289361966 +957 1187 -689.7003756141155 +962 1187 -128.3087772590687 +1186 1187 1102.043268627935 +1187 1187 9342.418571560873 +1188 1187 1324.180499910844 +1215 1187 -691.4027971071791 +1216 1187 -3807.218255129095 +1217 1187 -775.2479094788146 +207 1188 -630.2372901535683 +208 1188 -3873.322855931491 +209 1188 -724.6444280035494 +957 1188 -127.64168735066 +962 1188 -791.5687359514244 +967 1188 -147.0073557288811 +1187 1188 1313.848404378517 +1188 1188 10588.42915640081 +1189 1188 1599.486924417228 +1216 1188 -769.8952072956874 +1217 1188 -4413.648128045476 +1218 1188 -879.5407669612714 +208 1189 -721.634158717789 +209 1189 -4436.8244201197 +210 1189 -813.8572497706011 +962 1189 -146.3909167963712 +967 1189 -906.3341003888671 +972 1189 -165.2864688043691 +1188 1189 1589.890760459828 +1189 1189 12002.79149533578 +1190 1189 1861.483811308406 +1217 1189 -874.5545287255072 +1218 1189 -5094.036828966126 +1219 1189 -982.6583011011751 +209 1190 -811.2216643440743 +210 1190 -5065.612981707468 +211 1190 -927.7621137793476 +967 1190 -164.74671974627 +972 1190 -1034.437446863172 +977 1190 -188.6039572310528 +1189 1190 1853.047297795169 +1190 1190 13594.16157740207 +1191 1190 2188.617496597287 +1218 1190 -978.2642724936366 +1219 1190 -5850.261244486417 +1220 1190 -1114.418617641268 +210 1191 -925.3534673453764 +211 1191 -5778.640364507611 +212 1191 -1045.479654913795 +972 1191 -188.1106566360329 +977 1191 -1179.735257253285 +982 1191 -212.6834370939498 +1190 1191 2180.882110965306 +1191 1191 15408.83346181744 +1192 1191 2520.2915980628 +1219 1191 -1110.382262134052 +1220 1191 -6704.924907362084 +1221 1191 -1251.336515075975 +211 1192 -1043.375561820864 +212 1192 -6573.367675071008 +213 1192 -1187.434027221078 +977 1192 -212.2524915903959 +982 1192 -1341.714925131514 +987 1192 -241.7033520063027 +1191 1192 2513.516704946464 +1192 1192 17442.14067035143 +1193 1192 2914.053700692285 +1220 1192 -1247.796157911435 +1221 1192 -7654.700013930758 +1222 1192 -1416.767021492894 +212 1193 -1185.526882574603 +213 1193 -7480.176226985028 +214 1193 -1342.922415441546 +982 1193 -241.3127307892923 +987 1193 -1526.566678133247 +992 1193 -273.4746414085037 +1192 1193 2907.900371856465 +1193 1193 19771.0064038715 +1194 1193 3339.880457672337 +1221 1193 -1413.547772032901 +1222 1193 -8735.687762336569 +1223 1193 -1598.485134534745 +213 1194 -1341.256426873257 +214 1194 -8488.787818564209 +215 1194 -1519.457620428827 +987 1194 -273.133404608995 +992 1194 -1732.1971042907 +997 1194 -309.532854287955 +1193 1194 3334.496525050543 +1194 1194 22369.78305592018 +1195 1194 3818.450784265196 +1222 1194 -1595.665861820015 +1223 1194 -9935.608605038453 +1224 1194 -1805.203912143062 +214 1195 -1517.957358225505 +215 1195 -9646.096001085474 +216 1195 -1724.880615781106 +992 1195 -309.2255560053297 +997 1195 -1968.166423396206 +1002 1195 -351.4787714681659 +1194 1195 3813.596283541981 +1195 1195 25359.1262658033 +1196 1195 4370.691375518715 +1223 1195 -1802.660074300565 +1224 1195 -11310.01310641112 +1225 1195 -2046.084917340991 +215 1196 -1723.568145134573 +216 1196 -10929.75293761031 +217 1196 -1944.032233994423 +997 1196 -351.2099340434452 +1002 1196 -2229.917916435662 +1007 1196 -396.2175293099848 +1195 1196 4366.440297147474 +1196 1196 28681.38454552323 +1197 1196 4956.101539960988 +1224 1196 -2043.85604564987 +1225 1196 -12832.48499200241 +1226 1196 -2303.476378821686 +216 1197 -1942.856742146286 +217 1197 -12410.19025165474 +218 1197 -2215.368297756908 +1002 1197 -395.9767465735619 +1007 1197 -2531.814383247608 +1012 1197 -451.5989452906358 +1196 1197 4952.291170740124 +1197 1197 32519.10713496949 +1198 1197 5677.005880390466 +1225 1197 -2301.4777079859 +1226 1197 -14586.2976934991 +1227 1197 -2622.356651306317 +217 1198 -2214.337523806591 +218 1198 -14046.80761837543 +219 1198 -2486.961122042127 +1007 1198 -451.3878038184669 +1012 1198 -2865.575202184529 +1017 1198 -507.024877945248 +1197 1198 5673.662576131093 +1198 1198 36766.70643823761 +1199 1198 6395.795720972192 +1226 1198 -2620.602376673349 +1227 1198 -16523.55691170832 +1228 1198 -2941.924898436019 +218 1199 -2486.042339908312 +219 1199 -15943.38377520635 +220 1199 -2845.220930749302 +1012 1199 -506.83667514739 +1017 1199 -3252.366091444125 +1022 1199 -580.128900176467 +1198 1199 6392.814240827139 +1199 1199 41694.05828527229 +1200 1199 7340.69289587815 +1227 1199 -2940.360063174437 +1228 1199 -18766.83261092916 +1229 1199 -3363.567015785636 +13 1200 -3175.375659865248 +137 1200 8274.441579326916 +138 1200 -3743.213102199526 +158 1200 -647.674789452581 +219 1200 -2844.412888862094 +220 1200 -18031.79831329806 +440 1200 -647.6852650286261 +1017 1200 -579.9633803247848 +1022 1200 -3678.292062183406 +1199 1200 7338.069792980363 +1200 1200 47123.23753320523 +1228 1200 -3362.189990051015 +1229 1200 -21235.49828317661 +99 1201 -217.0286815030379 +100 1201 -814.0651074098359 +101 1201 -124.7607982303724 +597 1201 -22.03249023028305 +598 1201 -142.4099408060078 +599 1201 -37.0901795869009 +749 1201 -22.03309401884385 +750 1201 -142.413514453504 +751 1201 -37.09094254724804 +1172 1201 46.45211128835839 +1173 1201 -134.3488977412642 +1201 1201 2164.688239036352 +1202 1201 -815.7602812489562 +1230 1201 251.0385523937277 +1231 1201 -232.5352198025092 +1172 1202 -131.6636685656738 +1173 1202 -2.233749092537927 +1174 1202 -149.0814218885579 +1201 1202 -822.9783991071951 +1202 1202 2378.904444775638 +1203 1202 -836.4235516141623 +1230 1202 -229.6888179438363 +1231 1202 218.8825678157423 +1232 1202 -259.0520250936314 +1173 1203 -145.6156532095678 +1174 1203 -66.64747418901699 +1175 1203 -166.7666329285627 +1202 1203 -845.9914118646955 +1203 1203 2684.978553873243 +1204 1203 -862.1872597860861 +1231 1203 -255.1936883791908 +1232 1203 176.2788436440472 +1233 1203 -292.1157441506217 +1174 1204 -162.61984374319 +1175 1204 -152.5188591794398 +1176 1204 -185.5747884118131 +1203 1204 -873.9919493624578 +1204 1204 3032.983580679666 +1205 1204 -848.8699248819687 +1232 1204 -287.2371672185931 +1233 1204 108.2332400989333 +1234 1204 -325.6032449612732 +1175 1205 -180.527977141409 +1176 1205 -264.9126311592076 +1177 1205 -207.076067137605 +1204 1205 -863.7403689903972 +1205 1205 3425.001231255977 +1206 1205 -825.3611682920072 +1233 1205 -319.295225129088 +1234 1205 5.262133751990575 +1235 1205 -364.5328171345096 +1176 1206 -201.3621603036546 +1177 1206 -404.172558363801 +1178 1206 -231.0687410016854 +1205 1206 -842.8456648609043 +1206 1206 3869.600072093582 +1207 1206 -761.3923358817536 +1234 1206 -356.9130807843957 +1235 1206 -136.6408244961103 +1236 1206 -405.6409699806318 +1177 1207 -224.5488431114434 +1178 1207 -575.7343499285349 +1179 1207 -258.0573032152112 +1206 1207 -782.161319294109 +1207 1207 4372.976172205298 +1208 1207 -671.9256492528576 +1235 1207 -396.3424798813385 +1236 1207 -329.2123387662062 +1237 1207 -451.0322107009134 +1178 1208 -251.0885223091855 +1179 1208 -776.8377091873569 +1180 1208 -288.6051989056325 +1207 1208 -695.0670974117686 +1208 1208 4941.505451130106 +1209 1208 -548.0161435064791 +1236 1208 -440.3968106935725 +1237 1208 -572.5806304913565 +1238 1208 -500.3192607400458 +1179 1209 -281.1406875108582 +1180 1209 -1014.223409808928 +1181 1209 -323.5353659529011 +1208 1209 -573.8564532072148 +1209 1209 5590.194421018803 +1210 1209 -385.6947728835577 +1237 1209 -488.1482835665725 +1238 1209 -879.9188423427717 +1239 1209 -553.8337123469743 +1180 1210 -315.967221758486 +1181 1210 -1281.802135467397 +1182 1210 -362.2050195028764 +1209 1210 -412.9751950631138 +1210 1210 6318.507058907364 +1211 1210 -203.1727737513802 +1238 1210 -540.6928310332398 +1239 1210 -1244.600613670413 +1240 1210 -612.4419980524019 +1181 1211 -354.5370371453136 +1182 1211 -1589.852433875907 +1183 1211 -408.3120319056255 +1210 1211 -231.8850768997127 +1211 1211 7156.069423281428 +1212 1211 29.70597511753061 +1239 1211 -598.3333405987622 +1240 1211 -1682.383746765692 +1241 1211 -677.8944750584889 +1182 1212 -400.8642032426454 +1183 1212 -1928.956172374075 +1184 1212 -456.8637818972289 +1211 1212 0.8272177591739762 +1212 1212 8089.7085086262 +1213 1212 262.6991345288003 +1240 1212 -663.456457526036 +1241 1212 -2178.839392958626 +1242 1212 -748.2249186464364 +1183 1213 -449.646590169637 +1184 1213 -2315.665717731491 +1185 1213 -518.2393621381848 +1212 1213 233.8303311981935 +1213 1213 9170.504625659332 +1214 1213 561.8058824569416 +1241 1213 -733.5784976828938 +1242 1213 -2756.328786801012 +1243 1213 -832.0986524523075 +1184 1214 -511.4458260993916 +1185 1214 -2736.406680536133 +1186 1214 -578.7191324056797 +1213 1214 533.8827745011645 +1214 1214 10366.57541500809 +1215 1214 837.5990518326016 +1242 1214 -817.7569567138537 +1243 1214 -3392.635204049656 +1244 1214 -917.8639741201964 +1185 1215 -572.3519997030717 +1186 1215 -3216.932978613962 +1187 1215 -660.6791002846358 +1214 1215 810.8141839514979 +1215 1215 11759.39284804497 +1216 1215 1204.89155665801 +1243 1215 -903.967270250693 +1244 1215 -4122.576951059129 +1245 1215 -1029.428973914967 +1186 1216 -654.7204584327611 +1187 1216 -3746.61595707626 +1188 1216 -738.1154859794578 +1215 1216 1179.327148753135 +1216 1216 13317.28139898865 +1217 1216 1532.591005091444 +1244 1216 -1016.05504575061 +1245 1216 -4928.53761442922 +1246 1216 -1138.268749107822 +1187 1217 -732.8113091866085 +1188 1217 -4335.530361008718 +1189 1217 -841.7364282163046 +1216 1217 1509.463301015085 +1217 1217 15080.68045537275 +1218 1217 1956.738486393893 +1245 1217 -1126.088974115315 +1246 1217 -5821.86186009019 +1247 1217 -1281.405706490947 +1188 1218 -836.7929806560445 +1189 1218 -4996.599905979689 +1190 1218 -943.8377049899634 +1217 1218 1934.896864405259 +1218 1218 17082.49165214659 +1219 1218 2357.406623909815 +1246 1218 -1269.842020994374 +1247 1218 -6820.782900935452 +1248 1218 -1425.043783275948 +1189 1219 -939.4796762059866 +1190 1219 -5731.891902610921 +1191 1219 -1074.009382946955 +1218 1219 2337.943801989888 +1219 1219 19337.75973273896 +1220 1219 2851.555321173859 +1247 1219 -1414.695815501911 +1248 1219 -7925.946811783472 +1249 1219 -1607.59316430328 +1190 1220 -1070.004847267388 +1191 1220 -6563.33697378642 +1192 1220 -1208.950747579609 +1219 1220 2833.516465986632 +1220 1220 21909.63436079741 +1221 1220 3348.393826933766 +1248 1220 -1597.970127571462 +1249 1220 -9169.174033932208 +1250 1220 -1798.678479931535 +1191 1221 -1205.437428435338 +1192 1221 -7487.837060623066 +1193 1221 -1371.688779737478 +1220 1221 3332.458204027725 +1221 1221 24793.50555545981 +1222 1221 3932.420898536411 +1249 1221 -1790.154890845447 +1250 1221 -10544.62303553173 +1251 1221 -2029.58415135557 +1192 1222 -1368.49349021492 +1193 1222 -8540.511239353511 +1194 1222 -1550.156047818956 +1221 1222 3917.848266145027 +1222 1222 28096.74988004343 +1223 1222 4559.237919117939 +1250 1222 -2021.773346690346 +1251 1222 -12103.56002784399 +1252 1222 -2284.046002590454 +1193 1223 -1547.357325185875 +1194 1223 -9709.465158267252 +1195 1223 -1752.910645458293 +1222 1223 4546.41837190875 +1223 1223 31784.32832876548 +1224 1223 5258.97432889507 +1251 1223 -2277.163561783391 +1252 1223 -13828.07527572672 +1253 1223 -2574.073035221314 +1194 1224 -1750.385043245002 +1195 1224 -11048.81947901133 +1196 1224 -1988.915101397586 +1223 1224 5247.366184295309 +1224 1224 36026.33049753495 +1225 1224 6061.532478400981 +1252 1224 -2567.832953757601 +1253 1224 -15797.08251977045 +1254 1224 -2912.416391415475 +1195 1225 -1986.701996006366 +1196 1225 -12532.84530799306 +1197 1225 -2240.881334259519 +1224 1225 6051.333156250263 +1225 1225 40741.77413191755 +1226 1225 6908.798194812093 +1253 1225 -2906.928107338339 +1254 1225 -17973.02652315947 +1255 1225 -3274.74224705355 +1196 1226 -2238.896652928463 +1197 1226 -14242.73683271038 +1198 1226 -2552.819313724491 +1225 1226 6899.632220345465 +1226 1226 46189.10176673553 +1227 1226 7947.449548576076 +1254 1226 -3269.806123398706 +1255 1226 -20474.04104031439 +1256 1226 -3723.689020460198 +1197 1227 -2551.07721572359 +1198 1227 -16131.78243415901 +1199 1227 -2865.264635330642 +1226 1227 7939.390523371725 +1227 1227 52218.89734682122 +1228 1227 8980.621651569581 +1255 1227 -3719.346338355598 +1256 1227 -23232.37841595 +1257 1227 -4174.465279694947 +1198 1228 -2863.710590537349 +1199 1228 -18319.53866490452 +1200 1228 -3277.321637777021 +1227 1228 8973.423214960963 +1228 1228 59213.93599406197 +1229 1228 10334.42511692626 +1256 1228 -4170.58446467077 +1257 1228 -26421.70699735061 +1258 1228 -4769.059597060337 +137 1229 -3652.180096016707 +138 1229 11729.75554622856 +139 1229 -5283.98363195423 +1199 1229 -3275.954058326345 +1200 1229 -20727.32210238909 +1228 1229 10328.0839357776 +1229 1229 66919.98182479432 +1257 1229 -4765.639655048473 +1258 1229 -29927.0548663802 +98 1230 -349.1393087169465 +99 1230 -1426.568423308081 +100 1230 -196.3900844301238 +598 1230 -34.35230630621136 +599 1230 -246.4862720955776 +600 1230 -59.39531172998346 +750 1230 -34.35297512461319 +751 1230 -246.4898671674543 +752 1230 -59.39582168889761 +1201 1230 217.2417174868425 +1202 1230 -209.6528573423579 +1230 1230 3414.147182227864 +1231 1230 -1462.98837721931 +1259 1230 547.4895827408611 +1260 1230 -372.122731522458 +1201 1231 -206.9334545938197 +1202 1231 182.1595115500815 +1203 1231 -232.0761881075358 +1230 1231 -1470.852231859984 +1231 1231 3741.912212068667 +1232 1231 -1552.152840097746 +1259 1231 -369.4197539134964 +1260 1231 543.8789515208231 +1261 1231 -414.2690393539297 +1202 1232 -228.383002922776 +1203 1232 134.7712225421167 +1204 1232 -259.8969166039897 +1231 1232 -1563.023627771698 +1232 1232 4225.75808295804 +1233 1232 -1663.93220127616 +1260 1232 -410.4738422367291 +1261 1232 542.5644218400303 +1262 1232 -468.2281601499432 +1203 1233 -255.2168878784282 +1204 1233 61.80683219860521 +1205 1233 -287.9331447793401 +1232 1233 -1678.003565080198 +1233 1233 4776.665118882417 +1234 1233 -1723.505780337494 +1261 1233 -463.2260885871902 +1262 1233 517.4893932345974 +1263 1233 -521.8252734172809 +1204 1234 -281.8667735984411 +1205 1234 -45.72203116464398 +1206 1234 -320.5430529652174 +1233 1234 -1742.207258522016 +1234 1234 5396.588640953478 +1235 1234 -1778.89231953565 +1262 1234 -515.0401375984293 +1263 1234 455.5302799440075 +1264 1234 -585.5882573610027 +1205 1235 -313.1949781712046 +1206 1235 -191.5256022672491 +1207 1235 -355.3723093521974 +1234 1235 -1802.20994011546 +1235 1235 6101.293466241436 +1236 1235 -1774.048407238715 +1263 1235 -576.9351119324814 +1264 1235 349.1396925832668 +1265 1235 -651.8730633617622 +1206 1236 -346.3786490754379 +1207 1236 -386.3752449985045 +1208 1236 -394.3752925397025 +1235 1236 -1803.535304754534 +1236 1236 6895.998157088487 +1237 1236 -1730.28481197562 +1264 1236 -640.6621060380028 +1265 1236 178.8147117985489 +1266 1236 -725.6527577697987 +1207 1237 -384.0563892158974 +1208 1237 -630.1578530342811 +1209 1237 -437.7265768921532 +1236 1237 -1765.357921248929 +1237 1237 7796.247156711237 +1238 1237 -1625.282609596916 +1265 1237 -711.9762823727021 +1266 1237 -61.39367358669949 +1267 1237 -805.0470959154566 +1208 1238 -425.8802173931636 +1209 1238 -934.7839859144891 +1210 1238 -486.1941060599587 +1237 1238 -1667.130691006013 +1238 1238 8817.628110042664 +1239 1238 -1445.480302345663 +1266 1238 -788.3068852892687 +1267 1238 -396.2597080905004 +1268 1238 -889.3298141298793 +1209 1239 -473.3633839836496 +1210 1239 -1293.803757972606 +1211 1239 -540.4164243580874 +1238 1239 -1492.664067778334 +1239 1239 9968.532608452264 +1240 1239 -1218.151262305184 +1267 1239 -869.9771940476977 +1268 1239 -824.2014324805597 +1269 1239 -981.9068221272671 +1210 1240 -526.5990990594946 +1211 1240 -1721.763466870763 +1212 1240 -603.0815068378155 +1239 1240 -1271.062082101248 +1240 1240 11285.42454921813 +1241 1240 -884.7584794962153 +1268 1240 -959.6852596445453 +1269 1240 -1373.589341281631 +1270 1240 -1079.314987011826 +1211 1241 -588.9016118136947 +1212 1241 -2205.052749566385 +1213 1241 -671.0096008300222 +1240 1241 -941.2535724473044 +1241 1241 12759.06750560832 +1242 1241 -535.146942311992 +1269 1241 -1055.064821625084 +1270 1241 -2029.278011251581 +1271 1241 -1186.337049177857 +1212 1242 -656.5880684649799 +1213 1242 -2765.013821814781 +1214 1242 -754.1707585572599 +1241 1242 -594.8035628308894 +1242 1242 14459.62032827033 +1243 1242 -50.81137573717808 +1270 1242 -1160.225915822642 +1271 1242 -2824.914565656493 +1272 1242 -1303.966243416784 +1213 1243 -740.0170111243235 +1214 1243 -3380.755508811471 +1215 1243 -839.0046186420518 +1242 1243 -111.4263116055749 +1243 1243 16347.71828597151 +1244 1243 404.7673606044436 +1271 1243 -1276.979859773498 +1272 1243 -3729.072407598968 +1273 1243 -1429.426689270114 +1214 1244 -825.2628652863007 +1215 1244 -4086.083078833484 +1216 1244 -950.8533507417665 +1243 1244 344.0586016698836 +1244 1244 18543.82054818207 +1245 1244 1031.832163047292 +1272 1244 -1402.003119530315 +1273 1244 -4788.431189341723 +1274 1244 -1580.758906991864 +1215 1245 -937.6060287777734 +1216 1245 -4864.340798315121 +1217 1245 -1059.346082440695 +1244 1245 971.6761509386464 +1245 1245 21002.16445130368 +1246 1245 1594.958426130104 +1273 1245 -1553.249203855171 +1274 1245 -5974.895998714443 +1275 1245 -1734.487988637901 +1216 1246 -1047.264513845635 +1217 1246 -5727.153897208392 +1218 1246 -1202.404552862298 +1245 1246 1538.794430266472 +1246 1246 23788.62674881701 +1247 1246 2327.071331178177 +1274 1246 -1708.543900840865 +1275 1246 -7298.255885337558 +1276 1246 -1928.535892813062 +1217 1247 -1190.920692982121 +1218 1247 -6692.091427007555 +1219 1247 -1345.280064128081 +1246 1247 2272.621283640634 +1247 1247 26949.2816278775 +1248 1247 3017.428901727699 +1275 1247 -1903.176440974639 +1276 1247 -8781.747778429231 +1277 1247 -2127.769371221957 +1218 1248 -1334.993691562382 +1219 1248 -7760.4527402274 +1220 1248 -1526.489465567966 +1247 1248 2967.848415480845 +1248 1248 30514.07644647023 +1249 1248 3861.965345169368 +1276 1248 -2104.524153449427 +1277 1248 -10420.40454693529 +1278 1248 -2377.634377185162 +1219 1249 -1516.916307880144 +1220 1249 -8962.937069923584 +1221 1249 -1715.467083547865 +1248 1249 3815.197070395646 +1249 1249 34576.77174624737 +1250 1249 4705.152411942207 +1277 1249 -2355.590939564438 +1278 1249 -12257.72926840363 +1279 1249 -2642.277320967173 +1220 1250 -1706.982394107071 +1221 1250 -10294.32564152691 +1222 1250 -1943.189451621944 +1249 1250 4663.245036665463 +1250 1250 39134.99753626301 +1251 1250 5686.010737088433 +1278 1250 -2622.441141117787 +1279 1250 -14281.4113141074 +1280 1250 -2961.820041213368 +1221 1251 -1935.410434076196 +1222 1251 -11804.21765867781 +1223 1251 -2193.451286796125 +1250 1251 5647.248796005834 +1251 1251 44353.82600709073 +1252 1251 6729.461816345389 +1279 1251 -2943.41108937427 +1280 1251 -16563.73964296498 +1281 1251 -3315.941272625885 +1222 1252 -2186.594146370823 +1223 1252 -13475.48944487114 +1224 1252 -2478.045939824486 +1251 1252 6695.051307734753 +1252 1252 50181.46038288456 +1253 1252 7884.400783073232 +1280 1252 -3299.555499016217 +1281 1252 -19077.01613749986 +1282 1252 -3720.959119537945 +1223 1253 -2471.826856396845 +1224 1253 -15384.63979074666 +1225 1253 -2809.406016399826 +1252 1253 7853.016572461749 +1253 1253 56883.4615479409 +1254 1253 9198.059048141458 +1281 1253 -3705.983211735656 +1282 1253 -21933.55094715894 +1283 1253 -4194.532776616149 +1224 1254 -2803.934850557283 +1225 1254 -17495.32913298379 +1226 1254 -3163.699974575879 +1253 1254 9170.325877238596 +1254 1254 64334.27447587813 +1255 1254 10576.9425710324 +1282 1254 -4181.27730907956 +1283 1254 -25078.9581368455 +1284 1254 -4703.798730603192 +1225 1255 -3158.778292788485 +1226 1255 -19922.21279661178 +1227 1255 -3602.114916460299 +1254 1255 10551.90693943491 +1255 1255 72940.18203479241 +1256 1255 12255.83713638666 +1283 1255 -4691.817180885597 +1284 1255 -28681.57417696407 +1285 1255 -5335.188634549999 +1226 1256 -3597.784279097611 +1227 1256 -22599.53054341917 +1228 1256 -4041.876818554138 +1255 1256 12233.74688046629 +1256 1256 82466.60626892175 +1257 1256 13920.13371443034 +1284 1256 -5324.605993730347 +1285 1256 -32644.84662981862 +1286 1256 -5971.474812529756 +1227 1257 -4038.006304791456 +1228 1257 -25695.94587884114 +1229 1257 -4621.436666058762 +1256 1257 13900.34752542519 +1257 1257 93517.07440863707 +1258 1257 16089.79389057792 +1285 1257 -5961.988478539806 +1286 1257 -37216.04693507685 +1287 1257 -6810.601275007354 +138 1258 -5133.929956444004 +139 1258 18471.85528100286 +140 1258 -7480.065995758034 +1228 1258 -4618.025481995644 +1229 1258 -29099.69101716633 +1257 1258 16072.32595918061 +1258 1258 105685.452159316 +1286 1258 -6802.2212261344 +1287 1258 -42229.51165086885 +97 1259 -575.8805240567413 +98 1259 -2449.589718157153 +99 1259 -315.8621563838421 +599 1259 -54.6473416186398 +600 1259 -418.9685736556635 +601 1259 -97.46684215587119 +751 1259 -54.64790506887684 +752 1259 -418.9702694672528 +753 1259 -97.46658611089975 +1230 1259 488.8735503171314 +1231 1259 -335.6232710045346 +1259 1259 5510.661482631221 +1260 1259 -2547.645015784257 +1288 1259 1037.308170884242 +1289 1259 -612.0949823831471 +1230 1260 -333.0835436759273 +1231 1260 480.1472756290076 +1232 1260 -371.6491378246538 +1259 1260 -2555.854607523019 +1260 1260 6028.48573464209 +1261 1260 -2760.245657775045 +1288 1260 -609.6330500537048 +1289 1260 1081.268184356073 +1290 1260 -681.5971852093468 +1231 1261 -368.07656489237 +1232 1261 470.4184853430604 +1233 1261 -417.462494527597 +1260 1261 -2771.922865827319 +1261 1261 6810.191276162804 +1262 1261 -3032.599128202584 +1289 1261 -678.0604443367617 +1290 1261 1152.05704696484 +1291 1261 -772.0819097020451 +1232 1262 -412.7433711442939 +1233 1262 436.099981601974 +1234 1262 -462.220676882141 +1261 1262 -3048.236276937002 +1262 1262 7701.246454450701 +1263 1262 -3242.002115324168 +1290 1262 -767.2888761581563 +1291 1262 1207.400309459394 +1292 1262 -861.2002804208585 +1233 1263 -455.8025176564959 +1234 1263 364.5084241464599 +1235 1263 -515.075877223472 +1262 1263 -3263.625585866645 +1263 1263 8703.726429616207 +1264 1263 -3473.140419132815 +1291 1263 -854.4779742151825 +1292 1263 1231.803105665412 +1293 1263 -969.0674365603302 +1234 1264 -506.8656783296331 +1235 1264 248.2376077871125 +1236 1264 -569.5880938430064 +1263 1264 -3501.359843506826 +1264 1264 9846.17074865225 +1265 1264 -3629.899114641558 +1292 1264 -960.1489497952419 +1293 1264 1216.354308829525 +1294 1264 -1080.617991032857 +1235 1265 -558.9139356761224 +1236 1265 69.00997153644673 +1237 1265 -630.2046202362451 +1264 1265 -3667.46374981848 +1265 1265 11131.35676746008 +1266 1265 -3747.159808345212 +1293 1265 -1068.521577122391 +1294 1265 1134.031819954 +1295 1265 -1206.188797489656 +1236 1266 -617.1323748428667 +1237 1266 -178.8363016452747 +1238 1266 -695.8768070105259 +1265 1266 -3794.442896745863 +1266 1266 12592.68245151746 +1267 1266 -3779.315004695424 +1294 1266 -1190.642171633599 +1295 1266 973.5251072076909 +1296 1266 -1341.416201950756 +1237 1267 -679.8087146147168 +1238 1267 -517.8390000721448 +1239 1267 -766.7408831597029 +1266 1267 -3839.27049944454 +1267 1267 14242.21666222672 +1268 1267 -3692.042613230228 +1295 1267 -1321.253825949864 +1296 1267 694.2977574428107 +1297 1267 -1483.759775013662 +1238 1268 -748.0823978176511 +1239 1268 -946.3023114182761 +1240 1268 -846.0444182718506 +1267 1268 -3764.108074592336 +1268 1268 16109.38746170405 +1269 1268 -3522.259104925583 +1296 1268 -1458.94401826097 +1297 1268 288.3295420580325 +1298 1268 -1641.656052025342 +1239 1269 -824.5219013455677 +1240 1269 -1489.660978254747 +1241 1269 -932.7375743471516 +1268 1269 -3608.532998071064 +1269 1269 18232.062575017 +1270 1269 -3148.504265639351 +1297 1269 -1611.223538982052 +1298 1269 -296.7629193015413 +1299 1269 -1800.073805562982 +1240 1270 -909.1430404315911 +1241 1270 -2133.4923292448 +1242 1270 -1029.61214513131 +1269 1270 -3246.840425607072 +1270 1270 20619.15005195552 +1271 1270 -2724.688812123779 +1298 1270 -1764.552147351345 +1299 1270 -1054.274157591402 +1300 1270 -1978.511607398624 +1241 1271 -1004.09487504479 +1242 1271 -2908.526517448344 +1243 1271 -1141.322191652097 +1270 1271 -2835.32188162351 +1271 1271 23358.33013591574 +1272 1271 -2021.221881515128 +1299 1271 -1937.632427898435 +1300 1271 -2044.979246772301 +1301 1271 -2156.642779728685 +1242 1272 -1114.8399798163 +1243 1272 -3785.338804266597 +1244 1272 -1260.947394571039 +1271 1272 -2140.595511478241 +1272 1272 26414.03932613324 +1273 1272 -1338.136792180863 +1300 1272 -2111.598212116827 +1301 1272 -3234.957943768897 +1302 1272 -2355.969163954072 +1243 1273 -1233.933955991808 +1244 1273 -4808.154526406122 +1245 1273 -1410.845054843713 +1272 1273 -1464.507194483326 +1273 1273 29957.60381235108 +1274 1273 -305.2508803541306 +1301 1273 -2307.377333410349 +1302 1273 -4695.951657967962 +1303 1273 -2568.93773068075 +1244 1274 -1383.654079552438 +1245 1274 -5950.717022529298 +1246 1274 -1562.473043907355 +1273 1274 -436.9435168876632 +1274 1274 33930.72445083187 +1275 1274 638.9713988562467 +1302 1274 -2517.44926379153 +1303 1274 -6390.06637892919 +1304 1274 -2797.052177334464 +1245 1275 -1536.753506263554 +1246 1275 -7223.506539408708 +1247 1275 -1757.063483850644 +1274 1275 510.4693661448714 +1275 1275 38441.42624953565 +1276 1275 1913.321812166962 +1303 1275 -2746.094983009617 +1304 1275 -8324.63825383634 +1305 1275 -3061.587942504654 +1246 1276 -1731.85983243506 +1247 1276 -8648.816240653741 +1248 1276 -1955.911150541477 +1275 1276 1783.904873182898 +1276 1276 43553.33360034256 +1277 1276 3125.378359368763 +1304 1276 -3009.65535627314 +1305 1276 -10528.90905036944 +1306 1276 -3341.627529176716 +1247 1277 -1932.759417786278 +1248 1277 -10223.53242694717 +1249 1277 -2205.805894413636 +1276 1277 3003.65558644493 +1277 1277 49329.05515065165 +1278 1277 4617.627413320569 +1305 1277 -3292.300326802089 +1306 1277 -12983.09745312012 +1307 1277 -3680.699536511731 +1248 1278 -2183.812299310237 +1249 1278 -11989.39339490486 +1250 1278 -2469.248640872036 +1277 1278 4499.661806769493 +1278 1278 55906.37907021938 +1279 1278 6105.504153025589 +1306 1278 -3632.510933712172 +1307 1278 -15744.03181743664 +1308 1278 -4045.523270519715 +1249 1279 -2449.428593465869 +1250 1279 -13935.82955094609 +1251 1279 -2786.398650789795 +1278 1279 5997.409851379705 +1279 1279 63293.79466251718 +1280 1279 7825.691358683142 +1307 1279 -4001.080384110856 +1308 1279 -18782.31360147919 +1309 1279 -4483.178467422056 +1250 1280 -2767.983051600789 +1251 1280 -16132.37923994808 +1252 1280 -3136.422825556828 +1279 1280 7723.872385709337 +1280 1280 71746.76354821002 +1281 1280 9641.530729096525 +1308 1280 -4441.098462647291 +1309 1280 -22197.74741194144 +1310 1280 -4972.044305862515 +1251 1281 -3120.015600070949 +1252 1281 -18553.14152582781 +1253 1281 -3535.335700893647 +1280 1281 9549.797795263512 +1281 1281 81190.83106252886 +1282 1281 11633.65252220944 +1309 1281 -4933.975863421971 +1310 1281 -25942.50935326016 +1311 1281 -5533.925390282434 +1252 1282 -3520.328842664753 +1253 1282 -21306.38518186538 +1254 1282 -4000.252324815418 +1281 1282 11548.99140054595 +1282 1282 92047.39552698935 +1283 1282 13877.01216168747 +1310 1282 -5498.676788707227 +1311 1282 -30176.1240785054 +1312 1282 -6193.311956894509 +1253 1283 -3986.961453425914 +1254 1283 -24340.02052025857 +1255 1283 -4498.824177717872 +1282 1283 13801.48874173363 +1283 1283 104119.6401446229 +1284 1283 16214.43555606029 +1311 1283 -6161.786510888272 +1312 1283 -34816.08365536351 +1313 1283 -6907.773666629852 +1254 1284 -4486.804898526309 +1255 1284 -27816.58270484803 +1256 1284 -5115.483308378782 +1283 1284 16145.74468795702 +1284 1284 118059.8735980548 +1285 1284 19033.59245540598 +1312 1284 -6879.042042569879 +1313 1284 -40103.83935454738 +1314 1284 -7794.707863166002 +1255 1285 -5104.863338626714 +1256 1285 -31642.93085739469 +1257 1285 -5735.763614590433 +1284 1285 18972.62127876879 +1285 1285 133492.2831718217 +1286 1285 21814.44826688521 +1313 1285 -7769.164402885981 +1314 1285 -45898.9425606849 +1315 1285 -8694.716278374677 +1256 1286 -5726.240995770283 +1257 1286 -36058.04766837318 +1258 1286 -6552.429893448746 +1285 1286 21759.58011889578 +1286 1286 151390.9663307688 +1287 1286 25411.7351541806 +1314 1286 -8671.700862798521 +1315 1286 -52556.77008465263 +1316 1286 -9881.702948390681 +139 1287 -7233.820615237819 +140 1287 29757.87447134833 +141 1287 -10665.28645818292 +1257 1287 -6544.015826774548 +1258 1287 -40901.52351914275 +1286 1287 25363.11639604548 +1287 1287 171085.6829087158 +1315 1287 -9861.288910215593 +1316 1287 -59833.6131372169 +96 1288 -972.1833471265185 +97 1288 -4199.05959075174 +98 1288 -518.8077673943594 +600 1288 -88.83922190567536 +601 1288 -712.420216415837 +602 1288 -163.7792916911596 +752 1288 -88.83929504375423 +753 1288 -712.4151208011145 +754 1288 -163.7769456553909 +1259 1288 930.7992103625031 +1260 1288 -550.2127535134149 +1288 1288 9108.608845085315 +1289 1288 -4404.188550979852 +1317 1288 1873.331084530464 +1318 1288 -1032.101481247851 +1259 1289 -547.9463916023759 +1260 1289 965.5300285542007 +1261 1289 -610.3365419550071 +1288 1289 -4412.588386069717 +1289 1289 9952.323073488704 +1290 1289 -4833.024586145051 +1317 1289 -1029.897550117558 +1318 1289 1996.478777706477 +1319 1289 -1150.184190613219 +1260 1290 -607.0753881998146 +1261 1290 1021.318987699041 +1262 1290 -688.1509575096296 +1289 1290 -4845.192490696518 +1290 1290 11244.4297469057 +1291 1290 -5391.217920456656 +1318 1290 -1146.972405824217 +1319 1290 2189.698236467377 +1320 1290 -1305.510067008343 +1261 1291 -683.7224247351767 +1262 1291 1059.820441053689 +1263 1291 -763.4728843743403 +1290 1291 -5407.880404303049 +1291 1291 12718.17089181078 +1292 1291 -5878.042575251216 +1319 1291 -1301.079250272378 +1320 1291 2384.418254840577 +1321 1291 -1458.303275621568 +1262 1292 -757.2464218301677 +1263 1292 1065.905862740121 +1264 1292 -853.7747011576424 +1291 1292 -5901.714584595692 +1292 1292 14375.97055931402 +1293 1292 -6447.223238772753 +1320 1292 -1451.951447489158 +1321 1292 2564.051791427603 +1322 1292 -1645.525722897277 +1263 1293 -845.4893833933197 +1264 1293 1030.410653496391 +1265 1293 -945.6226268569542 +1292 1293 -6479.129272446133 +1293 1293 16268.76581895919 +1294 1293 -6941.152100881316 +1321 1293 -1636.87068408432 +1322 1293 2722.112025263443 +1323 1293 -1839.505025309237 +1264 1294 -934.3451818063695 +1265 1294 927.6421821364183 +1266 1294 -1047.861257903248 +1293 1294 -6985.26482699467 +1294 1294 18394.58795716079 +1295 1294 -7427.136081667937 +1322 1294 -1827.382879043232 +1323 1294 2825.586236301244 +1324 1294 -2060.471229521719 +1265 1295 -1033.307151832742 +1266 1295 746.1234679096023 +1267 1295 -1156.897483827049 +1294 1295 -7485.149615060824 +1295 1295 20820.25671495814 +1296 1295 -7827.639269492482 +1323 1295 -2044.286138539696 +1324 1295 2862.732167466156 +1325 1295 -2300.228974005211 +1266 1296 -1137.932875917462 +1267 1296 448.3914206858223 +1268 1296 -1271.109395903149 +1295 1296 -7904.942720214171 +1296 1296 23547.49501676406 +1297 1296 -8077.603120155964 +1324 1296 -2278.286089754095 +1325 1296 2776.538872006693 +1326 1296 -2553.696842327017 +1267 1297 -1247.6438664658 +1268 1297 26.32836241308814 +1269 1297 -1398.233787117772 +1296 1297 -8175.782238627997 +1297 1297 26650.14314492718 +1298 1297 -8233.058521319188 +1325 1297 -2525.284069265153 +1326 1297 2551.604027973667 +1327 1297 -2839.425262986231 +1268 1298 -1369.290364301352 +1269 1298 -567.1388658073161 +1270 1298 -1527.84717350154 +1297 1298 -8357.813963717579 +1298 1298 30154.69245204621 +1299 1298 -8051.054311443781 +1326 1298 -2802.554619888732 +1327 1298 2102.071732462107 +1328 1298 -3120.576382476075 +1269 1299 -1493.855212227855 +1270 1299 -1325.929565819943 +1271 1299 -1676.00763204953 +1298 1299 -8202.51518001291 +1299 1299 34119.50850903988 +1300 1299 -7791.529881713881 +1327 1299 -3074.807022811869 +1328 1299 1419.345908386379 +1329 1299 -3446.427617336638 +1270 1300 -1636.639837548288 +1271 1300 -2303.868907424396 +1272 1300 -1831.058074221988 +1299 1300 -7973.36602885315 +1300 1300 38634.90499456588 +1301 1300 -6992.9316483701 +1328 1300 -3390.216340135362 +1329 1300 391.175179022882 +1330 1300 -3750.038491306793 +1271 1301 -1787.4014063285 +1272 1301 -3469.419011217816 +1273 1301 -2006.660336108071 +1300 1301 -7202.373984650829 +1301 1301 43703.72403742198 +1302 1301 -6195.625764320649 +1329 1301 -3683.816918159778 +1330 1301 -961.9836059002253 +1331 1301 -4106.738295892204 +1272 1302 -1959.272652895242 +1273 1302 -4887.523878999818 +1274 1302 -2206.809107602118 +1301 1302 -6431.940616139473 +1302 1302 49548.90795689948 +1303 1302 -4675.667941812842 +1330 1302 -4030.389636246604 +1331 1302 -2770.777672900413 +1332 1302 -4440.838645863229 +1273 1303 -2156.298209053453 +1274 1303 -6522.76712643347 +1275 1303 -2421.711498299492 +1302 1303 -4937.494287010508 +1303 1303 56119.08980707727 +1304 1303 -3252.256164657905 +1331 1303 -4354.519569079065 +1332 1303 -5005.48967612004 +1333 1303 -4820.53522588074 +1274 1304 -2371.450125554417 +1275 1304 -8382.559394692093 +1276 1304 -2682.679559251331 +1303 1304 -3522.586919773024 +1304 1304 63587.28623223602 +1305 1304 -1127.744626646348 +1332 1304 -4729.784674988534 +1333 1304 -7688.28780224479 +1334 1304 -5205.41538418492 +1275 1305 -2631.20665803321 +1276 1305 -10494.29734187302 +1277 1305 -2958.975348266173 +1304 1305 -1414.273208273403 +1305 1305 72042.55796092151 +1306 1305 942.0619907060875 +1333 1305 -5107.690988620312 +1334 1305 -10869.01019198402 +1335 1305 -5626.566977393026 +1276 1306 -2909.87559064325 +1277 1306 -12842.29535838458 +1278 1306 -3299.366218351395 +1305 1306 660.0717901050004 +1306 1306 81618.97266916464 +1307 1306 3587.543216385517 +1334 1306 -5529.075011487764 +1335 1306 -14505.85794362017 +1336 1306 -6096.71120305529 +1277 1307 -3251.22371519149 +1278 1307 -15480.55164729661 +1279 1307 -3664.664304613525 +1306 1307 3303.31328841506 +1307 1307 92514.84179674108 +1308 1307 6256.72970364711 +1335 1307 -5997.320601916519 +1336 1307 -18674.76606271653 +1337 1307 -6609.3162182467 +1278 1308 -3620.126043703353 +1279 1308 -18384.25730547986 +1280 1308 -4103.334240145077 +1307 1308 5987.408906900182 +1308 1308 104775.0359521401 +1309 1308 9367.060192881419 +1336 1308 -6514.249662986809 +1337 1308 -23307.90233246598 +1338 1308 -7207.56304388715 +1279 1309 -4061.055163386613 +1280 1309 -21648.83536599777 +1281 1309 -4591.177855099237 +1308 1309 9106.157584727131 +1309 1309 118793.2408152695 +1310 1309 12648.1869850162 +1337 1309 -7114.761916639081 +1338 1309 -28538.90408718346 +1339 1309 -7879.404559126277 +1280 1310 -4552.848121098483 +1281 1310 -25230.9730860775 +1282 1310 -5149.475169987194 +1309 1310 12407.60037325242 +1310 1310 134471.5099471003 +1311 1310 16232.00272497594 +1338 1310 -7793.300713636628 +1339 1310 -34274.05506424676 +1340 1310 -8653.315331226404 +1281 1311 -5113.923476576279 +1282 1311 -29283.56431878005 +1283 1311 -5801.608910077933 +1310 1311 16005.7082521583 +1311 1311 152484.5274784867 +1312 1311 20233.81989143268 +1339 1311 -8571.927490205029 +1340 1311 -40736.9065649884 +1341 1311 -9563.873244731196 +1282 1312 -5769.768127281645 +1283 1312 -33728.9380967874 +1284 1312 -6504.98780254114 +1311 1312 20028.81523245142 +1312 1312 172524.3703011085 +1313 1312 24372.87712795932 +1340 1312 -9489.853504155248 +1341 1312 -47790.49113406405 +1342 1312 -10562.48294171251 +1283 1313 -6475.936498707893 +1284 1313 -38798.92608087576 +1285 1313 -7374.702945728979 +1312 1313 24184.09871371334 +1313 1313 195656.1910616514 +1314 1313 29309.16531781372 +1341 1313 -10494.11125162925 +1342 1313 -55782.47727341234 +1343 1313 -11803.54274136677 +1284 1314 -7348.852347246102 +1285 1314 -44359.27331374047 +1286 1314 -8254.22016318476 +1313 1314 29139.93503659104 +1314 1314 221268.6096403582 +1315 1314 34148.15769851239 +1342 1314 -11742.10149637443 +1343 1314 -64498.9858823719 +1344 1314 -13078.89370956999 +1285 1315 -8230.911638913853 +1286 1315 -50751.64273300816 +1287 1315 -9410.696134681883 +1314 1315 33994.66544477929 +1315 1315 250967.1997496662 +1316 1315 40340.89489100422 +1343 1315 -13023.05975588424 +1344 1315 -74457.15877318069 +1345 1315 -14761.07533827729 +140 1316 -10261.01529894859 +141 1316 48922.22577380321 +142 1316 -15393.48770851103 +1286 1316 -9390.01061439906 +1287 1316 -57740.93413323708 +1315 1316 40204.03449657254 +1316 1316 283604.8504371349 +1344 1316 -14711.21650228895 +1345 1316 -85285.02020295632 +95 1317 -1675.86691393707 +96 1317 -7256.29178170866 +97 1317 -870.0923135011668 +601 1317 -147.7263316580357 +602 1317 -1223.658562154786 +603 1317 -281.2929512224775 +753 1317 -147.7248218854447 +754 1317 -1223.637724217583 +755 1317 -281.2865998458112 +1288 1317 1675.086259946833 +1289 1317 -922.3493487140995 +1317 1317 15406.62454783908 +1318 1317 -7649.239711322123 +1346 1317 3339.403523694652 +1347 1317 -1778.500193724166 +1288 1318 -920.368793058391 +1289 1318 1780.979443028562 +1290 1318 -1025.243580730684 +1317 1318 -7657.762305927468 +1318 1318 16820.62444301055 +1319 1318 -8458.750815150714 +1346 1318 -1776.531005547833 +1347 1318 3598.449395918846 +1348 1318 -1983.701789466583 +1289 1319 -1022.353370828648 +1290 1319 1946.54862991155 +1291 1319 -1160.01190252721 +1318 1319 -8471.236312070758 +1319 1319 19005.45358164798 +1320 1319 -9523.434544503147 +1347 1319 -1980.806815376791 +1348 1319 4003.41723681306 +1349 1319 -2255.326400000338 +1290 1320 -1156.017878748572 +1291 1320 2110.009563734013 +1292 1320 -1290.803713983089 +1319 1320 -9540.773698758487 +1320 1320 21498.05460297648 +1321 1320 -10509.57588506828 +1348 1320 -2251.28830348293 +1349 1320 4440.211934983128 +1350 1320 -2523.077756071473 +1291 1321 -1285.06585659863 +1292 1321 2255.108698748604 +1293 1321 -1449.769478640625 +1320 1321 -10534.64048504593 +1321 1321 24301.42423310939 +1322 1321 -11697.6038935679 +1349 1321 -2517.208476991236 +1350 1321 4892.051917212994 +1351 1321 -2853.946452330861 +1292 1322 -1441.930465707924 +1293 1322 2374.452487731975 +1294 1322 -1611.857089245644 +1321 1322 -11732.11445307707 +1322 1322 27505.8524802578 +1323 1322 -12830.88623283423 +1350 1322 -2845.810418733241 +1351 1322 5360.205771325906 +1352 1322 -3198.433767633435 +1293 1323 -1600.842577296315 +1294 1323 2436.47183269707 +1295 1323 -1794.088586075475 +1322 1323 -12879.84852430691 +1323 1323 31100.42630604796 +1324 1323 -14046.29156052002 +1351 1323 -3186.794865487675 +1352 1323 5806.87070174117 +1353 1323 -3594.956256445362 +1294 1324 -1779.325208869454 +1295 1324 2428.203818650115 +1296 1324 -1988.721952227012 +1323 1324 -14112.70967534439 +1324 1324 35212.73688848817 +1325 1324 -15226.5648260609 +1352 1324 -3579.009150150159 +1353 1324 6228.880045419439 +1354 1324 -4029.421809836586 +1295 1325 -1968.613939710678 +1296 1325 2296.399762324771 +1297 1325 -2191.059095274968 +1324 1325 -15318.36325227177 +1325 1325 39822.41904852874 +1326 1325 -16271.15610290852 +1353 1325 -4007.116650867004 +1354 1325 6553.677294800497 +1355 1325 -4493.504577191528 +1296 1326 -2164.880825541569 +1297 1326 2024.218890370213 +1298 1326 -2416.890378907922 +1325 1326 -16392.80735891257 +1326 1326 45090.30345535428 +1327 1326 -17290.59466558859 +1354 1326 -4463.529643176233 +1355 1326 6770.399152853273 +1356 1326 -5025.847291047992 +1297 1327 -2382.707490647439 +1298 1327 1533.572194014974 +1299 1327 -2636.408772079278 +1326 1327 -17452.83844803897 +1327 1327 51007.71009560193 +1328 1327 -17836.36419467888 +1355 1327 -4985.223871033122 +1356 1327 6755.428745860689 +1357 1327 -5551.319963362796 +1298 1328 -2593.67761414897 +1299 1328 814.0712206917218 +1300 1328 -2891.367166954484 +1327 1328 -18044.27623102837 +1328 1328 57744.68177057402 +1329 1328 -18369.65975705506 +1356 1328 -5498.315111259129 +1357 1328 6492.672672570114 +1358 1328 -6177.877657359651 +1299 1329 -2838.482587862605 +1300 1329 -233.6532686251649 +1301 1329 -3131.61935589153 +1328 1329 -18634.4017712813 +1329 1329 65355.9880990273 +1330 1329 -17984.45684678161 +1357 1329 -6109.043513300814 +1358 1329 5795.821867421967 +1359 1329 -6748.835825779703 +1300 1330 -3068.802362402554 +1301 1330 -1592.445389432037 +1302 1330 -3417.466383217856 +1329 1330 -18309.13283875764 +1330 1330 73964.11553861246 +1331 1330 -17651.39850573461 +1358 1330 -6662.634834983953 +1359 1330 4662.871855135159 +1360 1330 -7450.082738241048 +1301 1331 -3344.42173436427 +1302 1331 -3376.899852988862 +1303 1331 -3699.845504611326 +1330 1331 -18042.33252302149 +1331 1331 83812.91700392515 +1332 1331 -15922.65156568248 +1359 1331 -7344.037412551369 +1360 1331 2852.423935058801 +1361 1331 -8057.429474466413 +1302 1332 -3616.539927232478 +1303 1332 -5559.264311190236 +1304 1332 -4024.766343297729 +1331 1332 -16385.46778815628 +1332 1332 94919.96269352674 +1333 1332 -14303.32849331306 +1360 1332 -7929.150342423198 +1361 1332 348.0082483941369 +1362 1332 -8787.815240920712 +1303 1333 -3936.438055275324 +1304 1333 -8156.819638318888 +1305 1333 -4378.995725580677 +1332 1333 -14813.16038591868 +1333 1333 107544.5219547358 +1334 1333 -11190.3724807257 +1361 1333 -8643.565689024475 +1362 1333 -2945.594304942514 +1363 1333 -9439.806846837833 +1304 1334 -4283.109237260849 +1305 1334 -11213.65715720225 +1306 1334 -4771.635054514489 +1333 1334 -11765.30572670956 +1334 1334 121819.3345830047 +1335 1334 -8033.998086995582 +1362 1334 -9273.998015593625 +1363 1334 -7155.412417675778 +1364 1334 -10175.97537100244 +1305 1335 -4675.257682141537 +1306 1335 -14693.82482710062 +1307 1335 -5232.436755091941 +1334 1335 -8633.582252458535 +1335 1335 138028.3324804324 +1336 1335 -3590.895839397734 +1363 1335 -10000.04813516138 +1364 1335 -12244.24480009835 +1365 1335 -10900.7309774314 +1306 1336 -5133.516890648112 +1307 1336 -18667.13353718127 +1308 1336 -5739.130252696194 +1335 1336 -4227.941231550349 +1336 1336 156449.2220705489 +1337 1336 1044.332317944344 +1364 1336 -10710.97185666877 +1365 1336 -18347.74507728842 +1366 1336 -11690.54444507878 +1307 1337 -5643.947934367441 +1308 1337 -23075.88812865857 +1309 1337 -6341.083418265274 +1336 1337 411.6749871242237 +1337 1337 177232.8461001659 +1338 1337 6649.669462292915 +1365 1337 -11499.64758009157 +1366 1337 -25342.39888488845 +1367 1337 -12546.29689075892 +1308 1338 -6247.690156073539 +1309 1338 -28046.38509253134 +1310 1338 -7017.867965356015 +1337 1338 6011.226281611012 +1338 1338 200975.0786720161 +1339 1338 12658.51801938887 +1366 1338 -12351.57287877764 +1367 1338 -33415.04152344027 +1368 1338 -13494.48189347534 +1309 1339 -6930.8352098114 +1310 1339 -33496.30919382224 +1311 1339 -7796.897033725522 +1338 1339 12048.81814809573 +1339 1339 227580.6713406857 +1340 1339 19281.81034984853 +1367 1339 -13306.87516213634 +1368 1339 -42375.36700169105 +1369 1339 -14568.83083112483 +1310 1340 -7714.330926388022 +1311 1340 -39638.54173016831 +1312 1340 -8710.049832036108 +1339 1340 18691.2225511947 +1340 1340 258126.6684290408 +1341 1340 26680.77487251146 +1368 1340 -14385.80447153248 +1369 1340 -52530.75856193583 +1370 1340 -15819.37044672843 +1311 1341 -8634.732290906633 +1312 1341 -46347.56990137111 +1313 1341 -9705.289930106168 +1340 1341 26132.51921334524 +1341 1341 292146.1785296714 +1342 1341 34312.20278352799 +1369 1341 -15648.4889141633 +1370 1341 -63626.46455416116 +1371 1341 -17210.18369140946 +1312 1342 -9635.548963596648 +1313 1342 -53955.34152060206 +1314 1342 -10935.60106253273 +1341 1342 33797.14798983073 +1342 1342 331394.1845879734 +1343 1342 43331.0004925761 +1370 1342 -17048.92124413592 +1371 1342 -76159.27469228514 +1372 1342 -18929.24521409781 +1313 1343 -10872.80502187229 +1314 1343 -62260.46999202542 +1315 1343 -12192.4076077694 +1342 1343 42861.71173782499 +1343 1343 374871.2603841251 +1344 1343 52120.21995562874 +1371 1343 -18781.78447015661 +1372 1343 -89774.82989097088 +1373 1343 -20734.07070404544 +1314 1344 -12135.25187935942 +1315 1344 -71757.50080414963 +1316 1344 -13841.96176993163 +1343 1344 51688.97463761113 +1344 1344 425267.1192820855 +1345 1344 63227.11226445888 +1372 1344 -20598.18230818685 +1373 1344 -105232.2960891113 +1374 1344 -23108.55869690292 +141 1345 -14725.746449149 +142 1345 81723.09953167698 +143 1345 -22565.81424380461 +1315 1345 -13790.85785150901 +1316 1345 -82088.67526340937 +1344 1345 62838.54560029939 +1345 1345 480534.4290705342 +1373 1345 -22985.8477006135 +1374 1345 -121929.5549415527 +94 1346 -2942.12919032545 +95 1346 -12694.35904296498 +96 1346 -1488.729522549545 +602 1346 -251.1349582461878 +603 1346 -2131.488974480657 +604 1346 -492.5374932841329 +754 1346 -251.130233698547 +755 1346 -2131.434068565797 +756 1346 -492.5218792553979 +1317 1346 2966.793609158369 +1318 1346 -1578.405282980656 +1346 1346 26615.94918476055 +1347 1346 -13421.77390436913 +1375 1346 5961.962976035638 +1376 1346 -3122.221852211701 +1317 1347 -1576.682906101888 +1318 1347 3193.069625076347 +1319 1347 -1757.656475478589 +1346 1347 -13430.39055369922 +1347 1347 29044.83764988479 +1348 1347 -14910.10792258039 +1375 1347 -3120.449677547069 +1376 1347 6461.072608420571 +1377 1347 -3485.031002158465 +1318 1348 -1755.121641596246 +1319 1348 3546.051576374664 +1320 1348 -1994.262578338533 +1347 1348 -14922.81705352914 +1348 1348 32818.05376099732 +1349 1348 -16880.1907105069 +1376 1348 -3482.411876420189 +1377 1348 7241.161296636453 +1378 1348 -3967.101487343873 +1319 1349 -1990.722048619086 +1320 1349 3923.891750643396 +1321 1349 -2225.358477294754 +1348 1349 -16897.99203086158 +1349 1349 37123.22940637793 +1350 1349 -18764.28386412702 +1377 1349 -3963.423613269238 +1378 1349 8106.741880323736 +1379 1349 -4443.638768819638 +1320 1350 -2220.20364884972 +1321 1350 4310.147112637295 +1322 1350 -2509.283854131329 +1349 1350 -18790.29400370485 +1350 1350 41964.28827887344 +1351 1350 -21073.03936505866 +1378 1350 -4438.247673689435 +1379 1350 9041.381492882603 +1380 1350 -5035.812641419976 +1321 1351 -2502.122955816109 +1322 1351 4704.062692296402 +1323 1351 -2801.377064604708 +1350 1351 -21109.33492264966 +1351 1351 47501.55443483108 +1352 1351 -23381.30236141701 +1379 1351 -5028.259425871045 +1380 1351 10062.23519800161 +1381 1351 -5655.488211039431 +1322 1352 -2791.105941839572 +1323 1352 5069.552484348917 +1324 1352 -3134.039685120716 +1351 1352 -23433.65897680553 +1352 1352 53707.53513309475 +1353 1352 -25962.5511604756 +1380 1352 -5644.538016858698 +1381 1352 11126.51607073286 +1382 1352 -6374.484834691757 +1323 1353 -3119.920423616731 +1324 1353 5400.354355371249 +1325 1353 -3493.413365495144 +1352 1353 -26035.03960337181 +1353 1353 60819.5246980567 +1354 1353 -28647.95524952785 +1381 1353 -6359.229952713045 +1382 1353 12253.61462057314 +1383 1353 -7169.24544884135 +1324 1354 -3473.585413198063 +1325 1354 5628.528787446867 +1326 1354 -3870.664181114164 +1353 1354 -28750.66401118817 +1354 1354 68774.22548102218 +1355 1354 -31300.62664639565 +1382 1354 -7147.466244107698 +1383 1354 13354.65624805552 +1384 1354 -8027.289311009063 +1325 1355 -3843.888327355432 +1326 1355 5738.840766922416 +1327 1355 -4297.467202788212 +1354 1355 -31440.86989153314 +1355 1355 77895.59388568549 +1356 1355 -34166.1975695943 +1383 1355 -7997.275976489274 +1384 1355 14445.84683892711 +1385 1355 -9026.12898176329 +1326 1356 -4260.967992615477 +1327 1356 5617.940716945645 +1328 1356 -4708.72708367503 +1355 1356 -34359.98626003347 +1356 1356 88097.51882347121 +1357 1356 -36466.98294482291 +1384 1356 -8984.197915850418 +1385 1356 15362.88467266341 +1386 1356 -10024.14107933144 +1327 1357 -4660.776671105859 +1328 1357 5243.991393400232 +1329 1357 -5195.128855385778 +1356 1357 -36725.82009731203 +1357 1357 99777.08680772825 +1358 1357 -39078.83005199389 +1385 1357 -9967.405408818906 +1386 1357 16112.46316001673 +1387 1357 -11242.37565740249 +1328 1358 -5132.365500724056 +1329 1358 4450.397965500028 +1330 1358 -5628.113069383769 +1357 1358 -39424.41431946931 +1358 1358 112878.888452834 +1359 1358 -40311.9173707775 +1386 1358 -11165.4874200325 +1387 1358 16418.95252137043 +1388 1358 -12361.01874179558 +1329 1359 -5548.809548328546 +1330 1359 3227.543040497214 +1331 1359 -6161.962804482959 +1358 1359 -40758.92408948747 +1359 1359 127810.52897423 +1360 1359 -41962.10895641357 +1387 1359 -12259.87756729282 +1388 1359 16282.89194823496 +1389 1359 -13784.85212321536 +1330 1360 -6063.437174644034 +1331 1360 1363.977804849287 +1332 1360 -6624.345707597226 +1359 1360 -42532.70144796715 +1360 1360 144749.3496091834 +1361 1360 -41200.12104161541 +1388 1360 -13653.34351748002 +1389 1360 15303.28574869119 +1390 1360 -15000.78054734148 +1331 1361 -6503.881051629237 +1332 1361 -1158.4055058662 +1333 1361 -7188.574047354463 +1360 1361 -41919.65764000089 +1361 1361 163927.6774175867 +1362 1361 -40781.36064608382 +1389 1361 -14831.61824144515 +1390 1361 13392.8554258153 +1391 1361 -16534.61436197606 +1332 1362 -7051.595870916447 +1333 1362 -4417.118298118804 +1334 1362 -7716.51189783612 +1361 1362 -41627.68607356496 +1362 1362 185694.078367666 +1363 1362 -37429.27151714459 +1390 1362 -16331.5498177298 +1391 1362 10292.27425898724 +1392 1362 -17833.61243325393 +1333 1363 -7557.271173243869 +1334 1363 -8522.744799500921 +1335 1363 -8327.240854500917 +1362 1363 -38449.4000969553 +1363 1363 210266.0885181538 +1364 1363 -33864.3092419924 +1391 1363 -17583.82680427985 +1392 1363 5689.441266266917 +1393 1363 -19351.82006883425 +1334 1364 -8156.382568381444 +1335 1364 -13439.60831546085 +1336 1364 -8974.098491429417 +1363 1364 -35000.84889654074 +1364 1364 238217.0974963765 +1365 1364 -27470.46536492804 +1392 1364 -19068.02663108529 +1393 1364 -484.6965894493433 +1394 1364 -20710.2839626919 +1335 1365 -8787.821478779899 +1336 1365 -19285.05905924931 +1337 1365 -9700.482890160267 +1364 1365 -28757.36428896714 +1365 1365 269921.4088686957 +1366 1365 -20357.84757739446 +1393 1365 -20383.04561149077 +1394 1365 -8567.81948893578 +1395 1365 -22182.6140278943 +1336 1366 -9511.202864002589 +1337 1366 -25951.22047642512 +1338 1366 -10530.66988074872 +1365 1366 -21714.75789586337 +1366 1366 305804.053937478 +1367 1366 -10929.74755658022 +1394 1366 -21831.87031426349 +1395 1366 -18437.43944649939 +1396 1366 -23615.20409680995 +1337 1367 -10335.83216697319 +1338 1367 -33608.18591788154 +1339 1367 -11471.13714617498 +1366 1367 -12376.17913626573 +1367 1367 346734.8816918978 +1368 1367 -352.438732640333 +1395 1367 -23235.94660349413 +1396 1367 -30440.81612007967 +1397 1367 -25130.27678589873 +1338 1368 -11281.8981235103 +1339 1368 -42090.96444664217 +1340 1368 -12555.28161297796 +1367 1368 -1803.271930128239 +1368 1368 392742.7558096635 +1369 1368 11738.38772156667 +1396 1368 -24745.22685800199 +1397 1368 -44249.92902135639 +1398 1368 -26745.40579305823 +1339 1369 -12369.36504467169 +1340 1369 -51688.26262887179 +1341 1369 -13827.19143383421 +1368 1369 10271.38678920815 +1369 1369 445512.5718046146 +1370 1369 25542.07039690608 +1397 1369 -26352.14551077747 +1398 1369 -60315.61045263443 +1399 1369 -28525.96166772228 +1340 1370 -13652.57036508928 +1341 1370 -62173.69765626121 +1342 1370 -15236.55090881065 +1369 1370 24128.9771784223 +1370 1370 504408.3910607335 +1371 1370 39925.6129916201 +1398 1370 -28144.05420569648 +1399 1370 -78143.01080229558 +1400 1370 -30506.74825549318 +1341 1371 -15070.93254909652 +1342 1371 -74018.49057992057 +1343 1371 -16974.8650047277 +1370 1371 38556.10558254647 +1371 1371 572309.5394996388 +1372 1371 56961.67371477788 +1399 1371 -30134.20632771392 +1400 1371 -98435.20261542899 +1401 1371 -32867.65239672938 +1342 1372 -16822.79182909277 +1343 1372 -86897.02659306162 +1344 1372 -18783.52114830797 +1371 1372 55681.03732927595 +1372 1372 647612.5249347949 +1373 1372 73544.3951391904 +1400 1372 -32517.48750748938 +1401 1372 -120539.5108206338 +1402 1372 -35423.26122847739 +1343 1373 -18642.90721133951 +1344 1373 -101531.6335343285 +1345 1373 -21148.94052306069 +1372 1373 72342.23703549418 +1373 1373 734857.6527677835 +1374 1373 94299.92217918093 +1401 1373 -35093.22714488588 +1402 1373 -145565.5255304847 +1403 1373 -38724.68294665217 +142 1374 -21447.28904536278 +143 1374 137777.2352921392 +144 1374 -33571.83688374718 +1344 1374 -21021.61303281405 +1345 1374 -117344.1512653766 +1373 1374 93197.76328097048 +1374 1374 830207.3801176118 +1402 1374 -38421.147250508 +1403 1374 -172459.1162321887 +5 1375 -5224.718131066844 +59 1375 -873.1021951444843 +65 1375 -873.1354592970807 +94 1375 -22498.38509366903 +95 1375 -2594.522359093507 +250 1375 10812.34281918423 +251 1375 -5537.899303472945 +603 1375 -435.6946837900141 +604 1375 -3766.753408065286 +755 1375 -435.682548852838 +756 1375 -3766.626231360439 +1027 1375 1785.683677129465 +1032 1375 -926.3830400352168 +1346 1375 5259.374420075344 +1347 1375 -2751.727012421262 +1375 1375 46826.68978714328 +1376 1375 -23828.07944674456 +250 1376 -5538.767969604662 +251 1376 11783.85154339844 +252 1376 -6174.810722777298 +1027 1376 -926.1425270014112 +1032 1376 1940.712955419186 +1037 1376 -1034.101523180659 +1346 1376 -2750.221017942185 +1347 1376 5696.072536184372 +1348 1376 -3068.420656744648 +1375 1376 -23836.76789111628 +1376 1376 51082.09809106506 +1377 1376 -26539.28120068251 +251 1377 -6176.100620940619 +252 1377 13299.77393882544 +253 1377 -7022.0073140915 +1032 1377 -1033.745267949268 +1037 1377 2182.969109126831 +1042 1377 -1177.439637250612 +1347 1377 -3066.193170396663 +1348 1377 6377.751450147654 +1349 1377 -3488.48114416947 +1376 1377 -26552.14496565903 +1377 1377 57713.22212310883 +1378 1377 -30141.3432712053 +252 1378 -7023.829584302553 +253 1378 15023.27562901621 +254 1378 -7852.394143785786 +1037 1378 -1176.937941135598 +1042 1378 2455.26980229362 +1047 1378 -1319.069154437347 +1348 1378 -3485.350090354845 +1349 1378 7131.493942137307 +1350 1378 -3901.308909766461 +1377 1378 -30159.44827672066 +1378 1378 65277.29356515363 +1379 1378 -33646.06694451127 +253 1379 -7855.085783042045 +254 1379 16951.18037589799 +255 1379 -8883.298233689005 +1042 1379 -1318.331092659321 +1047 1379 2754.896327764959 +1052 1379 -1495.378534937594 +1349 1379 -3896.71352524472 +1350 1379 7941.221990062275 +1351 1379 -4412.398640246738 +1378 1379 -33672.68259884613 +1379 1379 73778.30740815229 +1380 1379 -37981.67654766021 +254 1380 -8887.106191089406 +255 1380 19145.00244943867 +256 1380 -9950.519613984181 +1047 1380 -1494.339715134113 +1052 1380 3089.513354413996 +1057 1380 -1679.876977418418 +1350 1380 -4405.949906248564 +1351 1380 8820.018921461637 +1352 1380 -4943.002995134131 +1379 1380 -38019.10406087024 +1380 1380 83500.83969321699 +1381 1380 -42424.41774580828 +255 1381 -9956.108370013968 +256 1381 21581.68927072932 +257 1381 -11181.05510785345 +1052 1381 -1678.36221984086 +1057 1381 3450.656507322495 +1062 1381 -1894.334075844927 +1351 1381 -4933.635084385947 +1352 1381 9727.369563871986 +1353 1381 -5554.175649600515 +1380 1381 -42478.93116410761 +1381 1381 94383.96763847767 +1382 1381 -47502.97723187973 +256 1382 -11188.96243803221 +257 1382 24353.83870563989 +258 1382 -12524.27173582572 +1057 1382 -1892.208423832177 +1062 1382 3848.829388460412 +1067 1382 -2131.6664403628 +1352 1382 -5541.091890484692 +1353 1382 10676.22533349344 +1354 1382 -6222.918383099565 +1381 1382 -47579.36871658773 +1382 1382 106859.4777596192 +1383 1382 -52971.22891650823 +257 1383 -12535.78226312696 +258 1383 27407.96188819755 +259 1383 -13947.37119469904 +1062 1383 -2128.603944832932 +1067 1383 4265.553973767645 +1072 1383 -2388.158348645816 +1353 1383 -6204.179673788163 +1354 1383 11583.79043918072 +1355 1383 -6935.421353840877 +1382 1383 -53081.10032423575 +1383 1383 120777.9126719486 +1384 1383 -58651.99959454327 +258 1384 -13963.62280766266 +259 1384 30875.40079101978 +260 1384 -15583.97351402426 +1067 1384 -2383.890002979492 +1072 1384 4713.711439094537 +1077 1384 -2687.847183417895 +1354 1384 -6909.496575250008 +1355 1384 12456.55166527666 +1356 1384 -7755.197177501033 +1383 1384 -58804.81547494492 +1384 1384 136754.6870627016 +1385 1384 -65074.68417281891 +259 1385 -15607.36979450814 +260 1385 34660.3452184901 +261 1385 -17142.69618938438 +1072 1385 -2681.800366139165 +1077 1385 5158.148161824082 +1082 1385 -2986.704098430481 +1355 1385 -7718.80354799926 +1356 1385 13143.74653364134 +1357 1385 -8556.399687570109 +1384 1385 -65290.64032550708 +1385 1385 154540.3144911578 +1386 1385 -70923.24514175873 +260 1386 -17175.54208313613 +261 1386 38938.06375530903 +262 1386 -19035.60015003445 +1077 1386 -2978.382096877103 +1082 1386 5612.725473892131 +1087 1386 -3354.730221585148 +1356 1386 -8506.867751934524 +1357 1386 13638.11297297624 +1358 1386 -9524.04796869534 +1385 1386 -71219.60452397447 +1386 1386 174949.1195557021 +1387 1386 -77905.12687766735 +261 1387 -19082.15005437451 +262 1387 43562.71307592563 +263 1387 -20580.98386561039 +1082 1387 -3343.219270307373 +1087 1387 6016.365743536182 +1092 1387 -3689.158079925135 +1357 1387 -9456.450353984706 +1358 1387 13691.43712171714 +1359 1387 -10384.02963176717 +1386 1387 -78313.71903458444 +1387 1387 197661.276004042 +1388 1387 -82997.67774108989 +262 1388 -20645.59658580092 +263 1388 48752.58516543525 +264 1388 -22589.56690222487 +1087 1388 -3673.644078389853 +1092 1388 6382.371590540972 +1097 1388 -4122.783128090397 +1358 1388 -10294.36997339002 +1359 1388 13285.18345322662 +1360 1388 -11474.15944308102 +1387 1388 -83546.40831038605 +1388 1388 223645.3077445003 +1389 1388 -89618.73903440053 +263 1389 -22679.0756708667 +264 1389 54361.59598344784 +265 1389 -23864.46066851989 +1092 1389 -4102.033181662452 +1097 1389 6619.378149568204 +1102 1389 -4481.60115563701 +1359 1389 -11356.4548527216 +1360 1389 12064.53892829986 +1361 1389 -12371.22026136757 +1388 1389 -90349.96508225956 +1389 1389 252800.1704485824 +1390 1389 -92496.74729219385 +264 1390 -23988.46384985169 +265 1390 60539.13296973972 +266 1390 -25592.77542121288 +1097 1390 -4454.028550490156 +1102 1390 6712.04012487434 +1107 1390 -4948.687404342958 +1360 1390 -12218.13645496038 +1361 1390 9935.009734443731 +1362 1390 -13509.58198460521 +1389 1390 -93464.92025795122 +1390 1390 285810.8843991673 +1391 1390 -96757.37655243932 +265 1391 -25754.63312518882 +266 1391 67282.19333156505 +267 1391 -26295.87340782887 +1102 1391 -4914.37956679228 +1107 1391 6591.921937961152 +1112 1391 -5320.497380095157 +1361 1391 -13323.5673323209 +1362 1391 6673.834572263832 +1363 1391 -14460.6353648296 +1390 1391 -97958.35370577122 +1391 1391 323031.7070627809 +1392 1391 -95964.91265538834 +266 1392 -26514.328462895 +267 1392 74593.09390560596 +268 1392 -27127.32518249592 +1107 1392 -5276.631124485892 +1112 1392 6176.72713063112 +1117 1392 -5766.376087782721 +1362 1392 -14228.78695830483 +1363 1392 2001.995010960476 +1364 1392 -15590.69415613515 +1391 1392 -97497.24700399497 +1392 1392 364767.3050776162 +1393 1392 -95179.73736611995 +267 1393 -27401.73099991903 +268 1393 82682.45766200231 +269 1393 -26808.70297261603 +1112 1393 -5714.478243505382 +1117 1393 5435.529088786902 +1122 1393 -6125.752841319988 +1363 1393 -15323.58765087738 +1364 1393 -4135.683541705693 +1365 1393 -16637.211093126 +1392 1393 -96991.42811429829 +1393 1393 412025.8774816411 +1394 1393 -88940.20793682605 +268 1394 -27160.2668574012 +269 1394 91555.43491401071 +270 1394 -26186.58586499239 +1117 1394 -6063.418622292575 +1122 1394 4266.087947273994 +1127 1394 -6510.879469266785 +1364 1394 -16324.79229560112 +1365 1394 -12026.84746273808 +1366 1394 -17813.2717134852 +1393 1394 -91118.96435313032 +1394 1394 465169.9570130204 +1395 1394 -81114.30199359602 +269 1395 -26606.21602314855 +270 1395 101496.1742499146 +271 1395 -24426.82268281945 +1122 1395 -6441.362976924444 +1127 1395 2678.514791207621 +1132 1395 -6832.897316182674 +1365 1395 -17473.61660170098 +1366 1395 -21559.03972290373 +1367 1395 -19040.34280386667 +1394 1395 -83552.69639379789 +1395 1395 525161.7871151421 +1396 1395 -68218.11097984237 +270 1396 -24931.50962016492 +271 1396 112641.2693563294 +272 1396 -21976.76209049615 +1127 1396 -6754.893631305451 +1132 1396 573.2976989544804 +1137 1396 -7144.526073213753 +1366 1396 -18667.99428508451 +1367 1396 -33028.98491892846 +1368 1396 -20407.89346045427 +1395 1396 -70970.49144832494 +1396 1396 593059.1813950909 +1397 1396 -52401.99218639756 +271 1397 -22544.41788970378 +272 1397 125250.5834660574 +273 1397 -18622.76890912998 +1132 1397 -7062.646893631801 +1137 1397 -1980.411256851597 +1142 1397 -7433.199060097069 +1367 1397 -20024.93175203021 +1368 1397 -46150.06970350644 +1369 1397 -21947.85396804175 +1396 1397 -55314.99666125563 +1397 1397 669350.0023353146 +1398 1397 -32840.86639433249 +272 1398 -19260.64011617309 +273 1398 139684.451535833 +274 1398 -14293.57866035823 +1137 1398 -7347.131292926967 +1142 1398 -5082.565037211032 +1147 1398 -7705.791075160689 +1368 1398 -21552.06703626596 +1369 1398 -61327.59114615621 +1370 1398 -23721.67595747369 +1397 1398 -35934.06915530987 +1398 1398 756405.3339641873 +1399 1398 -9219.115378048456 +273 1399 -14969.34402756611 +274 1399 156019.5289249406 +275 1399 -9497.327041821092 +1142 1399 -7620.170988040543 +1147 1399 -8610.907546654413 +1152 1399 -8001.4829677322 +1369 1399 -23333.21808988387 +1370 1399 -78130.3062692439 +1371 1399 -25724.06120648592 +1398 1399 -12331.81190351874 +1399 1399 853678.8754494864 +1400 1399 16136.16584078745 +274 1400 -10209.34117954917 +275 1400 174954.2705912106 +276 1400 -3476.158265551519 +1147 1400 -7916.323631016618 +1152 1400 -12694.91794817731 +1157 1400 -8312.868211031853 +1370 1400 -25341.60741750541 +1371 1400 -97214.08373116177 +1372 1400 -28158.50375661198 +1399 1400 13002.30425469074 +1400 1400 965570.0332700649 +1401 1400 46971.42030941919 +275 1401 -4191.806856425257 +276 1401 196224.7464705771 +277 1401 2468.640517040818 +1152 1401 -8231.589361645954 +1157 1401 -17175.03876878362 +1162 1401 -8678.178274683796 +1371 1401 -27796.15549942483 +1372 1401 -117997.1346814918 +1373 1401 -30770.84033224982 +1400 1401 43943.52263145889 +1401 1401 1089864.820901506 +1402 1401 77191.28291160564 +276 1402 1754.565469479305 +277 1402 221026.3898202113 +278 1402 9992.794486421 +1157 1402 -8600.667234192431 +1162 1402 -22249.96190556468 +1167 1402 -9127.761202493508 +1372 1402 -30427.03387681077 +1373 1402 -141528.2045742994 +1374 1402 -34150.83722127186 +1401 1402 74269.6996249572 +1402 1402 1233816.756360284 +1403 1402 115164.0289513236 +14 1403 36882.07308422966 +143 1403 -31652.93731902628 +144 1403 220731.0604619099 +145 1403 -6151.107326156354 +277 1403 9303.855624715783 +278 1403 247965.0726433331 +435 1403 -6151.895142139583 +1162 1403 -9055.837334198384 +1167 1403 -27697.4808462968 +1373 1403 -33832.8723183727 +1374 1403 -166793.2941695731 +1402 1403 112423.4877328346 +1403 1403 1390406.864068521 +8 1404 -88.48956188041012 +34 1404 -15.78142438842748 +40 1404 -15.78252760859273 +92 1404 -138.4725932895936 +93 1404 -446.1090085416404 +163 1404 -57.6788430679649 +164 1404 -97.4086956433282 +629 1404 -79.28922824666326 +630 1404 -23.7239243886706 +637 1404 -79.2955171547767 +638 1404 -23.725538021319 +886 1404 -16.16747220439897 +891 1404 -17.60110639947745 +1404 1404 1430.404338627783 +1405 1404 -430.3899588131738 +1433 1404 67.30745269610276 +1434 1404 -149.5706042219629 +163 1405 -94.69546021322726 +164 1405 -113.349539293303 +165 1405 -110.1127108390509 +886 1405 -17.04842783896641 +891 1405 -27.52148723966828 +896 1405 -20.16378968450309 +1404 1405 -436.9449242236325 +1405 1405 1584.205252089238 +1406 1405 -417.4219067126801 +1433 1405 -146.7962723272703 +1434 1405 20.18536936352947 +1435 1405 -166.9034299054239 +164 1406 -106.7554507349049 +165 1406 -185.2701360498839 +166 1406 -124.8908445912407 +891 1406 -19.47962202206651 +896 1406 -42.22821150446729 +901 1406 -23.13826292251002 +1405 1406 -425.7056482547367 +1406 1406 1795.539359957192 +1407 1406 -403.4811171201993 +1434 1406 -163.3286401716424 +1435 1406 -41.76775267588553 +1436 1406 -187.7007495177847 +165 1407 -121.051764240031 +166 1407 -275.4450763352775 +167 1407 -141.6510542105912 +896 1407 -22.35553407451471 +901 1407 -60.59931075579644 +906 1407 -26.58803897161994 +1406 1407 -413.1747013471481 +1407 1407 2037.475615745622 +1408 1407 -363.0646322157043 +1435 1407 -183.4313796214685 +1436 1407 -125.5313900511916 +1437 1407 -209.4460825108099 +166 1408 -137.1938289393554 +167 1408 -387.1760563380596 +168 1408 -160.4908330345378 +901 1408 -25.67883063198226 +906 1408 -83.29210450854225 +911 1408 -30.46863568863986 +1407 1408 -374.5976650759479 +1408 1408 2312.869562720762 +1409 1408 -314.7155564357338 +1436 1408 -204.2602971365116 +1437 1408 -236.6002069004134 +1438 1408 -234.0442326291706 +167 1409 -155.6795902026309 +168 1409 -519.736418093078 +169 1409 -182.1852645844555 +906 1409 -29.48672283009733 +911 1409 -110.1830346393427 +916 1409 -34.98043073219564 +1408 1409 -327.4828223972897 +1409 1409 2626.389788563702 +1410 1409 -242.3452692593735 +1437 1409 -228.1850054067374 +1438 1409 -375.5218756108261 +1439 1409 -260.7225127437304 +168 1410 -176.9460666583477 +169 1410 -676.9952521775223 +170 1410 -206.488313335538 +911 1410 -33.9106564984105 +916 1410 -142.0531099891567 +921 1410 -40.03995566411402 +1409 1410 -256.6028082735645 +1410 1410 2984.617347332343 +1411 1410 -156.3653120988046 +1438 1410 -254.0506146726214 +1439 1410 -548.2837826475603 +1440 1410 -290.1057671216467 +169 1411 -201.1325439923939 +170 1411 -856.0639093671462 +171 1411 -234.0772527873806 +916 1411 -38.9458729392047 +921 1411 -178.3431962908342 +926 1411 -45.79008952355484 +1410 1411 -171.3007660515625 +1411 1411 3389.135537795018 +1412 1411 -53.02408105460029 +1439 1411 -282.9890052840923 +1440 1411 -752.1078818944609 +1441 1411 -322.5404701373585 +170 1412 -228.572026947097 +171 1412 -1062.71579739788 +172 1412 -265.764533567909 +921 1412 -44.66499697150007 +926 1412 -220.2275001403099 +931 1412 -52.39434657495163 +1411 1412 -68.73288805726361 +1412 1412 3853.25162849774 +1413 1412 69.26088835119022 +1440 1412 -314.9321869286733 +1441 1412 -994.2360267733502 +1442 1412 -358.763132728746 +171 1413 -260.3867065303151 +172 1413 -1291.935866859629 +173 1413 -300.367780448113 +926 1413 -51.29486999801505 +931 1413 -266.7095635287952 +936 1413 -59.5873834748282 +1412 1413 53.58939105890929 +1413 1413 4372.721189568709 +1414 1413 199.4339514856296 +1441 1413 -351.0630655672572 +1442 1413 -1268.231775808695 +1443 1413 -398.3830424613204 +172 1414 -295.0942888630257 +173 1414 -1553.232578174423 +174 1414 -341.9993761873584 +931 1414 -58.50887737472311 +936 1414 -319.7265981859573 +941 1414 -68.232473461756 +1413 1414 183.7760478186333 +1414 1414 4971.286824711108 +1415 1414 356.0620013911545 +1442 1414 -390.5940243640462 +1443 1414 -1584.775353755126 +1444 1414 -444.8169570474732 +173 1415 -337.0198954252564 +174 1415 -1839.110020565086 +175 1415 -384.9969961785425 +936 1415 -67.21380420613639 +941 1415 -377.7677988977007 +946 1415 -77.13141363212863 +1414 1415 341.0334146541067 +1415 1415 5635.947906811726 +1416 1415 509.6258131363735 +1443 1415 -437.2623884312479 +1444 1415 -1933.857615774018 +1445 1415 -493.6808495727842 +174 1416 -380.2854911143987 +175 1416 -2164.712830924398 +176 1416 -439.9287645852867 +941 1416 -76.16733201425906 +946 1416 -443.9198721150399 +951 1416 -88.48342035397934 +1415 1416 495.2063953493391 +1416 1416 6405.296834881806 +1417 1416 701.9803557722896 +1444 1416 -486.3692531262308 +1445 1416 -2332.447969293151 +1446 1416 -554.9358405239327 +175 1417 -435.581327561316 +176 1417 -2518.895670589653 +177 1417 -493.0522912274472 +946 1417 -87.59365643374566 +951 1417 -515.9193216522822 +956 1417 -99.43135065882419 +1416 1417 688.5181739818436 +1417 1417 7254.094060946994 +1418 1417 878.6591218351577 +1445 1417 -548.0606550798575 +1446 1417 -2766.282437011261 +1447 1417 -615.5666028177909 +176 1418 -489.043873874731 +177 1418 -2924.612268208706 +178 1418 -565.7426872766521 +951 1418 -98.61083676494029 +956 1418 -598.4459942975698 +961 1418 -114.3898903424385 +1417 1418 866.1258213542253 +1418 1418 8241.529677309187 +1419 1418 1113.752702476256 +1446 1418 -609.1285754569747 +1447 1418 -3261.70300879465 +1448 1418 -697.5655990090725 +177 1419 -562.0415121690287 +178 1419 -3372.988135341942 +179 1419 -633.5240915098402 +956 1419 -113.6321660748932 +961 1419 -689.6895518367871 +966 1419 -128.311449248966 +1418 1419 1102.087109474505 +1419 1419 9344.691231924609 +1420 1419 1324.301096711649 +1447 1419 -691.5449865541657 +1448 1419 -3807.656614780426 +1449 1419 -775.4067818428498 +178 1420 -630.264718012351 +179 1420 -3873.351420019779 +180 1420 -724.6754039788976 +961 1420 -127.6441010367138 +966 1420 -791.5613338608558 +971 1420 -147.0101382071144 +1419 1420 1313.96166842232 +1420 1420 10590.99550077397 +1421 1420 1599.693517226482 +1448 1420 -770.0505910411426 +1449 1420 -4414.215417136596 +1450 1420 -879.7157104536379 +179 1421 -721.663745149832 +180 1421 -4436.88321270048 +181 1421 -813.8908261095576 +966 1421 -146.3934558661699 +971 1421 -906.3301860568455 +976 1421 -165.2894541912976 +1420 1421 1590.090422632635 +1421 1421 12005.69144296718 +1422 1421 1861.770072826291 +1449 1421 -874.7261524531873 +1450 1421 -5094.745847978646 +1451 1421 -982.8503039016068 +180 1422 -811.2540062262024 +181 1422 -5065.703335837391 +182 1422 -927.7988410779107 +971 1422 -164.7494887220189 +976 1422 -1034.437047493159 +981 1422 -188.6071624240822 +1421 1422 1853.327381628639 +1422 1422 13597.43870129172 +1423 1422 2188.999179135597 +1450 1422 -978.4533004190012 +1451 1422 -5851.1242749846 +1452 1422 -1114.632032442256 +181 1423 -925.3890535911248 +182 1423 -5778.764396848623 +183 1423 -1045.519980875229 +976 1423 -188.1136616713618 +981 1423 -1179.738473688133 +986 1423 -212.6869236609993 +1422 1423 2181.258067672959 +1423 1423 15412.54094116693 +1424 1423 2520.767392566057 +1451 1423 -1110.59290819228 +1452 1423 -6705.95835295381 +1453 1423 -1251.572934011361 +182 1424 -1043.414882111624 +183 1424 -6573.52729446649 +184 1424 -1187.478697119305 +981 1424 -212.2558016648798 +986 1424 -1341.721831742011 +991 1424 -241.7071711648898 +1423 1424 2513.987441820406 +1424 1424 17446.33169732354 +1425 1424 2914.637714437912 +1452 1424 -1248.030123263951 +1453 1424 -7655.9192437146 +1454 1424 -1417.031297559929 +183 1425 -1185.570634605107 +184 1425 -7480.374529608924 +185 1425 -1342.97201764261 +986 1425 -241.3163888058352 +991 1425 -1526.577458065922 +996 1425 -273.4788497027941 +1424 1425 2908.479761380993 +1425 1425 19775.75153573341 +1426 1425 3340.578693730386 +1453 1425 -1413.809799090705 +1454 1425 -8737.114778511226 +1455 1425 -1598.780447075698 +184 1426 -1341.305222919499 +185 1426 -8489.027509297081 +186 1426 -1519.512926795701 +991 1426 -273.1374713335688 +996 1426 -1732.211906306506 +1001 1426 -309.5375172432194 +1425 1426 3335.19069396484 +1426 1426 22375.14747523674 +1427 1426 3819.274663603999 +1454 1426 -1595.959192369361 +1455 1426 -9937.263034974214 +1456 1426 -1805.534825318325 +185 1427 -1518.011935564729 +186 1427 -9646.381525166642 +187 1427 -1724.942614768544 +996 1427 -309.2300909070767 +1001 1427 -1968.185549769166 +1006 1427 -351.4839677181894 +1426 1427 3814.416480743533 +1427 1427 25365.20332247583 +1428 1427 4371.657463153309 +1455 1427 -1802.989190334985 +1456 1427 -11311.92468777449 +1457 1427 -2046.457514831498 +186 1428 -1723.629504243659 +187 1428 -10930.08797645337 +188 1428 -1944.101528242835 +1001 1428 -351.2150178797049 +1006 1428 -2229.941607997907 +1011 1428 -396.223317991335 +1427 1428 4367.403150057958 +1428 1428 28688.25428185042 +1429 1428 4957.216400005267 +1456 1428 -2044.227062462998 +1457 1428 -12834.67871381735 +1458 1428 -2303.893914487269 +187 1429 -1942.925461826073 +188 1429 -12410.58101297132 +189 1429 -2215.446597634986 +1006 1429 -395.9824343012829 +1011 1429 -2531.843097166475 +1016 1429 -451.6054577794167 +1428 1429 4953.403124195593 +1429 1429 32526.89281552575 +1430 1429 5678.301330157547 +1457 1429 -2301.893821985167 +1458 1429 -14588.81355900409 +1459 1429 -2622.829890405719 +188 1430 -2214.415318840948 +189 1430 -14047.2589381533 +190 1430 -2487.04861155753 +1011 1430 -451.3942275952772 +1016 1430 -2865.609285801956 +1021 1430 -507.0321432149525 +1429 1430 5674.955470630456 +1430 1430 36775.50635700813 +1431 1430 6397.269868323267 +1458 1430 -2621.074365025477 +1459 1430 -16526.42642780684 +1460 1430 -2942.454386733529 +189 1431 -2486.12937872684 +190 1431 -15943.90413940354 +191 1431 -2845.320461604992 +1016 1431 -506.8438612134797 +1021 1431 -3252.406198855167 +1026 1431 -580.1371397575134 +1430 1431 6394.286105996414 +1431 1431 41704.03501852613 +1432 1431 7342.399560822738 +1459 1431 -2940.888433754789 +1460 1431 -18770.10924737245 +1461 1431 -3364.170631276968 +16 1432 -3175.48225866926 +150 1432 8276.409525552361 +151 1432 -3743.873510909618 +162 1432 -647.6832763640288 +190 1432 -2844.512022858741 +191 1432 -18032.39364067466 +292 1432 -647.7451099527792 +1021 1432 -579.9715501590414 +1026 1432 -3678.338614138556 +1431 1432 7339.774447683467 +1432 1432 47134.51027975599 +1460 1432 -3362.792620569593 +1461 1432 -21239.2207129095 +91 1433 -217.0819386206899 +92 1433 -814.3855845883273 +93 1433 -124.802376043846 +629 1433 -22.03852256149028 +630 1433 -142.4599958441783 +631 1433 -37.09867447569754 +637 1433 -22.04034482805765 +638 1433 -142.4715594936681 +639 1433 -37.10141351534112 +1404 1433 46.58572352086459 +1405 1433 -134.3919408692709 +1433 1433 2165.299234487064 +1434 1433 -816.1007705937968 +1462 1433 251.1943592406126 +1463 1433 -232.5905561087959 +1404 1434 -131.7069152088384 +1405 1434 -2.085416783621781 +1406 1434 -149.1282006431279 +1433 1434 -823.319028307578 +1434 1434 2379.569623407703 +1435 1434 -836.8017250881744 +1462 1434 -229.7446208406279 +1463 1434 219.0596074885988 +1464 1434 -259.1126382823188 +1405 1435 -145.6625017749442 +1406 1435 -66.48171731958692 +1407 1435 -166.81852357153 +1434 1435 -846.3701683702816 +1435 1435 2685.730784379608 +1436 1435 -862.6111326034488 +1463 1435 -255.2548162533924 +1464 1435 176.4851244442636 +1465 1435 -292.1836797020339 +1406 1436 -162.6715645725611 +1407 1436 -152.3384491194398 +1408 1436 -185.6307842515487 +1435 1436 -874.4170839710121 +1436 1436 3033.835308856381 +1437 1436 -849.3311277399707 +1464 1436 -287.3055813070201 +1465 1436 108.471429250949 +1466 1436 -325.6775417301088 +1407 1437 -180.5834378201068 +1408 1437 -264.7230348442771 +1409 1437 -207.1371049206809 +1436 1437 -864.2038973034207 +1437 1437 3425.96460191018 +1438 1437 -825.8602393485528 +1465 1437 -319.3698891919632 +1466 1437 5.533211784923239 +1467 1437 -364.6151137918937 +1408 1438 -201.4222064484078 +1409 1438 -403.9815346575157 +1410 1438 -231.1342445727912 +1437 1438 -843.348381459652 +1438 1438 3870.6908647499 +1439 1438 -761.916123815818 +1466 1438 -356.9954857297037 +1467 1438 -136.3380564114431 +1468 1438 -405.7306461595403 +1409 1439 -224.6127735126903 +1410 1439 -575.5525447152139 +1411 1439 -258.1277259484151 +1438 1439 -782.6905460998983 +1439 1439 4374.209338964564 +1440 1439 -672.4640506985743 +1467 1439 -396.4318494750361 +1468 1439 -328.8826040460361 +1469 1439 -451.1299923619057 +1410 1440 -251.156802854198 +1411 1440 -776.6769462400343 +1412 1440 -288.6807367162845 +1439 1440 -695.6127952462143 +1440 1440 4942.900439857731 +1441 1440 -548.5527351130565 +1468 1440 -440.4937178588928 +1469 1440 -572.2318790793521 +1470 1440 -500.4250727745022 +1411 1441 -281.2134646334873 +1412 1441 -1014.097462401021 +1413 1441 -323.6161603732471 +1440 1441 -574.4025354003245 +1441 1441 5591.770903990455 +1442 1441 -386.2094029398988 +1469 1441 -488.252489401416 +1470 1441 -879.5633792237481 +1471 1441 -553.9469165384514 +1412 1442 -316.0447818635929 +1413 1442 -1281.723847321131 +1414 1442 -362.2921219874935 +1441 1442 -413.5011945421195 +1442 1442 6320.288721109643 +1443 1442 -203.6510777673616 +1470 1442 -540.8036589713001 +1471 1442 -1244.252992636665 +1472 1442 -612.5633113384924 +1413 1443 -354.6204680688494 +1414 1443 -1589.835776270482 +1415 1443 -408.405634523915 +1442 1443 -232.3766631288419 +1443 1443 7158.083773890981 +1444 1443 29.29060427947761 +1471 1443 -598.4514475753579 +1472 1443 -1682.061834458974 +1473 1443 -678.0219496543763 +1414 1444 -400.9539036211073 +1415 1444 -1929.012404591165 +1416 1444 -456.9654941993456 +1443 1444 0.3972859579284886 +1444 1444 8091.984081824908 +1445 1444 262.3529874143443 +1472 1444 -663.5800300635752 +1473 1444 -2178.560411717553 +1474 1444 -748.3603087468039 +1415 1445 -449.7442421858966 +1416 1445 -2315.807679072848 +1417 1445 -518.3499613247923 +1444 1445 233.4685644777937 +1445 1445 9173.080178129458 +1446 1445 561.5593267790492 +1473 1445 -733.7093630997198 +1474 1445 -2756.111651124354 +1475 1445 -832.2394356263185 +1416 1446 -511.5523816812239 +1417 1446 -2736.643488042994 +1418 1446 -578.8401958658053 +1445 1446 533.620215052857 +1446 1446 10369.4848422098 +1447 1446 837.4469458474097 +1474 1446 -817.8928209521123 +1475 1446 -3392.495313493924 +1476 1446 -918.0129045239743 +1417 1447 -572.4691011380921 +1418 1447 -3217.277182969598 +1419 1447 -660.8127966969219 +1446 1447 810.6459942359231 +1447 1447 11762.69001008551 +1448 1447 1204.86901320412 +1475 1447 -904.1110276218906 +1476 1447 -4122.531229183609 +1477 1447 -1029.584220782092 +1418 1448 -654.850313669624 +1419 1448 -3747.077341406528 +1420 1448 -738.2627091559544 +1447 1448 1179.288662082677 +1448 1448 13321.0125480195 +1449 1448 1532.68427035551 +1476 1448 -1016.204980426634 +1477 1448 -4928.599452024975 +1478 1448 -1138.433077004896 +1419 1449 -732.9550174035419 +1420 1449 -4336.119326133407 +1421 1449 -841.9007405006457 +1448 1449 1509.54170176105 +1449 1449 15084.90438718941 +1450 1449 1956.97977118421 +1477 1449 -1126.24821291516 +1478 1449 -5822.042925114529 +1479 1449 -1281.579362226243 +1420 1450 -836.95394535268 +1421 1450 -4997.329119765271 +1422 1450 -944.0199248391006 +1449 1450 1935.123770740964 +1450 1450 17087.27382711472 +1451 1450 2357.786030696086 +1478 1450 -1270.010649380437 +1479 1450 -6821.095882594836 +1480 1450 -1425.228954002134 +1421 1451 -939.6588942662639 +1422 1451 -5732.773705602071 +1423 1451 -1074.214020009189 +1450 1451 2338.310149695709 +1451 1451 19343.17247240663 +1452 1451 2852.100569113093 +1479 1451 -1414.876344777611 +1480 1451 -7926.4022612197 +1481 1451 -1607.79210736121 +1422 1452 -1070.206689072094 +1423 1452 -6564.387787897194 +1424 1452 -1209.179259632092 +1451 1452 2834.049426652829 +1452 1452 21915.76527092555 +1453 1452 3349.102587158133 +1480 1452 -1598.16464757894 +1481 1452 -9169.785377816563 +1482 1452 -1798.893313611518 +1423 1453 -1205.663462376387 +1424 1453 -7489.07239821191 +1425 1453 -1371.946046215896 +1452 1453 3333.155979633754 +1453 1453 24800.44296092961 +1454 1453 3933.31694153631 +1481 1453 -1790.365730960243 +1482 1453 -10545.40178499969 +1483 1453 -2029.818351949011 +1424 1454 -1368.748484454569 +1425 1454 -8541.95320253498 +1426 1454 -1550.445162764672 +1453 1454 3918.734169660447 +1454 1454 28104.61039654252 +1455 1454 4560.330799304544 +1482 1454 -2022.003832424992 +1483 1454 -12104.52290434025 +1484 1454 -2284.302483927403 +1425 1455 -1547.644437149282 +1426 1455 -9711.133545723296 +1427 1455 -1753.236122658398 +1454 1455 4547.502266476981 +1455 1455 31793.22017442895 +1456 1455 5260.28268072604 +1483 1455 -2277.416731122652 +1484 1455 -13829.23652855405 +1485 1455 -2574.355588190946 +1426 1456 -1750.708703901793 +1427 1456 -11050.74416740833 +1428 1456 -1989.282988340357 +1455 1456 5248.666352572431 +1456 1456 36036.40828856319 +1457 1456 6063.083407741915 +1484 1456 -2568.112476195181 +1485 1456 -15798.46455491529 +1486 1456 -2912.729879338991 +1427 1457 -1987.068284950705 +1428 1457 -12535.05145810388 +1429 1457 -2241.294792690902 +1456 1457 6052.876862615343 +1457 1457 40753.17074356373 +1458 1457 6910.601947811499 +1485 1457 -2907.238910644227 +1486 1457 -17974.64771566402 +1487 1457 -3275.089745023992 +1428 1458 -2239.308673935041 +1429 1458 -14245.26460554233 +1430 1458 -2553.289115852905 +1457 1458 6901.429459168776 +1458 1458 46202.02162784759 +1459 1458 7949.558679169762 +1486 1458 -3270.151193290983 +1487 1458 -20475.93187937091 +1488 1458 -3724.078861889943 +1429 1459 -2551.545753116626 +1430 1459 -16134.66349921632 +1431 1459 -2865.791213660719 +1458 1459 7941.493910589534 +1459 1459 52233.50363514863 +1460 1459 8983.032242445939 +1487 1459 -3719.73403424448 +1488 1459 -23234.56256806148 +1489 1459 -4174.898558958763 +1430 1460 -2864.236038563283 +1431 1460 -18322.82666244475 +1432 1460 -3277.922913995432 +1459 1460 8975.828664662879 +1460 1460 59230.49853741899 +1461 1460 10337.22640230623 +1488 1460 -4171.015820027336 +1489 1460 -26424.2257602604 +1490 1460 -4769.550142954665 +150 1461 -3652.841448618693 +151 1461 11733.01566470785 +152 1461 -5284.501762052707 +1431 1461 -3276.554338420057 +1432 1461 -20731.05584918004 +1460 1461 10330.88068456394 +1461 1461 66938.69766322967 +1489 1461 -4766.128500979579 +1490 1461 -29929.93717551242 +90 1462 -349.2032452659557 +91 1462 -1426.942105517744 +92 1462 -196.4416266788621 +630 1462 -34.35945336559794 +631 1462 -246.5410135965373 +632 1462 -59.40459249407927 +638 1462 -34.36233796787354 +639 1462 -246.5607368352142 +640 1462 -59.40896423392692 +1433 1462 217.3928257618529 +1434 1462 -209.7064800420403 +1462 1462 3414.878505946905 +1463 1462 -1463.387057383826 +1491 1462 547.6570731572489 +1492 1462 -372.1894889153454 +1433 1463 -206.9875377592688 +1434 1463 182.3314517564703 +1435 1463 -232.1349463314558 +1462 1463 -1471.250713934229 +1463 1463 3742.708826699139 +1464 1463 -1552.600127439549 +1491 1463 -369.4869983395172 +1492 1463 544.0688981439971 +1493 1463 -414.342423863042 +1434 1464 -228.4422730021254 +1435 1464 134.9716504568115 +1436 1464 -259.9626262780515 +1463 1464 -1563.470882748335 +1464 1464 4226.659100473048 +1465 1464 -1664.441816097875 +1492 1464 -410.5478564520481 +1493 1464 542.7872988013009 +1494 1464 -468.3105522246043 +1435 1465 -255.2830794988062 +1436 1465 62.03801737857627 +1437 1465 -288.0045976689802 +1464 1465 -1678.513500528209 +1465 1465 4777.68577611511 +1466 1465 -1724.073624321295 +1493 1465 -463.3092248826916 +1494 1465 517.750936470089 +1495 1465 -521.9156271604417 +1436 1466 -281.9386066893007 +1437 1466 -45.45965799967432 +1438 1466 -320.6214481230212 +1465 1466 -1742.776075159207 +1466 1466 5397.74424172209 +1467 1466 -1779.526620987727 +1494 1466 -515.1313635257412 +1495 1466 455.8361445347293 +1496 1466 -585.6885090966922 +1437 1467 -313.2735059922849 +1438 1467 -191.2339180338283 +1439 1467 -355.4565896577805 +1466 1467 -1802.846212011634 +1467 1467 6102.604151254044 +1468 1467 -1774.741716297818 +1495 1467 -577.036272466064 +1496 1467 349.495165952735 +1497 1467 -651.9824904052389 +1438 1468 -346.4626603562108 +1439 1468 -386.0596844109908 +1440 1468 -394.4656778100403 +1467 1468 -1804.232143395705 +1468 1468 6897.483009452377 +1469 1468 -1731.033346715097 +1496 1468 -640.77241121885 +1497 1468 179.2232945276922 +1498 1468 -725.7722599954332 +1439 1469 -384.1459475728763 +1440 1469 -629.8270318686353 +1441 1469 -437.8226063551484 +1468 1469 -1766.11196120763 +1469 1469 7797.931840697813 +1470 1469 -1626.073112860237 +1497 1469 -712.0964502842913 +1498 1469 -60.9307803588257 +1499 1469 -805.1765316202473 +1440 1470 -425.9746947444967 +1441 1470 -934.4505948226222 +1442 1470 -486.2949663930984 +1469 1470 -1667.929367708368 +1470 1470 8819.536799640873 +1471 1470 -1446.291634059877 +1498 1470 -788.4366001715819 +1499 1470 -395.7454689755144 +1500 1470 -889.468241358291 +1441 1471 -473.4619199117803 +1442 1471 -1293.482509250263 +1443 1471 -540.5227847750364 +1470 1471 -1493.486434016037 +1471 1471 9970.696701735194 +1472 1471 -1218.966070611558 +1499 1471 -870.1152931700882 +1500 1471 -823.6428211621694 +1442 1472 -526.702295902192 +1443 1472 -1721.471870461689 +1444 1472 -603.19186920583 +1471 1472 -1271.891256765335 +1472 1472 11287.87620734964 +1473 1472 -885.538425689016 +1500 1472 -959.8322896057434 +1443 1473 -589.008097884587 +1444 1473 -2204.80751423713 +1445 1473 -671.1259690119925 +1472 1473 -942.0508902207966 +1473 1473 12761.84415884269 +1474 1473 -535.8781519392638 +1444 1474 -656.6999167967479 +1445 1474 -2764.832914916964 +1446 1474 -754.2915683668436 +1473 1474 -595.5551097774988 +1474 1474 14462.766818421 +1475 1474 -51.44352878403578 +1445 1475 -740.1328844862762 +1446 1475 -3380.653495297139 +1447 1475 -839.1328333253468 +1474 1475 -112.0809728515166 +1475 1475 16351.2786286161 +1476 1475 404.2353406264846 +1446 1476 -825.385868551147 +1447 1476 -4086.075895977337 +1448 1476 -950.9882570142448 +1475 1476 343.5023990963273 +1476 1476 18547.85862146759 +1477 1476 1031.458303570894 +1447 1477 -937.7355662594973 +1448 1477 -4864.441056292726 +1449 1477 -1059.490435689996 +1476 1477 971.2769012917284 +1477 1477 21006.73781181512 +1478 1477 1594.730323197125 +1448 1478 -1047.403710307034 +1449 1478 -5727.372720862046 +1450 1478 -1202.559448066785 +1477 1478 1538.541489802163 +1478 1478 23793.80838347121 +1479 1478 2327.039809957532 +1449 1479 -1191.070483113513 +1450 1479 -6692.441006968565 +1451 1479 -1345.447593786292 +1478 1479 2272.564760490101 +1479 1479 26955.15090984315 +1480 1479 3017.583505729404 +1450 1480 -1335.156499873531 +1451 1480 -7760.943485873655 +1452 1480 -1526.672344221168 +1479 1480 2967.979555202744 +1480 1480 30520.72368522243 +1481 1480 3862.346036835879 +1451 1481 -1517.094681112559 +1452 1481 -8963.582263607021 +1453 1481 -1715.66731466989 +1480 1481 3815.555089274863 +1481 1481 34584.30364532554 +1482 1481 4705.756148750854 +1452 1482 -1707.178552780127 +1453 1482 -10295.13692027631 +1454 1482 -1943.410670507527 +1481 1482 4663.828063896851 +1482 1482 39143.5239188336 +1483 1482 5686.868528027086 +1453 1483 -1935.627861388775 +1454 1483 -11805.21185141219 +1455 1483 -2193.696325218171 +1482 1483 5648.087139177643 +1483 1483 44363.48948175977 +1484 1483 6730.584422684599 +1454 1484 -2186.835802037953 +1455 1484 -13476.68107320506 +1456 1484 -2478.318555928373 +1483 1484 6696.156441244477 +1484 1484 50192.39493719825 +1485 1484 7885.810371187625 +1455 1485 -2472.096375519573 +1456 1485 -15386.05152584591 +1457 1485 -2809.711055629782 +1484 1485 7854.410073467323 +1485 1485 56895.85680223016 +1486 1485 9199.787931449682 +1456 1486 -2804.237145112554 +1457 1486 -17496.97968914429 +1458 1486 -3164.040367219081 +1485 1486 9172.040438958555 +1486 1486 64348.29446780156 +1487 1486 10579.00128186849 +1457 1487 -3159.116202188728 +1458 1487 -19924.13303098766 +1459 1487 -3602.4990546859 +1486 1487 10553.95264628361 +1487 1487 72956.07792395755 +1488 1487 12258.289621566 +1458 1488 -3598.166222448147 +1459 1488 -22601.74449099282 +1460 1488 -4042.305587924454 +1487 1488 12236.18783900418 +1488 1488 82484.57916620131 +1489 1488 13922.97252976261 +1459 1489 -4038.433105603559 +1460 1489 -25698.49528893805 +1461 1489 -4621.924035796539 +1488 1489 13903.17597944197 +1489 1489 93537.4561605077 +1490 1489 16093.12853168494 +151 1490 -5134.451626247979 +152 1490 18475.8413396362 +153 1490 -7480.327148706716 +1460 1490 -4618.511112030295 +1461 1490 -29102.60517908245 +1489 1490 16075.65142731864 +1490 1490 105708.4828029511 +89 1491 -575.9488513436556 +90 1491 -2449.994604983651 +91 1491 -315.9228589230821 +631 1491 -54.65515406884455 +632 1491 -419.021888344347 +633 1491 -97.47541903244566 +639 1491 -54.65959839598212 +640 1491 -419.0533272256923 +641 1491 -97.48193594851514 +1462 1491 489.0335017158803 +1463 1491 -335.6868244568992 +1491 1491 5511.471902729574 +1492 1491 -2548.076727516645 +1462 1492 -333.147574490004 +1463 1492 480.32937237744 +1464 1492 -371.7192788486451 +1491 1492 -2556.286080754739 +1492 1492 6029.368994385295 +1493 1492 -2760.730670175641 +1463 1493 -368.1473262361911 +1464 1493 470.6330017989656 +1465 1493 -417.5415098002213 +1492 1493 -2772.407655443111 +1493 1493 6811.190079780125 +1494 1493 -3033.154358123474 +1464 1494 -412.823124411642 +1465 1494 436.3525417454534 +1466 1494 -462.3074897766611 +1493 1494 -3048.79139594789 +1494 1494 7702.3776156215 +1495 1494 -3242.626416962646 +1465 1495 -455.8902031832428 +1466 1495 364.8044747243575 +1467 1495 -515.1721708929173 +1494 1495 -3264.250040376876 +1495 1495 8705.007049022137 +1496 1495 -3473.848170078476 +1466 1496 -506.9628928960858 +1467 1496 248.5820481291396 +1468 1496 -569.6928348552096 +1495 1496 -3502.068259008655 +1496 1496 9847.623541327968 +1497 1496 -3630.689664514451 +1467 1497 -559.0195846458475 +1468 1497 69.40574533992205 +1469 1497 -630.3181760481555 +1496 1497 -3668.25588896725 +1497 1497 11133.0035784866 +1498 1497 -3748.038807931522 +1468 1498 -617.2466475804753 +1469 1498 -178.3887585326817 +1470 1498 -695.9984012382715 +1497 1498 -3795.32488644253 +1498 1498 12594.55356993482 +1499 1498 -3780.279036305734 +1469 1499 -679.9306640556682 +1470 1499 -517.3434640757567 +1471 1499 -766.8689146910136 +1498 1499 -3840.239686249468 +1499 1499 14244.34020546978 +1500 1499 -3693.07934146451 +1470 1500 -748.2101970346164 +1471 1500 -945.7666206201602 +1472 1500 -846.1789564545044 +1499 1500 -3765.152739907242 +1500 1500 16111.80229255549 diff --git a/packages/muelu/test/unit_tests/TestMatrices/fuego1.mm b/packages/muelu/test/unit_tests/TestMatrices/fuego1.mm new file mode 100644 index 000000000000..0cfcf734707d --- /dev/null +++ b/packages/muelu/test/unit_tests/TestMatrices/fuego1.mm @@ -0,0 +1,12341 @@ +%%MatrixMarket matrix coordinate real general +% Generated 26-May-2020 18:23:39 +1500 1500 12338 +1 1 3.764021747289999 +102 1 0.1317727849030302 +116 1 0.1317773438462102 +132 1 -0.1900726421177906 +490 1 -1.086293925861366 +757 1 -0.07200246446852354 +836 1 -0.2336408436657803 +857 1 -0.2336322065861773 +2 2 3.764021062163245 +106 2 0.1317727342122316 +107 2 0.1317770254043062 +127 2 -0.190072702694574 +548 2 -1.086293262659977 +761 2 -0.07200245597666909 +811 2 -0.2336327776746833 +832 2 -0.2336407998468501 +3 3 3.764020790346006 +111 3 0.1317772871418446 +121 3 0.131772728195638 +122 3 -0.1900726314593039 +519 3 -1.086293683867001 +781 3 -0.07200245450353579 +786 3 -0.2336407966530129 +807 3 -0.2336321595771689 +4 4 3.764021062291603 +45 4 -0.1900727026940109 +112 4 0.1317770170144792 +117 4 0.1317727426164143 +461 4 -1.086293262689638 +777 4 -0.07200245597790382 +782 4 -0.2336408044456722 +861 4 -0.2336327730902654 +5 5 12470.17558069764 +59 5 2059.984313604103 +65 5 2060.064083379863 +94 5 3450.623558074506 +250 5 -12342.44713422575 +604 5 567.2011280109657 +756 5 567.1809582907138 +1027 5 -2063.608607814707 +1375 5 -3476.108423251383 +6 6 9.509377438620412 +30 6 1.369852073133897 +39 6 1.3699256056886 +101 6 -0.2369864707062699 +136 6 -0.2032632339812198 +192 6 -5.325416117589183 +597 6 -0.06331054791035354 +749 6 -0.06331617901009601 +856 6 -0.06810717120660184 +877 6 -0.0681098592042666 +882 6 -1.000664939793733 +1172 6 -1.777031957104355 +7 7 12468.50586834752 +50 7 2059.716817998912 +69 7 2059.799435454665 +86 7 3450.17399271568 +221 7 -12340.76894732679 +636 7 567.1253836390698 +644 7 567.1134409950356 +1031 7 -2063.339193494706 +8 8 9.51035921856012 +34 8 1.369959577631826 +40 8 1.37003744517961 +93 8 -0.2358529718026626 +131 8 -0.2032676660524943 +163 8 -5.326977939553663 +629 8 -0.06318235443541606 +637 8 -0.06316444435672913 +831 8 -0.06811059014002346 +852 8 -0.06810802525637849 +886 8 -1.000926171594092 +1404 8 -1.777393646193152 +9 9 9.510391105520217 +25 9 1.369968897569582 +44 9 1.370042268766989 +78 9 -0.2358483453921419 +126 9 -0.2032682632660446 +297 9 -5.327006791692263 +669 9 -0.06316498818832589 +677 9 -0.06315898350059979 +806 9 -0.0681080950198491 +827 9 -0.06811078222414554 +10 10 12468.51479319354 +54 10 2059.71663111809 +60 10 2059.796648624976 +85 10 3450.203045161582 +326 10 -12340.77801083459 +676 10 567.1134819483228 +684 10 567.1336757283118 +11 11 9.510359143841793 +29 11 1.369968834940291 +35 11 1.370028114705047 +49 11 -0.2032676649030606 +70 11 -0.2358531850136393 +373 11 -5.326977752785017 +709 11 -0.0631586529101692 +717 11 -0.06318819193144054 +802 11 -0.06810809083678804 +881 11 -0.0681105239874944 +12 12 12468.50640843061 +55 12 2059.713968289734 +64 12 2059.803020024111 +77 12 3450.173888289104 +402 12 -12340.76949037837 +716 12 567.1353089831462 +724 12 567.1036686025107 +13 13 20375.75856170775 +137 13 -9816.976374126143 +158 13 1884.174218462868 +220 13 6739.678844180699 +440 13 1884.363271645356 +596 13 -7430.477489428143 +1022 13 618.9759838862724 +1200 13 -3282.363263059131 +14 14 744020.1640704742 +144 14 -89939.38394810626 +145 14 3173.685695970307 +278 14 144625.8628367943 +435 14 3165.276870946858 +1167 14 -15550.70395192842 +1403 14 -55463.41089585012 +15 15 743960.6885239048 +149 15 3194.223583898602 +157 15 -89969.42078870049 +249 15 144631.6331268651 +279 15 3186.606322003419 +1171 15 -15540.06701700007 +16 16 20379.11445250671 +150 16 -9817.231531005553 +162 16 1883.92509152398 +191 16 6740.769996729218 +292 16 1884.127020607229 +591 16 -7431.785775339711 +1026 16 618.8886280777402 +1432 16 -3282.457574818243 +17 17 743961.8065918102 +283 17 3186.505030902103 +291 17 -89971.52282160685 +354 17 144631.6008520042 +355 17 3194.88650788134 +18 18 20379.28767599578 +284 18 -9817.416772816287 +296 18 1884.144261188075 +325 18 6740.827120671769 +368 18 1883.954659542618 +581 18 -7431.828294506116 +19 19 743960.7113202421 +359 19 3195.694881499672 +367 19 -89969.39528456057 +430 19 144631.6325911174 +431 19 3185.078144485509 +20 20 20379.11334729771 +360 20 -9817.231887721566 +372 20 1883.95256057982 +401 20 6740.769623995532 +436 20 1884.100092787915 +586 20 -7431.785377006279 +21 21 9662.524668268752 +441 21 -1472.342161229402 +456 21 -1472.33279323893 +518 21 3209.93419645335 +592 21 -2856.62975569397 +22 22 9662.524349151638 +445 22 -1472.341983089485 +446 22 -1472.332944133856 +576 22 3209.934094379371 +587 22 -2856.628469490301 +23 23 9662.524620729822 +450 23 -1472.332786351963 +455 23 -1472.342154387446 +547 23 3209.934185371853 +577 23 -2856.629741827136 +24 24 9662.524324285856 +451 24 -1472.341979396496 +460 24 -1472.332940638007 +489 24 3209.934089192658 +582 24 -2856.628462035807 +9 25 1.357185688719571 +25 25 9.681909894659164 +26 25 1.391953569437061 +78 25 -0.06320135309354497 +126 25 -0.09008186331518905 +297 25 -0.9657423089553703 +677 25 -0.2354488320137308 +685 25 -0.06301230694121873 +805 25 -0.04448726825994215 +806 25 -0.01012279966075458 +25 26 1.383154544534857 +26 26 9.853228074003731 +27 26 1.403825196718383 +677 26 -0.06301244865122577 +685 26 -0.2354086535048419 +693 26 -0.06293133994966119 +804 26 -0.02755137834667823 +805 26 0.1539297099616531 +806 26 -0.04346386392549076 +26 27 1.400624052865416 +27 27 9.916671912251715 +28 27 1.400623960305058 +685 27 -0.06292941290767951 +693 27 -0.2354584365944005 +701 27 -0.06293060795624569 +803 27 -0.02511354603775726 +804 27 0.2095305360791908 +805 27 -0.02511354671492219 +27 28 1.403825015103896 +28 28 9.853227666826387 +29 28 1.383154783247695 +693 28 -0.06293043445816962 +701 28 -0.2354093152821928 +709 28 -0.06301293108082787 +802 28 -0.04346386367563179 +803 28 0.1539297138122708 +804 28 -0.02755137818260386 +11 29 1.357185234656419 +28 29 1.39195359700113 +29 29 9.681910315324984 +49 29 -0.09008185099741239 +70 29 -0.06320151457220702 +373 29 -0.9657421035383059 +701 29 -0.06301154780412629 +709 29 -0.2354484253505786 +802 29 -0.01012279096757196 +803 29 -0.04448726776941672 +6 30 1.357064950651441 +30 30 9.680970155255725 +31 30 1.391855582000079 +101 30 -0.06338447896349902 +136 30 -0.09008077342299275 +192 30 -0.9654602611449288 +597 30 -0.2365069707160602 +605 30 -0.06311453562045263 +855 30 -0.04448662598338404 +856 30 -0.0101192086728733 +882 30 -5.623583922415801 +883 30 -1.057304176481913 +1172 30 -0.3043829132112255 +30 31 1.383047837967866 +31 31 9.852473719204792 +32 31 1.403753981087673 +597 31 -0.06320029555033604 +605 31 -0.2362573251365961 +613 31 -0.06298080249237253 +854 31 -0.02755098018365559 +855 31 0.1539318427713641 +856 31 -0.04346315495254516 +882 31 -1.036018163970911 +883 31 -5.898697055600264 +884 31 -1.084359586988234 +31 32 1.400542310386694 +32 32 9.916156437903343 +33 32 1.400581209572943 +605 32 -0.06309618112283891 +613 32 -0.2360278754164631 +621 32 -0.06293828231338899 +853 32 -0.02511331935680494 +854 32 0.2095317914389195 +855 32 -0.02511308508690149 +883 32 -1.077163242689309 +884 32 -5.995283149462751 +885 32 -1.077257105995381 +32 33 1.403772110687016 +33 33 9.852947238570151 +34 33 1.383135727837234 +613 33 -0.06305511818947607 +621 33 -0.235701548860895 +629 33 -0.06299983508024345 +852 33 -0.04346374973748252 +853 33 0.153930454881982 +854 33 -0.02755107882168573 +884 33 -1.084406920384761 +885 33 -5.899458435529654 +886 33 -1.036230639948798 +8 34 1.357179599649597 +33 34 1.391926815419525 +34 34 9.681806425826425 +93 34 -0.06319391927327653 +131 34 -0.09008182174522456 +163 34 -0.9657353649410829 +621 34 -0.06308394105219267 +629 34 -0.2355351820934775 +852 34 -0.01012241950629711 +853 34 -0.04448709572202425 +885 34 -1.05748076723715 +886 34 -5.624917708617343 +1404 34 -0.3044397793652167 +11 35 1.357246940022816 +35 35 9.682016066133782 +36 35 1.391940069052072 +49 35 -0.09008185090439583 +70 35 -0.06319115008989865 +373 35 -0.9657682206574525 +717 35 -0.2355444507191785 +725 35 -0.06309454718900945 +880 35 -0.0444890745303847 +881 35 -0.0101255147235132 +35 36 1.383147894633329 +36 36 9.852751075276178 +37 36 1.403683434477432 +717 36 -0.06299092517813548 +725 36 -0.2356979667337452 +733 36 -0.06305896739947553 +879 36 -0.02755323877945204 +880 36 0.1539324160030128 +881 36 -0.0434607062391465 +36 37 1.400492053399489 +37 37 9.91566201388304 +38 37 1.40043911225997 +725 37 -0.06293148513485972 +733 37 -0.2360121397755296 +741 37 -0.06308929144142664 +878 37 -0.02511276315202637 +879 37 0.2095317123302177 +880 37 -0.02511327490091145 +37 38 1.403651170208553 +38 38 9.852293445230474 +39 38 1.383080235485162 +733 38 -0.06298457453595951 +741 38 -0.2362544620274225 +749 38 -0.06319115073291545 +877 38 -0.04345953027626848 +878 38 0.1539335041495116 +879 38 -0.02755378894548449 +6 39 1.357137125362741 +38 39 1.391889019791478 +39 39 9.681245585747876 +101 39 -0.06338170581325941 +136 39 -0.09008079180549083 +192 39 -0.9654955871332007 +741 39 -0.06312539648975665 +749 39 -0.2365176758146725 +877 39 -0.0101231859533939 +878 39 -0.04448899176652257 +1172 39 -0.3043924485767321 +8 40 1.357252577750549 +40 40 9.682120747680589 +41 40 1.391966915314711 +93 40 -0.06319864960865512 +131 40 -0.09008188067153428 +163 40 -0.9657750293152388 +637 40 -0.2354568334953854 +645 40 -0.06302221827154364 +830 40 -0.04448924682778044 +831 40 -0.01012588842917705 +1404 40 -0.3044577534578957 +40 41 1.383167068887948 +41 41 9.853031624281055 +42 41 1.403736321008084 +637 41 -0.06300373927445999 +645 41 -0.2354057522362945 +653 41 -0.06293426355256923 +829 41 -0.02755353814507372 +830 41 0.1539316743938714 +831 41 -0.04346082059680254 +41 42 1.400534788292449 +42 42 9.916177378298613 +43 42 1.400520820281247 +645 42 -0.06292387244120579 +653 42 -0.2354427402792101 +661 42 -0.06292259181467585 +828 42 -0.0251132245074441 +829 42 0.2095304572134697 +830 42 -0.02511350167342161 +42 43 1.403722362320876 +43 43 9.853047468338824 +44 43 1.383186801968901 +653 43 -0.06293509538137457 +661 43 -0.2354062283179365 +669 43 -0.06300355862022741 +827 43 -0.04346023845437186 +828 43 0.1539313727119111 +829 43 -0.02755418698586082 +9 44 1.357257800949301 +43 44 1.39198696570643 +44 44 9.682184005739487 +78 44 -0.06319853582730847 +126 44 -0.09008188136493636 +297 44 -0.9657775016046835 +661 44 -0.06302321488931276 +669 44 -0.2354610931919542 +827 44 -0.0101267733569419 +828 44 -0.0444896335398407 +4 45 -0.1656464612863063 +45 45 4.690757447171112 +46 45 -0.141229597082207 +112 45 0.05991339916145321 +117 45 0.05991710073817418 +461 45 -0.5242093751936762 +782 45 0.3094773973842749 +787 45 -0.1513591355737555 +861 45 0.3094962855952397 +866 45 -0.1513514898703747 +45 46 -0.1341863557114358 +46 46 5.426120361839168 +47 46 -0.130631549770497 +782 46 0.01869159143224336 +787 46 0.5361038586019589 +792 46 -0.1003428839753677 +861 46 0.01868785506013999 +866 46 0.5361337919252518 +871 46 -0.1003367994723139 +46 47 -0.1311542665521928 +47 47 6.252656308804337 +48 47 -0.1389644893876978 +787 47 -0.009978450065271538 +792 47 0.742605738290014 +797 47 -0.06663015193481392 +866 47 -0.009981860642151008 +871 47 0.7426453523623473 +876 47 -0.06662517848564684 +47 48 -0.1424720926879839 +48 48 7.131888841326065 +49 48 -0.1553965050615451 +792 48 -0.03189176425415569 +797 48 0.9378917023497526 +802 48 -0.04336164457257813 +871 48 -0.03189483923474415 +876 48 0.9379405751112382 +881 48 -0.04335857586771605 +11 49 -0.1693697282743812 +29 49 -0.02564805898293518 +35 49 -0.02564524120302508 +48 49 -0.164977111750243 +49 49 8.130850439421675 +373 49 -1.439911393988963 +797 49 -0.05021553968388878 +802 49 1.13818744769823 +876 49 -0.05021829659831037 +881 49 1.138245282654204 +7 50 2059.745754591704 +50 50 12468.10845648159 +51 50 2059.66934892152 +86 50 567.1260336996879 +221 50 -2063.28657959064 +644 50 3450.045997463355 +652 50 567.0857014962787 +50 51 2059.719740632648 +51 51 12467.98916987795 +52 51 2059.7087488938 +644 51 567.1072903698881 +652 51 3449.924051820968 +660 51 567.0867716789161 +51 52 2059.73007838263 +52 52 12468.0384866534 +53 52 2059.730047507529 +652 52 567.0956759898606 +660 52 3449.897899178238 +668 52 567.0955099207483 +52 53 2059.708671321173 +53 53 12467.99153955654 +54 53 2059.720078226832 +660 53 567.0866019666553 +668 53 3449.925106749789 +676 53 567.1076324727632 +10 54 2059.745433690231 +53 54 2059.670165572488 +54 54 12468.10889302084 +85 54 567.1260894436004 +326 54 -2063.286258607685 +668 54 567.0862208860295 +676 54 3450.047160446555 +12 55 2059.736242383563 +55 55 12468.16501585931 +56 55 2059.707883589604 +77 55 567.1147606616231 +402 55 -2063.277244677684 +724 55 3450.00801831477 +732 55 567.0867329491848 +55 56 2059.740809680081 +56 56 12468.35595555905 +57 56 2059.815407994035 +724 56 567.1041550463066 +732 56 3449.972400083065 +740 56 567.107490625022 +56 57 2059.812229127524 +57 57 12468.84082943601 +58 57 2059.912845486956 +732 57 567.1101583774174 +740 57 3450.074149972308 +748 57 567.1387802388518 +57 58 2059.866603710642 +58 58 12469.23185426831 +59 58 2059.964073933725 +740 58 567.123505520398 +748 58 3450.229945731676 +756 58 567.1685314891215 +5 59 2060.019520235252 +58 59 2059.896662120463 +59 59 12469.65920081273 +94 59 567.1950901785907 +250 59 -2063.565412907432 +748 59 567.1429175901527 +756 59 3450.438276959768 +1375 59 -582.1391023524495 +10 60 2059.826319211139 +60 60 12468.39008655996 +61 60 2059.682371870913 +85 60 567.1466825977069 +326 60 -2063.365683206171 +684 60 3450.117827138494 +692 60 567.0887840087685 +60 61 2059.734756863414 +61 61 12467.72410287214 +62 61 2059.605496397946 +684 61 567.1113268049788 +692 61 3449.856251361368 +700 61 567.0603082825802 +61 62 2059.627835552265 +62 62 12467.37627999821 +63 62 2059.611317640234 +692 62 567.069706536072 +700 62 3449.728559397806 +708 62 567.0652992640785 +62 63 2059.588993531472 +63 63 12467.74356797233 +64 63 2059.75852141953 +700 63 567.0558942864272 +708 63 3449.861188722151 +716 63 567.1176431956263 +12 64 2059.832626983834 +63 64 2059.705451883684 +64 64 12468.47963886584 +77 64 567.1482400172154 +402 64 -2063.37188820448 +708 64 567.0948569466012 +716 64 3450.141382552277 +5 65 2060.100392045603 +65 65 12469.93830579468 +66 65 2059.908696054979 +94 65 567.2157377689416 +250 65 -2063.644820926354 +604 65 3450.508374439244 +612 65 567.145409454389 +1027 65 -12342.21121298016 +1028 65 -2063.452832738061 +1375 65 -582.1597201684887 +65 66 2059.97831131298 +66 66 12468.96390375814 +67 66 2059.763439008194 +604 66 567.1720571956114 +612 66 3450.160871104125 +620 66 567.0972152997432 +1027 66 -2063.522384597295 +1028 66 -12341.24077818304 +1029 66 -2063.306555312873 +66 67 2059.810635523674 +67 67 12468.1786014292 +68 67 2059.693440896936 +612 67 567.1129789811807 +620 67 3449.904811894317 +628 67 567.0797786901421 +1028 67 -2063.353985912407 +1029 67 -12340.45618943378 +1030 67 -2063.235428558145 +67 68 2059.695635166765 +68 68 12468.10929894356 +69 68 2059.778655351917 +620 68 567.0766102563073 +628 68 3449.90922118976 +636 68 567.1141952120153 +1029 68 -2063.23816089037 +1030 68 -12340.38203310433 +1031 68 -2063.318529728916 +7 69 2059.822938534598 +68 69 2059.74366480136 +69 69 12468.53113863155 +86 69 567.1370094099839 +221 69 -2063.362370925766 +628 69 567.0957944702874 +636 69 3450.102026524071 +1030 69 -2063.284207954131 +1031 69 -12340.79643924253 +11 70 -0.3566291967421293 +29 70 -0.1110399886569792 +35 70 -0.1110234984551273 +70 70 13.84873943933628 +71 70 1.112497102202125 +373 70 -1.600424508595884 +709 70 2.002924635688845 +710 70 0.1375735417649018 +717 70 2.002919072062026 +718 70 0.1375307546934815 +70 71 0.6046216001874958 +71 71 27.86807980569706 +72 71 4.849461027866649 +709 71 0.02103155376315335 +710 71 4.085808608941285 +711 71 0.7031192950535969 +717 71 0.02105455635503295 +718 71 4.085592436137214 +719 71 0.7030049164776752 +71 72 3.069310895754705 +72 72 68.80966435792395 +73 72 16.46762081882154 +710 72 0.3661621384190946 +711 72 10.31405819789589 +712 72 2.511432332135473 +718 72 0.366171713552343 +719 72 10.31307145956978 +720 72 2.511054121095851 +72 73 10.81021825355873 +73 73 191.0223199122104 +74 73 58.08032761542501 +711 73 1.505488782660899 +712 73 29.39364166960543 +713 73 9.128525729695475 +719 73 1.50538500869281 +720 73 29.39001962732396 +721 73 9.127196529645094 +73 74 35.74205078697776 +74 74 633.9400952320858 +75 74 215.8842965006953 +712 74 5.342375139722915 +713 74 99.90544141608804 +714 74 34.63962959678842 +720 74 5.341779647087505 +721 74 99.89229681793807 +722 74 34.63504612842222 +74 75 132.8791349361244 +75 75 2212.206115112522 +76 75 730.6893374676852 +713 75 20.70156889231576 +714 75 355.4347936956363 +715 75 118.9617303766924 +721 75 20.69897464656649 +722 75 355.3928789306804 +723 75 118.9494062115734 +75 76 484.3356216148452 +76 76 6792.336819534423 +77 76 1964.1049693311 +714 76 77.49194184240636 +715 76 1106.691710160776 +716 76 322.8439355249722 +722 76 77.48328866814063 +723 76 1106.591483063154 +724 76 322.820717286206 +12 77 4138.451871912748 +55 77 684.210902288394 +64 77 684.240198823358 +76 77 1474.142453579468 +77 77 16471.40122624134 +402 77 -4119.819601689769 +715 77 239.8754287586856 +716 77 2708.357451549747 +723 77 239.8551998990304 +724 77 2708.190800513865 +9 78 -0.3566277244392438 +25 78 -0.1110399482897579 +44 78 -0.1110352952302659 +78 78 13.84897192790558 +79 78 1.11253785578638 +297 78 -1.600435110243614 +669 78 2.003011176125715 +670 78 0.1375743852648932 +677 78 2.002926506548222 +678 78 0.1375743592956625 +78 79 0.6046363822198872 +79 79 27.86899354650594 +80 79 4.849675012924271 +669 79 0.0210440583531753 +670 79 4.085940057122428 +671 79 0.7031271846026258 +677 79 0.02103216162806881 +678 79 4.085817812253742 +679 79 0.7031207216254054 +79 80 3.069420972210179 +80 80 68.81283544237866 +81 80 16.46849798119601 +670 80 0.3661878002592049 +671 80 10.31426203194447 +672 80 2.511446974629816 +678 80 0.3661627691508626 +679 80 10.31409261537519 +680 80 2.511441456911148 +80 81 10.81073885767952 +81 81 191.0327038645915 +82 81 58.08356545055089 +671 81 1.505534800282844 +672 81 29.39386673809446 +673 81 9.128493473140963 +679 81 1.505494089781576 +680 81 29.39376918505327 +681 81 9.128562179963035 +81 82 35.74403107058268 +82 82 633.9743842388571 +83 82 215.8949663077062 +672 82 5.342435500550529 +673 82 99.90494625344252 +674 82 34.6391334585688 +680 82 5.34240075279176 +681 82 99.90578389667292 +682 82 34.63970419415789 +82 83 132.8862619784363 +83 83 2212.304688093225 +84 83 730.7148334917497 +673 83 20.70147528612563 +674 83 355.428804023555 +675 83 118.9587660923517 +681 83 20.70163383659584 +682 83 355.4353808265133 +683 83 118.9617493918187 +83 84 484.3562018561639 +84 84 6792.531741506797 +85 84 1964.139330304725 +674 84 77.4905839071599 +675 84 1106.660902958104 +676 84 322.8328067461002 +682 84 77.49205411872413 +683 84 1106.690969322752 +684 84 322.8432894809002 +10 85 4138.454545472554 +54 85 684.2114189030273 +60 85 684.2380806131653 +84 85 1474.180207305184 +85 85 16471.59497087987 +326 85 -4119.822485517585 +675 85 239.8684415954846 +676 85 2708.257101386976 +683 85 239.8751747951346 +684 85 2708.350522532819 +7 86 4138.451690162197 +50 86 684.2114832424827 +69 86 684.2393719304555 +86 86 16471.40301712106 +87 86 1474.142699978236 +221 86 -4119.819421299909 +635 86 239.8627451692029 +636 86 2708.292276321311 +643 86 239.8681139559966 +644 86 2708.256520908901 +1031 86 -688.6074933128615 +86 87 1964.105457795088 +87 87 6792.337299158877 +88 87 484.3355626694851 +634 87 77.4849741700754 +635 87 1106.625021796459 +636 87 322.8323303934642 +642 87 77.4902186507136 +643 87 1106.658708771451 +644 87 322.8326618012255 +87 88 730.6892542525786 +88 88 2212.20592433213 +89 88 132.879141581088 +633 88 20.69920133343211 +634 88 355.4004778099771 +635 88 118.9527008206183 +641 88 20.70134008076031 +642 88 355.4270580038614 +643 88 118.9583801117612 +88 89 215.8842900757697 +89 89 633.9401560499936 +90 89 35.74205817644544 +632 89 5.341759453264388 +633 89 99.89344628394589 +634 89 34.63572469582807 +640 89 5.34239956817663 +641 89 99.90430690379249 +642 89 34.63894289327896 +1491 89 -41.56049478695004 +89 90 58.08033951012708 +90 90 191.0223452215952 +91 90 10.81021687170467 +631 90 1.505349569527055 +632 90 29.39001392558506 +633 90 9.127290974742419 +639 90 1.505523110325893 +640 90 29.39366054105675 +641 90 9.128438309073367 +1462 90 -14.55249951459606 +1491 90 -174.8601060827103 +90 91 16.46762119384311 +91 91 68.80965606691062 +92 91 3.069310630096887 +630 91 0.3661489083525724 +631 91 10.31293706512222 +632 91 2.511059382796079 +638 91 0.3661849336622879 +639 91 10.31418900440334 +640 91 2.511427617112762 +1433 91 -5.6839758840605 +1462 91 -59.29879399466734 +1491 91 -20.33495488141273 +91 92 4.849460051395157 +92 92 27.86808013001929 +93 92 0.6046216339871038 +629 92 0.02104236643212198 +630 92 4.085484282628613 +631 92 0.7030005433746379 +637 92 0.0210434378597345 +638 92 4.085916454596793 +639 92 0.7031225873436444 +1404 92 -2.663148074237141 +1433 92 -21.63501915638009 +1462 92 -7.545756170199295 +8 93 -0.3566289985713896 +34 93 -0.1110281343085668 +40 93 -0.111035056440297 +92 93 1.112497241747741 +93 93 13.848738943747 +163 93 -1.600424507865732 +629 93 2.002840569857389 +630 93 0.1375314306053521 +637 93 2.003002982689312 +638 93 0.1375732968176112 +886 93 -0.2840207511288262 +1404 93 -8.963682602004644 +1433 93 -3.235504324238293 +5 94 4139.011374763827 +59 94 684.300860916914 +65 94 684.3274385257236 +94 94 16472.92831970991 +95 94 1474.138379494723 +250 94 -4120.377688444899 +603 94 239.8683415056185 +604 94 2708.562978659458 +755 94 239.8615681880077 +756 94 2708.46920375935 +1027 94 -688.6973490416195 +1346 94 -1498.230743344126 +1375 94 -16320.86007055337 +94 95 1964.175024080872 +95 95 6792.003833440504 +96 95 484.2412935772089 +602 95 77.47387024675201 +603 95 1106.606265768603 +604 95 322.8487829744587 +754 95 77.47243610271533 +755 95 1106.576339919816 +756 95 322.8381507092121 +1317 95 -501.7975239319637 +1346 95 -6681.542830783881 +1375 95 -1990.832854414068 +95 96 730.5914441791922 +96 96 2211.68881932327 +97 96 132.829412184268 +601 96 20.69281677632767 +602 96 355.3387166323111 +603 96 118.9421500541597 +753 96 20.69264197685825 +754 96 355.3321724481211 +755 96 118.9392634421176 +1288 96 -143.1731806216343 +1317 96 -2148.351252023842 +1346 96 -748.9327550392277 +96 97 215.8135960808225 +97 97 633.6942702608642 +98 97 35.72443684681734 +600 97 5.339408236019093 +601 97 99.86269549363507 +602 97 34.62710831443441 +752 97 5.339447531335562 +753 97 99.86181821263037 +754 97 34.6265080276709 +1259 97 -41.54188955131538 +1288 97 -602.1853169093564 +1317 97 -226.359888812521 +97 98 58.05267325520322 +98 98 190.9349363871319 +99 98 10.80400087747323 +599 98 1.504476919106611 +600 98 29.37906227543695 +601 98 9.123901753524747 +751 98 1.504517298874548 +752 98 29.37916684506921 +753 98 9.123837114709454 +1230 98 -14.54607080594193 +1259 98 -174.7769478426497 +1288 98 -63.99666964394493 +98 99 16.45805714800353 +99 99 68.77939270761519 +100 99 3.066889438029545 +598 99 0.3657757618544983 +599 99 10.3092027014375 +600 99 2.509929384266325 +750 99 0.3657996500898966 +751 99 10.30936860313437 +752 99 2.509932861133049 +1201 99 -5.681790552256384 +1230 99 -59.2699564128045 +1259 99 -20.325223116155 +99 100 4.845899003919193 +100 100 27.85771705451198 +101 100 0.6033426292650268 +597 100 0.02082690490584466 +598 100 4.084227504023675 +599 100 0.7025991419629813 +749 100 0.02083901132916316 +750 100 4.084348387419624 +751 100 0.7026049340745424 +1172 100 -2.662376474180975 +1201 100 -21.62457233359131 +1230 100 -7.542471665549258 +6 101 -0.3576461027314843 +30 101 -0.1112060089468309 +39 101 -0.1112012986719457 +100 101 1.110855113122687 +101 101 13.84507721102213 +192 101 -1.600154045946165 +597 101 2.002418402634854 +598 101 0.1373510604956099 +749 101 2.002503748389846 +750 101 0.1373512297753369 +882 101 -0.2839848864542718 +1172 101 -8.959096575106239 +1201 101 -3.23440011402683 +1 102 0.1376040742709501 +102 102 4.616984859362741 +103 102 0.1795409190194175 +116 102 -0.07201384204387301 +132 102 0.06404188674483505 +490 102 -0.5084661662789494 +757 102 0.1760771098115691 +758 102 -0.07204721082828251 +835 102 -0.1327571433761293 +836 102 0.03754729547331828 +102 103 0.1773638444000405 +103 103 4.790545301403403 +104 103 0.2001247397276462 +757 103 -0.07205484392084456 +758 103 0.1762754689687737 +759 103 -0.07208193125532861 +834 103 -0.06663178709482254 +835 103 0.1830237079146913 +836 103 0.02164631681242225 +103 104 0.1986949022374284 +104 104 4.85491986334884 +105 104 0.1986948424319221 +758 104 -0.07208589756651086 +759 104 0.1763612715382518 +760 104 -0.07208589485589119 +833 104 -0.01833785365179672 +834 104 0.229033218698288 +835 104 -0.01833784934041469 +104 105 0.2001247442173684 +105 105 4.790544502524467 +106 105 0.1773637838921091 +759 105 -0.07208192682974987 +760 105 0.1762754342506587 +761 105 -0.0720548364136714 +832 105 0.02164630601447254 +833 105 0.1830236507134013 +834 105 -0.06663178187712931 +2 106 0.1376040235222717 +105 106 0.179540867070209 +106 106 4.616983856184406 +107 106 -0.07201383392780393 +127 106 0.06404186821061114 +548 106 -0.5084660311905018 +760 106 -0.07204720317207186 +761 106 0.1760770635080474 +832 106 0.03754725033420006 +833 106 -0.1327571234408388 +2 107 0.1376076977380736 +106 107 -0.07201383425602333 +107 107 4.616990954816643 +108 107 0.1795438693407594 +127 107 0.06403958894604386 +548 107 -0.508466548416447 +761 107 0.176077060033862 +766 107 -0.07204720429107012 +810 107 -0.132750590530716 +811 107 0.03755255441489727 +107 108 0.1773666142093763 +108 108 4.790546672834591 +109 108 0.2001225488961791 +761 108 -0.07205483781861272 +766 108 0.1762754305044042 +771 108 -0.07208192599924386 +809 108 -0.06663191883459117 +810 108 0.1830272889156454 +811 108 0.02164250169156322 +108 109 0.1986928653856718 +109 109 4.854914036990391 +110 109 0.1986926712964698 +766 109 -0.07208589292921735 +771 109 0.1763612452603174 +776 109 -0.07208589214482435 +808 109 -0.0183427509969763 +809 109 0.2290343116924439 +810 109 -0.01834160501860135 +109 110 0.2001223266286244 +110 110 4.790548200047711 +111 110 0.1773675823980916 +771 110 -0.07208192433846661 +776 110 0.1762754156385156 +781 110 -0.07205483547143698 +807 110 0.02164192064465033 +808 110 0.1830284461368767 +809 110 -0.06663125116155247 +3 111 0.137607923919047 +110 111 0.1795449374757108 +111 111 4.616991670990267 +121 111 -0.07201383244239103 +122 111 0.06403940581931471 +519 111 -0.508466580127685 +776 111 -0.07204720212573906 +781 111 0.1760770454426365 +807 111 0.03755309904353651 +808 111 -0.1327485471017718 +4 112 0.1376076999266112 +45 112 0.06403958797191503 +112 112 4.616990854668873 +113 112 0.1795438669378012 +117 112 -0.07201383395261579 +461 112 -0.5084665446162058 +772 112 -0.07204720366524341 +777 112 0.1760770624471857 +860 112 -0.1327505873789072 +861 112 0.03755254659319771 +112 113 0.1773666069053753 +113 113 4.790546690237576 +114 113 0.2001225862085208 +767 113 -0.0720819272338953 +772 113 0.1762754369205322 +777 113 -0.07205483715344922 +859 113 -0.06663191866112109 +860 113 0.183027289473022 +861 113 0.02164249973967484 +113 114 0.1986928601322778 +114 114 4.854914583238099 +115 114 0.1986927444731628 +762 114 -0.07208589819083643 +767 114 0.1763612762917972 +772 114 -0.07208589544894353 +858 114 -0.01834274703841766 +859 114 0.2290343525064279 +860 114 -0.0183416062065872 +114 115 0.2001223581167651 +115 115 4.790549255815785 +116 115 0.1773676510451824 +757 115 -0.07205484474207605 +762 115 0.1762754714570968 +767 115 -0.07208193167133786 +857 115 0.02164193177129194 +858 115 0.1830285157980602 +859 115 -0.0666312573695491 +1 116 0.1376079838768766 +102 116 -0.07201384207940079 +115 116 0.1795450033236603 +116 116 4.616992822458139 +132 116 0.0640394258241444 +490 116 -0.5084667362295995 +757 116 0.1760771083924278 +762 116 -0.07204721139557391 +857 116 0.03755314447569469 +858 116 -0.1327485688598733 +4 117 0.1376040213492507 +45 117 0.06404186919123206 +112 117 -0.07201383423343873 +117 117 4.616983956616262 +118 117 0.1795408694874574 +461 117 -0.5084660350305229 +777 117 0.1760770611071024 +778 117 -0.07204720379998801 +782 117 0.03754725817221835 +783 117 -0.1327571265988981 +117 118 0.1773637912129275 +118 118 4.790544485367791 +119 118 0.2001247069409705 +777 118 -0.07205483708095345 +778 118 0.1762754278444121 +779 118 -0.07208192559633152 +782 118 0.02164630797009082 +783 118 0.183023650169766 +784 118 -0.06663178198248675 +118 119 0.1986948477400551 +119 119 4.854919317085568 +120 119 0.1986948290078097 +778 119 -0.07208589233703402 +779 119 0.1763612405092255 +780 119 -0.07208589152002694 +783 119 -0.01833785247170849 +784 119 0.2290331778811396 +785 119 -0.01833785329194304 +119 120 0.2001247081983469 +120 120 4.79054424544299 +121 120 0.1773637757504082 +779 120 -0.07208192392168025 +780 120 0.1762754131471183 +781 120 -0.07205483464928267 +784 120 -0.06663178095539844 +785 120 0.183023638242859 +786 120 0.02164630568369899 +3 121 0.1376040143149878 +111 121 -0.07201383240663574 +120 121 0.179540853158614 +121 121 4.616983707823446 +122 121 0.06404186673909884 +519 121 -0.5084660101750577 +780 121 -0.07204720155776188 +781 121 0.1760770468616451 +785 121 -0.1327571216133563 +786 121 0.03754725003646275 +3 122 -0.1656463958917221 +111 122 0.05991314513019528 +121 122 0.05991709731436123 +122 122 4.690758835471963 +123 122 -0.1412297260232305 +519 122 -0.5242094668601123 +786 122 0.3094773769960711 +791 122 -0.1513591322252213 +807 122 0.3094975510424035 +812 122 -0.1513510233368467 +122 123 -0.1341865023017739 +123 123 5.426123760323127 +124 123 -0.1306317735902068 +786 123 0.0186915894533634 +791 123 0.5361038371835567 +796 123 -0.1003428829955384 +807 123 0.01868756416505116 +812 123 0.5361358217713679 +817 123 -0.1003363177428015 +123 124 -0.1311545170856195 +124 124 6.252662144429522 +125 124 -0.1389648253570377 +791 124 -0.009978451070185343 +796 124 0.7426057213888532 +801 124 -0.06663015151511437 +812 124 -0.009982142115041934 +817 124 0.7426481830265936 +822 124 -0.06662496459910819 +124 125 -0.142472438557276 +125 125 7.131896273482799 +126 125 -0.1553968497026036 +796 125 -0.03189176455518145 +801 125 0.9378916903222322 +806 125 -0.04336164400073739 +817 125 -0.03189496065747602 +822 125 0.9379438567831235 +827 125 -0.04335828693932622 +9 126 -0.1693699635702821 +25 126 -0.02564805443330515 +44 126 -0.02564492221351947 +125 126 -0.1649775127705707 +126 126 8.130860890089071 +297 126 -1.43991397829852 +801 126 -0.05021553995243158 +806 126 1.138187456289417 +822 126 -0.05021849051399613 +827 126 1.138249620840934 +2 127 -0.1656464612830001 +106 127 0.0599170992148529 +107 127 0.05991340068009354 +127 127 4.690757446944494 +128 127 -0.1412295970859001 +548 127 -0.5242093751690875 +811 127 0.3094963047041847 +816 127 -0.1513514932556642 +832 127 0.3094773782384649 +837 127 -0.1513591321772476 +127 128 -0.1341863557102023 +128 128 5.426120361495467 +129 128 -0.1306315497773652 +811 128 0.01868785659470584 +816 128 0.5361338177479218 +821 128 -0.1003368011080943 +832 128 0.0186915898940314 +837 128 0.5361038327042777 +842 128 -0.100342882332222 +128 129 -0.1311542665523536 +129 129 6.252656308178697 +130 129 -0.1389644894115734 +816 129 -0.009981859815405253 +821 129 0.7426453707616399 +826 129 -0.06662517911985488 +837 129 -0.009978450893904423 +842 129 0.742605719737033 +847 129 -0.06663015129398497 +129 130 -0.1424720926586869 +130 130 7.131888840530225 +131 130 -0.15539650493355 +821 130 -0.03189483673321525 +826 130 0.9379405785499229 +831 130 -0.04335856943601404 +842 130 -0.03189176674593644 +847 130 0.9378916987136237 +852 130 -0.04336165097326836 +8 131 -0.1693697266350956 +34 131 -0.02564814320421271 +40 131 -0.02564515637903511 +130 131 -0.1649771118629304 +131 131 8.130850445159151 +163 131 -1.439911398572839 +826 131 -0.05021830086039192 +831 131 1.138245579663616 +847 131 -0.05021553545553456 +852 131 1.138187152631994 +886 131 -0.2527252686940614 +1 132 -0.1656464101417727 +102 132 0.05991711502402364 +116 132 0.05991316283825131 +132 132 4.690760139279686 +133 132 -0.1412297183674072 +490 132 -0.524209641481223 +836 132 0.309477484268106 +841 132 -0.1513591605073424 +857 132 0.3094976583101485 +862 132 -0.1513510516154259 +132 133 -0.1341864992949587 +133 133 5.426125381178751 +134 133 -0.1306317460551309 +836 133 0.01869160032393911 +841 133 0.5361040158275632 +846 133 -0.1003428991219347 +857 133 0.01868757503412702 +862 133 0.5361360004015512 +867 133 -0.1003363338660438 +133 134 -0.1311545117657776 +134 134 6.25266482879554 +135 134 -0.1389647257252715 +841 134 -0.009978446227786333 +846 134 0.7426060549963245 +851 134 -0.06663016502584748 +862 134 -0.009982137273451208 +867 134 0.7426485165625079 +872 134 -0.06662497810578918 +134 135 -0.1424725505880881 +135 135 7.131899844322222 +136 135 -0.1553973148909539 +846 135 -0.03189178418549504 +851 135 0.9378921574786279 +856 135 -0.04336170170896886 +867 135 -0.0318949802796131 +872 135 0.9379443238890168 +877 135 -0.04335834460692647 +6 136 -0.1693767371463448 +30 136 -0.0256489909264899 +39 136 -0.02564585784694287 +135 136 -0.1649771089992861 +136 136 8.130838401906562 +192 136 -1.439894949522332 +851 136 -0.0502154839871797 +856 136 1.138184422410097 +872 136 -0.05021843459804073 +877 136 1.138246589968427 +882 136 -0.2527222873374144 +13 137 -9554.286207751386 +137 137 25027.34307049277 +138 137 -11244.63194113147 +158 137 -1949.134296974191 +220 137 -3193.184896498882 +440 137 -1949.165801012251 +1022 137 -651.12332756247 +1200 137 8254.981539868817 +1229 137 -3772.875866400086 +137 138 -10979.09556706154 +138 138 35600.26977347695 +139 138 -15831.35645870306 +1200 138 -3677.129573494191 +1229 138 11638.03033870848 +1258 138 -5344.850657772398 +138 139 -15403.43315154522 +139 139 56371.68547721946 +140 139 -22292.70418987219 +1229 139 -5182.098282420424 +1258 139 18160.38906104169 +1287 139 -7619.100732521988 +139 140 -21618.77419756651 +140 140 91651.36723346286 +141 140 -31444.821660093 +1258 140 -7337.5906764667 +1287 140 28788.57111945501 +1316 140 -11012.67492393132 +140 141 -30421.56636985946 +141 141 152993.0112426353 +142 141 -44390.96000909999 +1287 141 -10507.50222677993 +1316 141 45981.92951704157 +1345 141 -16322.5426858919 +141 142 -42947.30217793079 +142 142 262162.0977929355 +143 142 -62161.72357790398 +1316 142 -15358.79521652892 +1345 142 72845.47396722523 +1374 142 -25178.93642819249 +142 143 -60474.37351601644 +143 143 461502.429503118 +144 143 -84036.54555113817 +1345 143 -23180.85724590192 +1374 143 111119.4845594787 +1403 143 -41222.24434858262 +14 144 149164.360183912 +143 144 -83310.11627028574 +144 144 799017.8217839847 +145 144 -11670.79672856817 +278 144 15663.11009848755 +435 144 -11673.47774259945 +1167 144 -9377.830600701869 +1374 144 -36702.17612471414 +1403 144 144613.5198696139 +14 145 3172.999954023224 +144 145 -63367.98273914785 +145 145 744026.9140920654 +146 145 3173.822392519804 +278 145 -15550.9621938771 +1167 145 144627.590527218 +1168 145 -15549.76704162076 +1403 145 -25141.82328473132 +145 146 3173.869838435654 +146 146 744007.7864919254 +147 146 3176.54706549595 +1167 146 -15550.16020767318 +1168 146 144627.6176937286 +1169 146 -15547.58216314205 +146 147 3176.513046474298 +147 147 743984.8436640174 +148 147 3180.614204111269 +1168 147 -15548.11290937871 +1169 147 144628.0160896893 +1170 147 -15545.07176191491 +147 148 3179.926912057716 +148 148 743977.2415478821 +149 148 3191.146726478117 +1169 148 -15545.68652964467 +1170 148 144630.4333519302 +1171 148 -15541.35137414025 +15 149 3193.833933500806 +148 149 3190.290306154151 +149 149 743977.5431110637 +157 149 -63361.17151167501 +249 149 -15539.98797754355 +1170 149 -15541.86396938555 +1171 149 144632.9388210942 +16 150 -9554.598935006172 +150 150 25033.36263658776 +151 150 -11246.59571511324 +162 150 -1949.158577439321 +191 150 -3193.295827576751 +292 150 -1949.34463875942 +1026 150 -651.1324652993129 +1432 150 8256.909983880272 +1461 150 -3773.550836286401 +150 151 -10981.06786927407 +151 151 35610.28455586583 +152 151 -15832.86380813464 +1432 151 -3677.802624886757 +1461 151 11641.20133660838 +1490 151 -5345.395391470617 +151 152 -15404.96241343188 +152 152 56384.07941357242 +153 152 -22293.38625199759 +1461 152 -5182.640840271994 +1490 152 18164.18313523656 +152 153 -21619.47924171744 +153 153 91665.71338189949 +154 153 -31444.56359069486 +1490 153 -7337.89058294991 +153 154 -30421.27744609873 +154 154 153006.955390327 +155 154 -44390.27078044248 +154 155 -42946.36654202372 +155 155 262168.4037363792 +156 155 -62163.03032027859 +155 156 -60474.74065722311 +156 156 461481.916321088 +157 156 -84047.09627836503 +15 157 149137.6627569456 +149 157 -11661.25184949228 +156 157 -83317.67062590446 +157 157 798926.5832661435 +249 157 15662.72669694831 +279 157 -11666.09193720383 +1171 157 -9373.404935077982 +13 158 1927.254421585776 +137 158 -1795.716279970448 +158 158 20438.3166626534 +159 158 1819.490742515757 +220 158 633.7739102221142 +596 158 -1612.789897779303 +1022 158 6756.363626462803 +1023 158 596.4235047094963 +1200 158 -600.2368444189048 +158 159 1786.294825241003 +159 159 21008.55460664557 +160 159 1775.980096291618 +1022 159 585.8478236808282 +1023 159 6940.795990280069 +1024 159 581.3621358551814 +159 160 1764.515872902429 +160 160 21263.43161316716 +161 160 1764.490428327093 +1023 160 577.7162592083405 +1024 160 7023.526590710759 +1025 160 577.7058903108496 +160 161 1775.850169926767 +161 161 21010.26222321887 +162 161 1786.131380562155 +1024 161 581.3180758117705 +1025 161 6941.350077879247 +1026 161 585.7895761828916 +16 162 1927.049068235755 +150 162 -1795.800719433119 +161 162 1819.260926378338 +162 162 20441.15236447871 +191 162 633.7009753828927 +591 162 -1613.047135958875 +1025 162 596.3438096953662 +1026 162 6757.284327806958 +1432 162 -600.2664995549054 +8 163 -5.354474243083514 +34 163 -1.003429357714198 +40 163 -1.003478465114009 +93 163 -1.762497326660626 +131 163 -1.329739455014391 +163 163 19.38522707896297 +164 163 -4.816828678776798 +629 163 -0.301107738450704 +637 163 -0.3011215833851735 +831 163 -0.2464157847207304 +852 163 -0.2464062351845061 +886 163 2.748899896818019 +891 163 -0.9320583281772695 +1404 163 -0.8685030389215539 +1405 163 -1.811423918698045 +163 164 -4.866761944658649 +164 164 20.06525378412905 +165 164 -4.102699999934052 +886 164 -0.9364605518510647 +891 164 2.745081567438488 +896 164 -0.8293059686198365 +1404 164 -1.790282047483217 +1405 164 -1.743476887691911 +1406 164 -1.777203100387678 +164 165 -4.099197391936075 +165 165 20.30296847097866 +166 165 -3.355355896924728 +891 165 -0.8287912872615293 +896 165 2.68098729135336 +901 165 -0.720544256812389 +1405 165 -1.780627132237387 +1406 165 -2.551093203415433 +1407 165 -1.774825118947077 +165 166 -3.390782430089146 +166 166 21.05070201852823 +167 166 -2.605086189858059 +896 166 -0.7235398589653887 +901 166 2.667657343023346 +906 166 -0.6204554803537493 +1406 166 -1.759512112839814 +1407 166 -3.52136435925456 +1408 166 -1.848298473060544 +166 167 -2.657140031822775 +167 167 22.53072154412798 +168 167 -1.918367542594191 +901 167 -0.6249279462605064 +906 167 2.738513632174447 +911 167 -0.5367914884414339 +1407 167 -1.824990048383936 +1408 167 -4.672518567396688 +1409 167 -1.980988008892518 +167 168 -1.995740361447544 +168 168 24.78679565618624 +169 168 -1.121831537332806 +906 168 -0.5434875267116435 +911 168 2.891734108928127 +916 168 -0.4470588891766676 +1408 168 -1.945669254119474 +1409 168 -6.069322280745711 +1410 168 -2.194962805020849 +168 169 -1.241976260070217 +169 169 28.13556323100791 +170 169 -0.2438236353966714 +911 169 -0.4574983624052868 +916 169 3.153121842960743 +921 169 -0.3592764783928221 +1409 169 -2.139594393971612 +1410 169 -7.876179366065729 +1411 169 -2.518176866734722 +169 170 -0.4345453584426989 +170 170 33.07443046679577 +171 170 0.8509902552598986 +916 170 -0.3758825799839928 +921 170 3.571333812333719 +926 170 -0.2613843874433996 +1410 170 -2.429905404508707 +1411 170 -10.2841988034906 +1412 170 -3.010941873723407 +170 171 0.5369271447702889 +171 171 40.57833581687471 +172 171 2.373225582182524 +921 171 -0.2887676628387967 +926 171 4.232761575716301 +931 171 -0.1364254506573959 +1411 171 -2.86538502479408 +1412 171 -13.7370034381787 +1413 171 -3.781243270226127 +171 172 1.84278674076749 +172 172 52.14031103998153 +173 172 4.550554977155305 +926 172 -0.182709763383598 +931 172 5.276956976080596 +936 172 0.02776254406691459 +1412 172 -3.535500997168158 +1413 172 -18.85365935385363 +1414 172 -4.992407792938282 +172 173 3.624156650861033 +173 173 70.97243554160822 +174 173 8.271625710877686 +931 173 -0.05312344001838071 +936 173 6.992212581339809 +941 173 0.3090842273038528 +1413 173 -4.563756646169663 +1414 173 -27.05950873560005 +1415 173 -7.052142477225654 +173 174 6.604364705070902 +174 174 102.3210444550226 +175 174 14.3943280679831 +936 174 0.1634347500701157 +941 174 9.858819383334946 +946 174 0.7609401695911192 +1414 174 -6.28216088565105 +1415 174 -40.60128047136918 +1416 174 -10.51703134250887 +174 175 11.30153895163608 +175 175 158.0762732840821 +176 175 26.35850345452707 +941 175 0.4905828478588972 +946 175 14.94131027580103 +951 175 1.682640588350711 +1415 175 -9.091610980481931 +1416 175 -64.76116761649452 +1417 175 -16.98119886830184 +175 176 20.44477920122451 +176 176 258.7150059228943 +177 176 48.04003921496069 +946 176 1.165157743554267 +951 176 24.09281519063478 +956 176 3.360872291999022 +1416 176 -14.26146281393138 +1417 176 -108.4863911872011 +1418 176 -28.62647752993839 +176 177 36.52177349392895 +177 177 451.9221688367301 +178 177 93.33157125709619 +951 177 2.351299668310344 +956 177 41.57153610890909 +961 177 7.011655831873148 +1417 177 -23.3374329902288 +1418 177 -193.1550407741933 +1419 177 -51.89962935680337 +177 178 70.54843313609166 +178 178 819.3617862862696 +179 178 177.7030243254773 +956 178 5.008439799077522 +961 178 74.7420638559401 +966 178 13.90542516913445 +1418 178 -41.44147704129589 +1419 178 -355.3304896355775 +1420 178 -94.8499254360912 +178 179 133.8630916997481 +179 179 1523.903297859795 +180 179 343.4132949488232 +961 179 10.03034326093767 +966 179 138.2978782965684 +971 179 27.86523642355952 +1419 179 -74.67655131916723 +1420 179 -669.7133622844434 +1421 179 -177.2554531407973 +179 180 263.5806461887702 +180 180 2785.194017087349 +181 180 616.4889947855993 +966 180 20.74251934319387 +971 180 252.4934976022893 +976 180 51.36943564757107 +1420 180 -140.2385668343271 +1421 180 -1240.482112886366 +1422 180 -312.9919863838732 +180 181 489.7846560293375 +181 181 4824.103360237683 +182 181 1029.185926730898 +971 181 39.90479172738276 +976 181 438.5103253546263 +981 181 87.94432499818924 +1421 181 -253.3487860028947 +1422 181 -2181.551670306439 +1423 181 -517.4303899291544 +181 182 863.5444040420142 +182 182 7608.04243930245 +183 182 1518.855274987656 +976 182 72.67702965321175 +981 182 695.182403520163 +986 182 132.4079359104696 +1422 182 -437.6659486363092 +1423 182 -3497.007423412901 +1424 182 -761.4171972783802 +182 183 1349.693238592548 +183 183 10802.15780179415 +184 183 2045.645584120512 +981 183 116.5160832485945 +986 183 992.4767116605922 +991 183 181.2261265277071 +1423 183 -677.8366637252871 +1424 183 -5040.762999067204 +1425 183 -1022.521052340583 +183 184 1907.328739899418 +184 184 14034.18708563806 +185 184 2549.906238440891 +986 184 168.0249215124443 +991 184 1294.522147254587 +996 184 228.4648007936016 +1424 184 -952.6178916552054 +1425 184 -6627.156616212798 +1426 184 -1270.325430239165 +184 185 2455.062139358597 +185 185 17107.1241981347 +186 185 3040.632497849249 +991 185 219.317853050405 +996 185 1581.281622439428 +1001 185 274.5686412768749 +1425 185 -1221.629065397193 +1426 185 -8144.251285238764 +1427 185 -1508.481365989016 +185 186 2982.786407522434 +186 186 20136.4918654697 +187 186 3547.838492001959 +996 186 268.9576662920867 +1001 186 1862.572766285348 +1006 186 322.126508124274 +1426 186 -1478.509774270872 +1427 186 -9636.871056886173 +1428 186 -1752.231639096319 +186 187 3515.517388024268 +187 187 23179.00438566532 +188 187 4054.705767761151 +1001 187 318.9835819624946 +1006 187 2143.852710897084 +1011 187 369.4994267790022 +1427 187 -1735.419689388946 +1428 187 -11129.09832545861 +1429 187 -1994.906430090398 +187 188 4037.785264971398 +188 188 26482.730955682 +189 188 4655.985436669706 +1006 188 367.853130638831 +1011 188 2448.41909286072 +1016 188 425.508771696413 +1428 188 -1986.10488490995 +1429 188 -12742.08022020591 +1430 188 -2282.424671983891 +188 189 4647.496757209137 +189 189 30031.99657925473 +190 189 5247.749365696203 +1011 189 424.6831963770314 +1016 189 2775.233313840089 +1021 189 480.501999960151 +1429 189 -2278.022517541741 +1430 189 -14469.82374873579 +1431 189 -2565.798216553361 +189 190 5243.41154956396 +190 190 34093.15020803076 +191 190 6020.67233722092 +1016 190 480.080522658366 +1021 190 3149.087426784808 +1026 190 552.1929188088438 +1430 190 -2563.562816692356 +1431 190 -16442.85526942523 +1432 190 -2936.51502645559 +16 191 6772.486572749077 +150 191 -3276.608078352928 +162 191 624.3752352562162 +190 191 6018.204436135361 +191 191 38545.46092743811 +292 191 624.4422683463806 +591 191 -2480.422413494674 +1021 191 551.9533466611516 +1026 191 3558.984472235373 +1431 191 -2935.253444472714 +1432 191 -18603.58383561414 +6 192 -5.352912156637935 +30 192 -1.003168865551613 +39 192 -1.003206888153929 +101 192 -1.762133189993272 +136 192 -1.329734854232379 +192 192 19.38333241512637 +193 192 -4.815265558675383 +597 192 -0.3010362517776369 +749 192 -0.3010489570935116 +856 192 -0.2464051873514856 +877 192 -0.2464153046323406 +882 192 2.748709408139493 +887 192 -0.9317929968024418 +1172 192 -0.870850098277669 +1173 192 -1.811109840195083 +192 193 -4.865200944199321 +193 193 20.06366465307101 +194 193 -4.101236188324824 +882 193 -0.9361966575730382 +887 193 2.744964895020853 +892 193 -0.8290533841056736 +1172 193 -1.789962265128685 +1173 193 -1.745972545426245 +1174 193 -1.777001081142187 +193 194 -4.097740340149448 +194 194 20.30188559913304 +195 194 -3.35400354595394 +887 194 -0.8285391204815593 +892 194 2.68096434490996 +897 194 -0.7203061981696857 +1173 194 -1.78042121488202 +1174 194 -2.553716041783314 +1175 194 -1.774730048168184 +194 195 -3.389437399073881 +195 195 21.0501386630585 +196 195 -2.603787210931257 +892 195 -0.7233032787057908 +897 195 2.667738328620322 +902 195 -0.6202212271521803 +1174 195 -1.759409251790448 +1175 195 -3.524209080442869 +1176 195 -1.848310192889344 +195 196 -2.655850397950008 +196 196 22.53066234542764 +197 196 -1.91707775357993 +897 196 -0.6246957704544789 +902 196 2.738704266876508 +907 196 -0.5365531766134933 +1175 196 -1.824991102726721 +1176 196 -4.675705205337961 +1177 196 -1.981104788806022 +196 197 -1.994463415496564 +197 197 24.78727992565668 +198 197 -1.120516096999473 +902 197 -0.5432522344652044 +907 197 2.892049614154174 +912 197 -0.4468088355178778 +1176 197 -1.945770743148026 +1177 197 -6.07298251786632 +1178 197 -2.195207475272365 +197 198 -1.240679594046587 +198 198 28.13668727641449 +199 198 -0.2424296571723337 +907 198 -0.4572529180858473 +912 198 3.153591441540543 +917 198 -0.3590036150632166 +1177 198 -2.139815965547161 +1178 198 -7.880502784868465 +1179 198 -2.518575054677205 +198 199 -0.4331800324915577 +199 199 33.07634025940654 +200 199 0.8525326557416246 +912 199 -0.3756169533569398 +917 199 3.572001123791921 +922 199 -0.2610729500305965 +1178 199 -2.430267518337153 +1179 199 -10.28945856392194 +1180 199 -3.011544158700568 +199 200 0.5384240929177155 +200 200 40.58130493852809 +201 200 2.375020889695132 +917 200 -0.2884680119747349 +922 200 4.233705125784692 +927 200 -0.1360507401827329 +1179 200 -2.865928827870656 +1180 200 -13.74364707408619 +1181 200 -3.782140663575174 +200 201 1.844507385517758 +201 201 52.1447724915279 +202 201 4.552768302035364 +922 201 -0.1823547867480159 +927 201 5.27830207235001 +932 201 0.02823984540343122 +1180 201 -3.536300668364476 +1181 201 -18.86239134825659 +1182 201 -4.993741268530789 +201 202 3.626243531846994 +202 202 70.97920380521546 +203 202 8.274537573474307 +927 202 -0.05268025703569401 +932 202 6.994193951013836 +937 202 0.309735617102388 +1181 202 -4.56492150263013 +1182 202 -27.07159637119956 +1183 202 -7.054210902364107 +202 203 6.607055954031458 +203 203 102.3314830642437 +204 203 14.39840414041518 +932 203 0.1640253883381472 +937 203 9.861839279987391 +942 203 0.7618850284563982 +1182 203 -6.283929420260367 +1183 203 -40.61888176073073 +1184 203 -10.52030347974082 +203 204 11.30522177577824 +204 204 158.0930320821598 +205 204 26.36461740154382 +937 204 0.4914165269553831 +942 204 14.94616541976699 +947 204 1.684120911724599 +1183 204 -9.09433526741272 +1184 204 -64.78845751625096 +1185 204 -16.98672750127655 +204 205 20.45018437674245 +205 205 258.7425640889904 +206 205 48.04960120430884 +942 205 1.16642944585447 +947 205 24.1009394354933 +952 205 3.363300842832699 +1184 205 -14.26596767420742 +1185 205 -108.5308270564536 +1186 205 -28.63594939614118 +205 206 36.53007732403236 +206 206 451.9688576285108 +207 206 93.34710185301213 +947 206 2.353332605136838 +952 206 41.58584754430145 +957 206 7.015899248480373 +1185 206 -23.34497984554277 +1186 206 -193.2314121185792 +1187 206 -51.91675235083445 +206 207 70.56189735826835 +207 207 819.4389242005981 +208 207 177.7272554756841 +952 207 5.01193525783258 +957 207 74.76772318842895 +962 207 13.91283925839186 +1186 207 -41.45503978968152 +1187 207 -355.4640855129715 +1188 207 -94.87981697997864 +207 208 133.8846256107522 +208 208 1524.020027775382 +209 208 343.4468685772625 +957 208 10.03641787813793 +962 208 138.3439826287142 +967 208 27.8781401861051 +1187 208 -74.70036044436131 +1188 208 -669.9452689575023 +1189 208 -177.3058618067678 +208 209 263.6133185769914 +209 209 2785.325479897783 +210 209 616.5202314988528 +962 209 20.753288414341 +967 209 252.5721389590923 +972 209 51.38997425408213 +1188 209 -140.2803874378839 +1189 209 -1240.855181912817 +1190 209 -313.0645973878981 +209 210 489.8238767674331 +210 210 4824.128749065269 +211 210 1029.18108257047 +967 210 39.92265900509879 +972 210 438.6319916810895 +977 210 87.97360861658058 +1189 210 -253.4138352549568 +1190 210 -2182.068871934973 +1191 210 -517.5151927228737 +210 211 863.566396919663 +211 211 7607.71154483722 +212 211 1518.767743380014 +972 211 72.70411457402227 +977 211 695.3465999342278 +982 211 132.4441245947933 +1190 211 -437.7519181832863 +1191 211 -3497.577912235663 +1192 211 -761.4890790314253 +211 212 1349.65068604791 +212 212 10801.19889942414 +213 212 2045.442223826298 +977 212 116.5514878663779 +982 212 992.6721361459399 +987 212 181.266980614983 +1191 212 -677.9221684927111 +1192 212 -5041.236939226782 +1193 212 -1022.561612111182 +212 213 1907.174487033136 +213 213 14032.46923150331 +214 213 2549.582760738142 +982 213 168.0662162390939 +987 213 1294.738891813193 +992 213 228.5088900884413 +1192 213 -952.6786513537994 +1193 213 -6627.43591423979 +1194 213 -1270.331223277659 +213 214 2454.778100472587 +214 214 17104.67257035408 +215 214 3040.197853178139 +987 214 219.3627710588353 +992 214 1581.517600199535 +997 214 274.6160429832133 +1193 214 -1221.653059950317 +1194 214 -8144.328025033545 +1195 214 -1508.459317076039 +214 215 2982.377922806642 +215 215 20133.37745595002 +216 215 3547.300051625887 +992 215 269.0057726161721 +997 215 1862.832938860141 +1002 215 322.1781291909618 +1194 215 -1478.500409861173 +1195 215 -9636.786025476089 +1196 215 -1752.190013514009 +215 216 3514.99418864597 +216 216 23175.29115452251 +217 216 4054.071612192358 +997 216 319.0356583952934 +1002 216 2144.142934609178 +1007 216 369.5559351001696 +1195 216 -1735.385596345468 +1196 216 -11128.89679764271 +1197 216 -1994.851292865908 +216 217 4037.159261170813 +217 217 26478.42322310024 +218 217 4655.245223651456 +1002 217 367.9098962861373 +1007 217 2448.746684036894 +1012 217 425.5717609330197 +1196 217 -1986.053794170766 +1197 217 -12741.79201324837 +1198 217 -2282.358735542497 +217 218 4646.760685831357 +218 218 30027.08191868206 +219 218 5246.907680604605 +1007 218 424.7463219208837 +1012 218 2775.603683222972 +1017 218 480.5716828794031 +1197 218 -2277.958630912381 +1198 218 -14469.46574008809 +1199 218 -2565.723321618076 +218 219 5242.571988393689 +219 219 34087.55884433255 +220 219 6019.700785844927 +1012 219 480.1502773384888 +1017 219 3149.508134010107 +1022 219 552.2716551430958 +1198 219 -2563.488965334949 +1199 219 -16442.4310378799 +1200 219 -2936.429796950251 +13 220 6771.378757189794 +137 220 -3276.519238806536 +158 220 624.4599962407337 +219 220 6017.234096129194 +220 220 38539.13541375046 +440 220 624.5228408830956 +596 220 -2479.986048146156 +1017 220 552.0321253316361 +1022 220 3559.460912883889 +1199 220 -2935.168806426018 +1200 220 -18603.09332752425 +7 221 -12342.98465605475 +50 221 -2063.197461670778 +69 221 -2063.278812598493 +86 221 -3475.23845787115 +221 221 25653.49355870071 +222 221 -13010.782111979 +636 221 -581.8330968334162 +644 221 -581.8206638729509 +1031 221 4232.220640753141 +1036 221 -2177.22554843222 +221 222 -13015.11558505559 +222 222 26493.04057210871 +223 222 -13077.22241068581 +1031 222 -2177.111490679803 +1036 222 4356.831044954282 +1041 222 -2190.689457786983 +222 223 -13079.38347647765 +223 223 25743.67037169859 +224 223 -12169.2002887245 +1036 223 -2190.643913217655 +1041 223 4218.408525411073 +1046 223 -2041.085301698593 +223 224 -12169.85269429895 +224 224 23292.66281559264 +225 224 -10551.28361211819 +1041 224 -2041.090816116617 +1046 224 3799.01419457802 +1051 224 -1772.915272073998 +224 225 -10550.16819368134 +225 225 20006.8309311035 +226 225 -8828.1362281861 +1046 225 -1772.97456528228 +1051 225 3243.458236415897 +1056 225 -1486.484706519734 +225 226 -8825.13690781386 +226 226 16555.94817659425 +227 226 -7068.955910005632 +1051 226 -1486.589996197124 +1056 226 2663.959826149811 +1061 226 -1193.742254282013 +226 227 -7064.68813020766 +227 227 13309.01866284242 +228 227 -5565.706606852145 +1056 227 -1193.869573374502 +1061 227 2120.759943386537 +1066 227 -943.3153958513922 +227 228 -5560.662727478786 +228 228 10590.00388699836 +229 228 -4345.571662292204 +1061 228 -943.4487273597661 +1066 228 1667.127012558891 +1071 228 -740.0324241925993 +228 229 -4340.466173227442 +229 229 8421.898467613295 +230 229 -3392.620057817339 +1066 229 -740.1559144884289 +1071 229 1305.146181739154 +1076 229 -581.4350279486047 +229 230 -3387.763319713748 +230 230 6788.945030563556 +231 230 -2703.128822659351 +1071 230 -581.544218574628 +1076 230 1031.678063673243 +1081 230 -466.9077843356024 +230 231 -2699.022009815864 +231 231 5592.131958268486 +232 231 -2171.355268534702 +1076 231 -466.9934849811887 +1081 231 828.6960756396884 +1086 231 -379.2629170019347 +231 232 -2168.149087632038 +232 232 4751.876407118822 +233 232 -1820.388348592998 +1081 232 -379.3233125879618 +1086 232 682.5685752730451 +1091 232 -322.1126739107848 +232 233 -1818.631960285185 +233 233 4196.843990067751 +234 233 -1541.829263193169 +1086 233 -322.1348767539316 +1091 233 579.3751208909148 +1096 233 -278.274152081194 +233 234 -1541.906287757536 +234 234 3880.664957439191 +235 234 -1389.736560127412 +1091 234 -278.2480269840255 +1096 234 510.3354280712546 +1101 234 -256.3625013017721 +234 235 -1392.739195647897 +235 235 3785.420027354417 +236 235 -1262.006647663738 +1096 235 -256.2587407200517 +1101 235 468.1658031850769 +1106 235 -241.2932144206947 +235 236 -1269.562458058691 +236 236 3918.827390065921 +237 236 -1236.204821339915 +1101 236 -241.066784077156 +1106 236 449.6707766960658 +1111 236 -245.8412618620774 +236 237 -1251.413478692569 +237 237 4348.304505875148 +238 237 -1226.628492016899 +1106 237 -245.4071422281789 +1111 237 455.5521982949758 +1116 237 -260.0146488090072 +237 238 -1255.814961973688 +238 238 5193.574443936186 +239 238 -1306.528111474443 +1111 238 -259.1980604374958 +1116 238 487.3260533101368 +1121 238 -298.957631199699 +238 239 -1361.584926401333 +239 239 6733.423170032807 +240 239 -1407.31146664506 +1116 239 -297.4309043146598 +1121 239 553.6975603651348 +1126 239 -363.7927712981437 +239 240 -1515.07356759319 +240 240 9520.473595785261 +241 240 -1584.672508318979 +1121 240 -360.8150618324868 +1126 240 668.7947971258609 +1131 240 -483.1248565393152 +240 241 -1802.2659873539 +241 241 14759.92894183265 +242 241 -1720.20099464493 +1126 241 -477.119753636232 +1131 241 860.5546947433754 +1136 241 -691.2888658756074 +241 242 -2185.799562615985 +242 242 25149.24024652615 +243 242 -1650.894478296276 +1131 242 -678.4402540995078 +1136 242 1172.34456768238 +1141 242 -1079.576852244821 +242 243 -2693.76076066762 +243 243 46947.2888458038 +244 243 -646.7683691824723 +1136 243 -1050.793154882168 +1141 243 1676.111854201122 +1146 243 -1826.127203244084 +243 244 -3082.78146851889 +244 244 94899.574178468 +245 244 3434.038746028942 +1141 244 -1758.897061891424 +1146 244 2407.676418742104 +1151 244 -3274.509017022519 +244 245 -2205.757617776949 +245 245 199100.4949231223 +246 245 14722.10715893985 +1146 245 -3119.03261508372 +1151 245 3225.127770081072 +1156 245 -5938.167184828321 +245 246 3119.707614234039 +246 246 402505.8853520273 +247 246 39453.73533155252 +1151 246 -5619.495566402046 +1156 246 3123.480578103243 +1161 246 -9744.223190762896 +246 247 21964.98737855991 +247 247 701327.2723079186 +248 247 73006.47949969146 +1156 247 -9267.977277873299 +1161 247 795.5884313560891 +1166 247 -13341.35298792226 +247 248 56828.431747237 +248 248 1014144.091287069 +249 248 113986.1015837509 +1161 248 -12906.80851398137 +1166 248 -4258.631881964742 +1171 248 -15154.59477183371 +15 249 208689.3535080611 +149 249 -5485.065375978287 +157 249 -40244.53253670663 +248 249 104150.5330127043 +249 249 1264096.265968046 +279 249 -5487.242361292709 +1166 249 -14894.1844810018 +1171 249 -10707.4842444798 +5 250 -12344.66264111634 +59 250 -2063.469827218757 +65 250 -2063.548146945937 +94 250 -3475.68029721124 +250 250 25656.83629780215 +251 250 -13012.46778997159 +604 250 -581.9081187965713 +756 250 -581.8878026203231 +1027 250 4232.750577873639 +1032 250 -2177.497283472576 +1375 250 6992.248345809482 +1376 250 -3576.108210402045 +250 251 -13016.80073871786 +251 251 26496.23055268491 +252 251 -13078.75892180529 +1027 251 -2177.383076098668 +1032 251 4357.33760023729 +1037 251 -2190.939118959811 +1375 251 -3575.30253980639 +1376 251 6945.178830885397 +1377 251 -3448.553636885353 +251 252 -13080.91945157556 +252 252 25746.42162111773 +253 252 -12170.46070183396 +1032 252 -2190.893514658928 +1037 252 4218.847356587136 +1042 252 -2041.292361663175 +1376 252 -3448.219891917285 +1377 252 6426.160846411392 +1378 252 -3073.641978439677 +252 253 -12171.11260332524 +253 253 23294.81200937561 +254 253 -10552.2323808089 +1037 253 -2041.297877284466 +1042 253 3799.359175367936 +1047 253 -1773.073366980949 +1377 253 -3073.633040497358 +1378 253 5527.47688995374 +1379 253 -2562.375262258979 +253 254 -10551.11662479147 +254 254 20008.39964662815 +255 254 -8828.829329210334 +1042 254 -1773.132724684574 +1047 254 3243.71191274499 +1052 254 -1486.602003126942 +1378 254 -2562.712557551 +1379 254 4524.173599887168 +1380 254 -2078.772317421706 +254 255 -8825.829989226888 +255 255 16557.05929842155 +256 255 -7069.456755635007 +1047 255 -1486.707416059466 +1052 255 2664.140598061387 +1057 255 -1193.828218086941 +1379 255 -2079.437669178472 +1380 255 3590.660849211865 +1381 255 -1632.991680374365 +255 256 -7065.18927268246 +256 256 13309.80524341101 +257 256 -5566.080963080422 +1052 256 -1193.955694222254 +1057 256 2120.887938732521 +1062 256 -943.3802633811823 +1380 256 -1633.849558797413 +1381 256 2786.040240280074 +1382 256 -1275.816539305482 +256 257 -5561.037646294881 +257 257 10590.581132274 +258 257 -4345.865295006815 +1057 257 -943.5137689930873 +1062 257 1667.22002405631 +1067 257 -740.0835022475318 +1381 257 -1276.77100726915 +1382 257 2151.821948909453 +1383 257 -998.9873410061487 +257 258 -4340.76051811931 +258 258 8422.342807008406 +259 258 -3392.861613409982 +1062 258 -740.2071616724515 +1067 258 1305.216107678485 +1072 258 -581.4770380747555 +1382 258 -999.9165429360505 +1383 258 1664.766427725564 +1384 258 -789.6136814817228 +258 259 -3388.005651119061 +259 259 6789.306246205293 +260 259 -2703.338306910645 +1067 259 -581.5863848462955 +1072 259 1031.732801180638 +1077 259 -466.9441391265243 +1383 259 -790.4713325089369 +1384 259 1305.52051425815 +1385 259 -641.8433155480591 +259 260 -2699.232251651847 +260 260 5592.439205600447 +261 260 -2171.54220535031 +1072 260 -467.0299672464679 +1077 260 828.7401866230025 +1082 260 -379.2953458419845 +1384 260 -642.5464787253718 +1385 260 1041.493809220797 +1386 260 -530.7649265571837 +260 261 -2168.33671695085 +261 261 4752.148883730804 +262 261 -1820.563329297316 +1077 261 -379.3558361054203 +1082 261 682.6050101229737 +1087 261 -322.1430759968505 +1385 261 -531.290416944069 +1386 261 851.4668020869647 +1387 261 -460.599769354583 +261 262 -1818.807518311033 +262 262 4197.093452168773 +263 262 -1541.995673380279 +1082 262 -322.1653213246581 +1087 262 579.405369308025 +1092 262 -278.3032954333491 +1386 262 -460.8469471556388 +1387 262 714.3320952473598 +1388 262 -408.6422431421634 +262 263 -1542.073116226604 +263 263 3880.900987504251 +264 263 -1389.90347436295 +1087 263 -278.2771466964293 +1092 263 510.3604452823346 +1097 263 -256.392044453312 +1387 263 -408.5359755213796 +1388 263 618.1546620092938 +1389 263 -387.2292464577334 +263 264 -1392.906298981918 +264 264 3785.649109705811 +265 264 -1262.176517403149 +1092 264 -256.288153643864 +1097 264 468.1854400412507 +1102 264 -241.323932935377 +1388 264 -386.5572881904469 +1389 264 550.2163306584033 +1390 264 -377.1682483886237 +264 265 -1269.732162885121 +265 265 3919.055777395857 +266 265 -1236.388934151935 +1097 265 -241.0972054196104 +1102 265 449.6842224707309 +1107 265 -245.8753455740348 +1389 265 -375.6085348339299 +1390 265 504.1325607197794 +1391 265 -397.6298603946243 +265 266 -1251.596824442249 +266 266 4348.537496572115 +267 266 -1226.833955948945 +1102 266 -245.4406478163679 +1107 266 455.557105269447 +1112 266 -260.0541308680557 +1390 266 -394.5724685306803 +1391 266 473.8329342010013 +1392 266 -438.2717656865811 +266 267 -1256.018595787352 +267 267 5193.815168878694 +268 267 -1306.774184896739 +1107 267 -259.2364491079476 +1112 267 487.3173361515564 +1117 267 -299.006840009108 +1391 267 -432.4654940715316 +1392 267 449.1089574448872 +1393 267 -525.3056843713509 +267 268 -1361.827102000361 +268 268 6733.669807300463 +269 268 -1407.62225132234 +1112 268 -297.4780683970504 +1117 268 553.6646628051222 +1122 268 -363.8583595519319 +1392 268 -514.4001016052907 +1393 268 415.1514453433502 +1394 268 -671.9288233720466 +268 269 -1515.376259856251 +269 269 9520.710552657758 +270 269 -1585.099278439538 +1117 269 -360.8766656803351 +1122 269 668.715320954782 +1127 269 -483.2201070737718 +1393 269 -650.6093927213666 +1394 269 335.1188824731499 +1395 269 -940.0419613438639 +269 270 -1802.675568451317 +270 270 14760.10264331122 +271 270 -1720.836358889582 +1122 270 -477.2069877004796 +1127 270 860.3795008165166 +1132 270 -691.4402190826227 +1394 270 -896.9917432410225 +1395 270 119.7245112119167 +1396 270 -1429.73723830788 +270 271 -2186.397137080025 +271 271 25149.19363481567 +272 271 -1651.935756183473 +1127 271 -678.5744801924836 +1132 271 1171.959146676082 +1137 271 -1079.841706795329 +1395 271 -1337.552629446976 +1396 271 -477.5857741345976 +1397 271 -2385.109757350345 +271 272 -2694.715901502937 +272 272 46946.60927300101 +273 272 -648.6330694342282 +1132 272 -1051.019645393109 +1137 272 1675.242215403781 +1142 272 -1826.636515438862 +1396 272 -2178.491583124799 +1397 272 -2101.396669112743 +1398 272 -4335.86248788617 +272 273 -3084.455266305967 +273 273 94897.36763293017 +274 273 3430.521566399879 +1137 273 -1759.316335838104 +1142 273 2405.63894228105 +1147 273 -3275.570723642206 +1397 273 -3853.165130673236 +1398 273 -6600.236971292336 +1399 273 -8392.155503093421 +273 274 -2208.932225649762 +274 274 199096.1632009491 +275 274 14715.76884804205 +1142 274 -3119.882820186756 +1147 274 3220.350938565339 +1152 274 -5940.440896559605 +1398 274 -7276.221356697419 +1399 274 -18282.25225925074 +1400 274 -16297.18854751675 +274 275 3113.583706985231 +275 275 402503.9573332013 +276 275 39444.46531957175 +1147 275 -5621.319564820835 +1152 275 3112.828404668351 +1157 275 -9748.720160394685 +1399 275 -14012.38325635154 +1400 275 -45227.57841949946 +1401 275 -28561.6168851394 +275 276 21954.79397092775 +276 276 701344.2225753232 +277 276 72996.40190852144 +1152 276 -9271.760135351167 +1157 276 775.3918892546135 +1162 276 -13348.55063565746 +1400 276 -25150.85683764146 +1401 276 -89981.57969653973 +1402 276 -41263.81590693874 +276 277 56816.27703818676 +277 277 1014194.172163495 +278 277 113978.1983862645 +1157 277 -12913.31175800075 +1162 277 -4290.06951666961 +1167 277 -15164.04229629965 +1401 277 -38149.78823782213 +1402 277 -142891.8181745978 +1403 277 -50659.9857015161 +14 278 208699.4813838957 +144 278 -40236.98375795654 +145 278 -5493.438132671399 +277 278 104140.9167626705 +278 278 1264174.216866198 +435 278 -5495.905322629293 +1162 278 -14903.19858731451 +1167 278 -10749.00439264206 +1402 278 -48789.60002749148 +1403 278 -190736.2273908357 +15 279 3186.767030456795 +157 279 -63361.33229281432 +249 279 -15541.60915171624 +279 279 743956.0544587472 +280 279 3191.591175430956 +279 280 3190.278207918811 +280 280 743984.8541574603 +281 280 3200.918611153371 +280 281 3200.014995082143 +281 281 744004.4692252917 +282 281 3199.987464613521 +281 282 3200.898695934164 +282 282 743984.8617084315 +283 282 3190.275942984983 +17 283 3186.860564718729 +282 283 3191.570693353591 +283 283 743956.5458793675 +291 283 -63361.57896959872 +354 283 -15541.62920593692 +18 284 -9554.742293220464 +284 284 25033.92924083988 +285 284 -11247.01087691694 +296 284 -1949.354476158392 +325 284 -3193.343742504466 +368 284 -1949.323790513301 +284 285 -10981.42537009736 +285 285 35611.40029518305 +286 285 -15833.67593258912 +285 286 -15405.68763337749 +286 286 56386.09109827521 +287 286 -22294.8233474989 +286 287 -21620.79677596069 +287 287 91669.1075163114 +288 287 -31446.8975831814 +287 288 -30423.46460620617 +288 288 153012.3343294167 +289 288 -44393.70346497328 +288 289 -42949.64085385665 +289 289 262176.2776067938 +290 289 -62167.38537575895 +289 290 -60479.01608203941 +290 290 461491.637798794 +291 290 -84051.25071912249 +17 291 149136.4564441303 +283 291 -11666.17985930255 +290 291 -83321.99094463892 +291 291 798934.2973647628 +354 291 15662.20653147363 +355 291 -11663.49710139447 +16 292 1927.218417243893 +150 292 -1795.935013991513 +191 292 633.756958729473 +292 292 20442.0664158707 +293 292 1819.286349583155 +591 292 -1613.094818662874 +1432 292 -600.3113807317418 +292 293 1786.14001178664 +293 293 21010.94183911651 +294 293 1775.542182586476 +293 294 1764.14714534325 +294 294 21264.32322479947 +295 294 1764.111361715723 +294 295 1775.506106489235 +295 295 21010.97663217838 +296 295 1786.193250437391 +18 296 1927.240325543422 +284 296 -1795.948678295143 +295 296 1819.337066707516 +296 296 20442.22545195782 +325 296 633.7642026588063 +581 296 -1613.101179137561 +9 297 -5.35450334842949 +25 297 -1.00344293465246 +44 297 -1.00348059894745 +78 297 -1.762519392161259 +126 297 -1.329741490340491 +297 297 19.38529550404613 +298 297 -4.816858226021789 +669 297 -0.3011224544683153 +677 297 -0.3011098032136532 +806 297 -0.2464063379049388 +827 297 -0.2464164541476253 +297 298 -4.86679197979278 +298 298 20.06532922860249 +299 298 -4.10272832045596 +298 299 -4.099225488369428 +299 299 20.30304136451884 +300 299 -3.355380809070978 +299 300 -3.390807560044727 +300 300 21.05077524940245 +301 300 -2.605109010969532 +300 301 -2.657163282948948 +301 301 22.53080207915187 +302 301 -1.918388763253589 +301 302 -1.995762329498624 +302 302 24.78689060791384 +303 302 -1.121850604242348 +302 303 -1.241996606404434 +303 303 28.13568319874492 +304 303 -0.2438397959005398 +303 304 -0.43456367400913 +304 304 33.07459234107882 +305 304 0.8509790159009099 +304 305 0.536912230378576 +305 305 40.57856762286922 +306 305 2.373223438330976 +305 306 1.842778327583059 +306 306 52.14065896434036 +307 306 4.55056889698559 +306 307 3.624159748482303 +307 307 70.97298022853369 +308 307 8.271671001227753 +307 308 6.604391232139573 +308 308 102.3219203166273 +309 308 14.39442789124604 +308 309 11.30160611086687 +309 309 158.0777215358358 +310 309 26.35870943605099 +309 310 20.44492808146079 +310 310 258.717425908355 +311 310 48.04042510551511 +310 311 36.52206004436952 +311 311 451.9262876010148 +312 311 93.33230673057835 +311 312 70.5489924634235 +312 312 819.3688323937072 +313 312 177.7043582025591 +312 313 133.8641110498563 +313 313 1523.915577293039 +314 313 343.4158185617118 +313 314 263.582573456794 +314 314 2785.21589313057 +315 314 616.4936834847183 +314 315 489.7882571608413 +315 315 4824.142556262533 +316 315 1029.194413543451 +315 316 863.5511943834097 +316 316 7608.108617280112 +317 316 1518.868712337976 +316 317 1349.704816581592 +317 317 10802.25658853265 +318 317 2045.664195043297 +317 318 1907.345986499818 +318 318 14034.31679607306 +319 318 2549.929229164423 +318 319 2455.084502224936 +319 319 17107.2794419656 +320 319 3040.65928069874 +319 320 2982.813048276526 +320 320 20136.66986103352 +321 320 3547.869099006146 +320 321 3515.548038717793 +321 321 23179.20505186146 +322 321 4054.740317178122 +321 322 4037.819866040339 +322 322 26482.95752338035 +323 322 4656.024914693144 +322 323 4647.536248466719 +323 323 30032.25223037613 +324 323 5247.793801828513 +323 324 5243.455979514233 +324 324 34093.43991603327 +325 324 6020.723334028966 +18 325 6772.544072613404 +284 325 -3276.669933687434 +296 325 624.4479977825602 +324 325 6018.255413169775 +325 325 38545.78835589811 +368 325 624.3849685783612 +581 325 -2480.436598241754 +10 326 -12342.99371716889 +54 326 -2063.197275589659 +60 326 -2063.275849111168 +85 326 -3475.26794194447 +326 326 25653.51210413529 +327 326 -13010.7919207818 +676 326 -581.8206998916926 +684 326 -581.8410392082881 +326 327 -13015.12538944265 +327 327 26493.06034104767 +328 327 -13077.23280454621 +327 328 -13079.39386848688 +328 328 25743.69022711636 +329 328 -12169.21028004423 +328 329 -12169.86268377639 +329 329 23292.68044742601 +330 329 -10551.29188798754 +329 330 -10550.17646642283 +330 330 20006.84415281873 +331 330 -8828.14195095403 +330 331 -8825.142625670473 +331 331 16555.95567674402 +332 331 -7068.958656416236 +331 332 -7064.690869266711 +332 332 13309.02012992409 +333 332 -5565.706555478812 +332 333 -5560.662666541789 +333 333 10589.99987324843 +334 333 -4345.569260094892 +333 334 -4340.46375825541 +334 334 8421.889847463313 +335 334 -3392.615832886895 +334 335 -3387.759078270184 +335 335 6788.932602196202 +336 335 -2703.123166611113 +335 336 -2699.016330499026 +336 336 5592.116288082051 +337 336 -2171.34855210993 +336 337 -2168.142338191768 +337 337 4751.857638958275 +338 337 -1820.380607681798 +337 338 -1818.624169050745 +338 338 4196.82190284542 +339 338 -1541.820694798412 +338 339 -1541.897641446957 +339 339 3880.638747319205 +340 339 -1389.726819160321 +339 340 -1392.729328334878 +340 340 3785.388252279837 +341 340 -1261.995832551465 +340 341 -1269.55143118428 +341 341 3918.787492943145 +342 341 -1236.192184373052 +341 342 -1251.400478388759 +342 342 4348.252103497872 +343 342 -1226.613914921264 +342 343 -1255.799727954208 +343 343 5193.501876851436 +344 343 -1306.510455659886 +343 344 -1361.566052366014 +344 344 6733.316424161598 +345 344 -1407.290426857172 +344 345 -1515.050137571173 +345 345 9520.305958748173 +346 345 -1584.647025898376 +345 346 -1802.235655626208 +346 346 14759.64697504682 +347 346 -1720.172599703292 +346 347 -2185.760834430307 +347 347 25148.73294341954 +348 347 -1650.869113127228 +347 348 -2693.712960991578 +348 348 46946.32468538464 +349 348 -646.7677278781193 +348 349 -3082.732836704157 +349 349 94897.69926269155 +350 349 3433.959387648562 +349 350 -2205.748615785837 +350 350 199097.0842311437 +351 350 14721.88309884053 +350 351 3119.574735100428 +351 351 402500.9930434751 +352 351 39453.39831237086 +351 352 21964.58646673007 +352 352 701323.0305039649 +353 352 73006.22413769757 +352 353 56827.95136404851 +353 353 1014142.692056004 +354 353 113986.0053354588 +17 354 208689.5991489672 +283 354 -5487.282080314093 +291 354 -40245.36922369801 +353 354 104150.2699240826 +354 354 1264097.24985791 +355 354 -5484.824693880186 +17 355 3194.342068844169 +291 355 -63361.73001856099 +354 355 -15539.88681971897 +355 355 743972.7500779699 +356 355 3192.193531557183 +355 356 3192.529068704425 +356 356 743965.3430112579 +357 356 3190.245103875539 +356 357 3190.547349565626 +357 357 743958.7013450523 +358 357 3189.025585847761 +357 358 3188.651090234307 +358 358 743967.3956915833 +359 358 3194.904554561319 +19 359 3194.670180973262 +358 359 3194.365597565069 +359 359 743978.1629288837 +367 359 -63361.64127958818 +430 359 -15539.79947574485 +20 360 -9554.598898025499 +360 360 25033.36350528439 +361 360 -11246.59487358986 +372 360 -1949.320578224968 +401 360 -3193.295808855228 +436 360 -1949.183817602782 +360 361 -10981.06788552549 +361 361 35610.28321517035 +362 361 -15832.86599656883 +361 362 -15404.96314487513 +362 362 56384.08696522357 +363 362 -22293.38669213894 +362 363 -21619.48154721225 +363 363 91665.70998803189 +364 363 -31444.56038387025 +363 364 -30421.27477323435 +364 364 153006.9498439341 +365 364 -44390.2673482947 +364 365 -42946.3624367803 +365 365 262168.4136680727 +366 365 -62163.03236825652 +365 366 -60474.73843179626 +366 366 461481.9124050126 +367 366 -84047.09673632246 +19 367 149137.6949322666 +359 367 -11663.27122208647 +366 367 -83317.68021627684 +367 367 798926.542373426 +430 367 15662.73460545247 +431 367 -11664.08259098958 +18 368 1927.059889780984 +284 368 -1795.913530493582 +325 368 633.7044378188943 +368 368 20441.64056499096 +369 368 1819.263731530684 +581 368 -1613.056414027287 +368 369 1786.100746723722 +369 369 21011.40031755044 +370 369 1775.792044517233 +369 370 1764.380247688373 +370 370 21265.46086604094 +371 370 1764.379843909079 +370 371 1775.7920571027 +371 371 21011.40003644473 +372 371 1786.100415519459 +20 372 1927.050301475729 +360 372 -1795.904294710376 +371 372 1819.264613523138 +372 372 20441.62184864235 +401 372 633.7012729828018 +586 372 -1613.05345807337 +11 373 -5.354474055796381 +29 373 -1.003443043525415 +35 373 -1.003464545592165 +49 373 -1.329739453373275 +70 373 -1.762497396870733 +373 373 19.38522692451615 +374 373 -4.816828480726551 +709 373 -0.301109683341119 +717 373 -0.3011195862160942 +802 373 -0.2464063327018785 +881 373 -0.246415686487478 +373 374 -4.866761745869392 +374 374 20.06525364973537 +375 374 -4.102699808298771 +374 375 -4.099197202194089 +375 375 20.30296841466671 +376 375 -3.35535572066353 +375 376 -3.390782255110595 +376 376 21.05070204583948 +377 376 -2.605086017531867 +376 377 -2.657139860987308 +377 377 22.53072164924268 +378 377 -1.91836736792767 +377 378 -1.995740188717502 +378 378 24.78679584494473 +379 378 -1.121831354966048 +378 379 -1.241976080409701 +379 379 28.1355635175761 +380 379 -0.243823437915792 +379 380 -0.4345451649714267 +380 380 33.07443087190025 +381 380 0.8509904776671178 +380 381 0.5369273610214471 +381 381 40.5783363778571 +382 381 2.373225844059385 +381 382 1.842786992757237 +382 382 52.140311813103 +383 382 4.550555300344238 +382 383 3.624156957972996 +383 383 70.97243662772581 +384 383 8.271626132538405 +383 384 6.604365099236626 +384 384 102.3210460240268 +385 384 14.39432865292356 +384 385 11.30153948324416 +385 385 158.0762757267125 +386 385 26.35850433552293 +385 386 20.44477997582356 +386 386 258.7150099499913 +387 386 48.04004057268823 +386 387 36.52177469121155 +387 387 451.9221752666679 +388 387 93.33157324721662 +387 388 70.54843500732579 +388 388 819.3617946305108 +389 388 177.7030268141201 +388 389 133.8630942700571 +389 389 1523.903304343262 +390 389 343.4132962118765 +389 390 263.5806489452952 +390 390 2785.194001617095 +391 390 616.4889885247469 +390 391 489.7846551033498 +391 391 4824.103271453556 +392 391 1029.185904441362 +391 392 863.5443898265005 +392 392 7608.042224980651 +393 392 1518.855225807283 +392 393 1349.693202583751 +393 393 10802.15739193418 +394 393 2045.645500362398 +393 394 1907.328668896284 +394 394 14034.18646238884 +395 394 2549.90612794517 +394 395 2455.062033328 +395 395 17107.1234045305 +396 395 3040.632346237733 +395 396 2982.786271398408 +396 396 20136.49077775737 +397 396 3547.838275934167 +396 397 3515.517194639904 +397 397 23179.00291048101 +398 397 4054.705507390019 +397 398 4037.785006308134 +398 398 26482.72924410643 +399 398 4655.985151296652 +398 399 4647.496462484233 +399 399 30031.99473694654 +400 399 5247.749052628355 +399 400 5243.411234282584 +400 400 34093.14817496817 +401 400 6020.671994872096 +20 401 6772.486206722041 +360 401 -3276.60819679208 +372 401 624.3842728400124 +400 401 6018.204083181861 +401 401 38545.45875194425 +436 401 624.4334123662218 +586 401 -2480.422280629661 +12 402 -12342.98519902952 +55 402 -2063.194902426835 +64 402 -2063.282120428387 +77 402 -3475.23834750946 +402 402 25653.49463411537 +403 402 -13010.78265166602 +716 402 -581.8426768028272 +724 402 -581.811231412042 +402 403 -13015.11612461168 +403 403 26493.04163265558 +404 403 -13077.22294148645 +403 404 -13079.38400731851 +404 404 25743.67140040432 +405 404 -12169.20079757709 +404 405 -12169.85320321784 +405 405 23292.66374764504 +406 405 -10551.28404686929 +405 406 -10550.16862841542 +406 406 20006.83169986643 +407 406 -8828.136575274268 +406 407 -8825.137254920257 +407 407 16555.94877879103 +408 407 -7068.956179529216 +407 408 -7064.688399797779 +408 408 13309.01912396581 +409 408 -5565.706813780197 +408 409 -5560.662934469954 +409 409 10590.00423422589 +410 409 -4345.571818870474 +409 410 -4340.466329867136 +410 410 8421.898725221974 +411 410 -3392.620176262245 +410 411 -3387.7634382192 +411 411 6788.945222085192 +412 411 -2703.128914436908 +411 412 -2699.022101644204 +412 412 5592.132102352017 +413 412 -2171.355341169996 +412 413 -2168.149160313416 +413 413 4751.876518559692 +414 413 -1820.388409635658 +413 414 -1818.632021358891 +414 414 4196.844079567009 +415 414 -1541.829316393261 +414 415 -1541.906340957976 +415 415 3880.665032809598 +416 415 -1389.736610332615 +415 416 -1392.739245804582 +416 416 3785.420094356262 +417 416 -1262.006697155547 +416 417 -1269.562507440925 +417 417 3918.827454145261 +418 417 -1236.204874908406 +417 418 -1251.413532066842 +418 418 4348.304573050338 +419 418 -1226.628553216131 +418 419 -1255.815022863992 +419 419 5193.574522248577 +420 419 -1306.528187766879 +419 420 -1361.585002289929 +420 420 6733.423273695827 +421 420 -1407.311567567152 +420 421 -1515.073668203783 +421 421 9520.473754053713 +422 421 -1584.67265259948 +421 422 -1802.266132169716 +422 422 14759.92922125694 +423 422 -1720.201212441713 +422 423 -2185.799784464481 +423 423 25149.24080774105 +424 423 -1650.894824509842 +423 424 -2693.761122597987 +424 424 46947.29008470913 +425 424 -646.7689348987878 +424 425 -3082.782081371937 +425 425 94899.57698075453 +426 425 3434.037822014167 +425 426 -2205.758648082893 +426 426 199100.500818558 +427 426 14722.10566868723 +426 427 3119.705961455382 +427 427 402505.8958750257 +428 427 39453.73323056984 +427 428 21964.98507727948 +428 428 701327.2882724047 +429 428 73006.47719629524 +428 429 56828.42913714725 +429 429 1014144.11382687 +430 429 113986.1001829719 +19 430 208689.3581356904 +359 430 -5484.596951538835 +367 430 -40244.52329470323 +429 430 104150.5310808697 +430 430 1264096.296997649 +431 430 -5487.732847821619 +19 431 3185.901223901397 +367 431 -63360.89893149956 +430 431 -15541.80993266041 +431 431 743955.5064167873 +432 431 3187.493549708553 +431 432 3186.466287954943 +432 432 743994.7708055087 +433 432 3192.19355352172 +432 433 3191.609060238603 +433 433 744030.6260420857 +434 433 3185.95150851216 +433 434 3187.200474393409 +434 434 744027.2847176529 +435 434 3171.594542834559 +14 435 3165.503514014439 +144 435 -63367.84450848772 +278 435 -15552.70936559047 +434 435 3173.189673705376 +435 435 744010.7045493395 +1403 435 -25141.60783719501 +20 436 1927.217209442908 +360 436 -1795.831687682665 +401 436 633.7566696744043 +436 436 20441.59644437028 +437 436 1819.282559446344 +586 436 -1613.088340607907 +436 437 1786.171157756944 +437 437 21009.80314289985 +438 437 1775.600407142798 +437 438 1764.257644635445 +438 438 21262.2952955449 +439 438 1764.247413824977 +438 439 1775.694331027542 +439 439 21008.1342604847 +440 439 1786.38657944964 +13 440 1927.434521299293 +137 440 -1795.752319923806 +220 440 633.8335614873415 +439 440 1819.563879431997 +440 440 20438.90248024349 +596 440 -1612.834721974021 +1200 440 -600.2489231998378 +21 441 -1325.729885669271 +441 441 9302.195843382666 +442 441 -1513.480106227889 +456 441 -727.2284062452134 +518 441 -444.3690345587352 +592 441 -17.23743209720254 +441 442 -1458.705860655352 +442 442 9382.084555566558 +443 442 -1571.300083358321 +442 443 -1555.752774229117 +443 443 9450.153484423448 +444 443 -1555.752769280658 +443 444 -1571.300075257078 +444 444 9382.084501566213 +445 444 -1458.705851825129 +22 445 -1325.729808388159 +444 445 -1513.480099209144 +445 445 9302.195479495907 +446 445 -727.2282262309735 +576 445 -444.3690084464333 +587 445 -17.23742868775977 +22 446 -1325.719667012903 +445 446 -727.2279383737751 +446 446 9302.175308150221 +447 446 -1513.474751425616 +576 446 -444.365636808894 +587 446 -17.25342647374476 +446 447 -1458.701112418929 +447 447 9382.062826259236 +448 447 -1571.303171314804 +447 448 -1555.756355358031 +448 448 9450.125945164698 +449 448 -1555.75801628566 +448 449 -1571.304240159169 +449 449 9382.062570493938 +450 449 -1458.699315432475 +23 450 -1325.719558507653 +449 450 -1513.473435879867 +450 450 9302.174358380791 +455 450 -727.2280106118853 +547 450 -444.3656023506046 +577 450 -17.25466393641276 +24 451 -1325.729804728585 +451 451 9302.195449919542 +452 451 -1513.480094320615 +460 451 -727.2282245793695 +489 451 -444.3690077245666 +582 451 -17.2374286537288 +451 452 -1458.705846519867 +452 452 9382.084463489529 +453 452 -1571.300068624419 +452 453 -1555.752762610077 +453 453 9450.153442707666 +454 453 -1555.752767401288 +453 454 -1571.300076392045 +454 454 9382.084511790503 +455 454 -1458.705853781017 +23 455 -1325.729879393105 +450 455 -727.2284026457374 +454 455 -1513.480099083997 +455 455 9302.195798309813 +547 455 -444.369032954667 +577 455 -17.23743201829404 +21 456 -1325.719565089729 +441 456 -727.2280141422269 +456 456 9302.174402898607 +457 456 -1513.473442707492 +518 456 -444.3656040068713 +592 456 -17.25466400771606 +456 457 -1458.699321171911 +457 457 9382.062598529199 +458 457 -1571.304243739241 +457 458 -1555.758018986035 +458 458 9450.125954487081 +459 458 -1555.756355904167 +458 459 -1571.303171361988 +459 459 9382.062821678937 +460 459 -1458.70111085704 +24 460 -1325.719664104743 +451 460 -727.227936541685 +459 460 -1513.474749232483 +460 460 9302.175291731754 +489 460 -444.3656361613998 +582 460 -17.25342642487534 +4 461 -1.100454963664014 +45 461 -0.6068661250761542 +112 461 -0.5483872362829996 +117 461 -0.5483855974340814 +461 461 7.853277264456941 +462 461 -0.8594804417154134 +777 461 -0.1306646261117416 +782 461 -0.181732230755923 +861 461 -0.1817313063897299 +461 462 -0.9043276993854896 +462 462 8.766248345613164 +463 462 -0.6059379908005567 +462 463 -0.5983995139355537 +463 463 9.346480918975363 +464 463 -0.2988234539943942 +463 464 -0.3210984698709526 +464 464 10.15138974888764 +465 464 0.04298828163490903 +464 465 0.007995532590792387 +465 465 11.39065703133398 +466 465 0.3923804166841433 +465 466 0.3375903050159524 +466 466 13.12938149790915 +467 466 0.8368949441693594 +466 467 0.7473619890116532 +467 467 15.63483521272357 +468 467 1.393347115750455 +467 468 1.244994142093239 +468 468 19.305425762803 +469 468 2.172088291968323 +468 469 1.917885640859161 +469 469 24.9715632997996 +470 469 3.363199824474414 +469 470 2.918740918541364 +470 470 33.93894364546022 +471 470 5.236558967456702 +470 471 4.436274060704818 +471 471 49.0588436276008 +472 471 8.574864897776129 +471 472 7.095707723020618 +472 472 75.1333161687231 +473 472 14.37465907710104 +472 473 11.57643167837679 +473 473 123.0246638946074 +474 473 25.76255614406264 +473 474 20.34464132031637 +474 474 211.4681951803149 +475 474 46.66789950460512 +474 475 36.16951147382312 +475 475 382.3288163088925 +476 475 88.88896636101967 +475 476 68.73797624397791 +476 476 700.1779715707559 +477 476 162.9649968865168 +476 477 127.2336954655276 +477 477 1268.675512590322 +478 477 291.5892696249053 +477 478 235.6736331070095 +478 478 2162.112058760903 +479 478 466.9433049425574 +478 479 396.9826853598465 +479 479 3355.770197480718 +480 479 681.1747373695111 +479 480 612.8350227842971 +480 480 4684.121405941094 +481 480 890.3402929619353 +480 481 837.8471555452737 +481 481 5987.678433131156 +482 481 1097.410758064059 +481 482 1063.045720380247 +482 482 7236.227764093928 +483 482 1294.822079306601 +482 483 1274.485782486542 +483 483 8451.722051707506 +484 483 1497.075410261662 +483 484 1485.63021228215 +484 484 9727.210073063618 +485 484 1718.508203658167 +484 485 1712.300851931993 +485 485 11077.55537628688 +486 485 1947.883829562433 +485 486 1944.575488511305 +486 486 12597.74148075836 +487 486 2227.054995976541 +486 487 2225.280073613067 +487 487 14260.93473063532 +488 487 2504.522057407384 +487 488 2503.496266286385 +488 488 16180.36123711723 +489 488 2869.196689835993 +24 489 3216.58205535067 +451 489 -491.8684508723147 +460 489 -491.8654450400982 +488 489 2868.52253038557 +489 489 18291.5166824124 +582 489 -953.2243352249484 +1 490 -1.100455729579177 +102 490 -0.5483857160898948 +116 490 -0.5483875238329932 +132 490 -0.6068665462206755 +490 490 7.853281098945953 +491 490 -0.8594813037970308 +757 490 -0.130664651267279 +836 490 -0.18173226933078 +857 490 -0.1817312828801681 +490 491 -0.9043291858368359 +491 491 8.766262504953909 +492 491 -0.6059398282123361 +491 492 -0.5984011280702159 +492 492 9.346499122053778 +493 492 -0.2988243937454653 +492 493 -0.321099850364596 +493 493 10.15141490205677 +494 493 0.04298821004077474 +493 494 0.007994730158702723 +494 494 11.3906958931189 +495 494 0.3923819453161317 +494 495 0.337590631665404 +495 495 13.12944252926403 +496 495 0.836899710946156 +495 496 0.7473646782491863 +496 496 15.6349333040971 +497 496 1.393357863807081 +496 497 1.245001294943413 +497 497 19.30558662985358 +498 497 2.172110257304408 +497 498 1.917901227861553 +498 498 24.97183325112587 +499 498 3.363242707055986 +498 499 2.918772595881637 +499 499 33.9394015669104 +500 499 5.23663924720115 +499 500 4.436334740815403 +500 500 49.05962884904007 +501 500 8.575013368580571 +500 501 7.095822869389529 +501 501 75.13464861220616 +502 501 14.37491850642973 +501 502 11.57663813431252 +502 502 123.0268794768936 +503 502 25.76299273204803 +502 503 20.34500418407829 +503 503 211.4716363134957 +504 503 46.66853077125346 +503 504 36.17007941665493 +504 504 382.3334475435622 +505 504 88.88966763467056 +504 505 68.73873832582149 +505 505 700.1821219409699 +506 505 162.9651204481368 +505 506 127.2342696182864 +506 506 1268.673832633007 +507 506 291.5875605935371 +506 507 235.6729662523412 +507 507 2162.096443651867 +508 507 466.9388641126368 +507 508 396.9793930152744 +508 508 3355.737503249343 +509 508 681.1683953249712 +508 509 612.8289079784421 +509 509 4684.080553565879 +510 509 890.3342664928167 +509 510 837.8402245461239 +510 510 5987.642592060483 +511 510 1097.406391461283 +510 511 1063.040042722807 +511 511 7236.203345809407 +512 511 1294.819526260706 +511 512 1274.482138265922 +512 512 8451.708445541879 +513 512 1497.074164475692 +512 513 1485.628281943272 +513 513 9727.203745631201 +514 513 1718.507710126156 +513 514 1712.300001745521 +514 514 11077.55306375785 +515 514 1947.883702865699 +514 515 1944.575208616643 +515 515 12597.74101818645 +516 515 2227.055005192597 +515 516 2225.280038724167 +516 516 14260.93490860468 +517 516 2504.522112391448 +516 517 2503.496308386752 +517 517 16180.36165454607 +518 517 2869.196778018396 +21 518 3216.582168424502 +441 518 -491.8685115409367 +456 518 -491.8653969104475 +517 518 2868.522607118676 +518 518 18291.517288822 +592 518 -953.224767322268 +3 519 -1.100455364177358 +111 519 -0.5483873765169653 +121 519 -0.5483855687693501 +122 519 -0.6068663756199606 +519 519 7.853276197113483 +520 519 -0.8594808417242297 +781 519 -0.130664619864164 +786 519 -0.1817322224953631 +807 519 -0.1817312360473062 +519 520 -0.90432799350931 +520 520 8.766245446091583 +521 520 -0.6059382539817811 +520 521 -0.5983998358248566 +521 521 9.346477470152502 +522 521 -0.2988238632166113 +521 522 -0.3210988293394286 +522 522 10.15138534494465 +523 522 0.04298774790080778 +522 523 0.007995079385889003 +523 523 11.39065082234448 +524 523 0.3923796727904046 +523 524 0.3375896928116342 +524 524 13.12937252628552 +525 524 0.8368937962674912 +524 525 0.747361075404258 +525 525 15.63482169907126 +526 525 1.393345231555586 +525 526 1.244992682460613 +526 526 19.3054044715077 +527 526 2.172084996596041 +526 527 1.917883147617419 +527 527 24.9715280216762 +528 527 3.363193806430775 +527 528 2.918736384338278 +528 528 33.93888340207446 +529 528 5.236547938218121 +528 529 4.436265701694316 +529 529 49.05873912729789 +530 529 8.574844861133739 +529 530 7.095692033818688 +530 530 75.13314087271883 +531 530 14.37462631471601 +530 531 11.57640428611765 +531 531 123.0243978449789 +532 531 25.76251278844162 +531 532 20.34459846368921 +532 532 211.4679073829884 +533 532 46.66788722298536 +532 533 36.16946935257252 +533 533 382.3289488720848 +534 533 88.8891513151743 +533 534 68.73802634345377 +534 534 700.1800260125874 +535 534 162.9658300160757 +534 535 127.2341402788097 +535 535 1268.683148072465 +536 535 291.5915706119065 +535 536 235.6751953511931 +536 536 2162.130279504032 +537 536 466.9475572642226 +536 537 396.9861854286524 +537 537 3355.80051023239 +538 537 681.1803355290283 +537 538 612.8405220210765 +538 538 4684.157425197231 +539 538 890.3456411731556 +538 539 837.8532282916983 +539 539 5987.710633058517 +540 539 1097.414836946135 +539 540 1063.050859015473 +540 540 7236.251084768863 +541 540 1294.824690887084 +540 541 1274.489328653416 +541 541 8451.736445573784 +542 541 1497.076867981209 +541 542 1485.632319366232 +542 542 9727.217873983871 +543 542 1718.508926580841 +542 543 1712.301954350938 +543 543 11077.5591492113 +544 543 1947.884160873503 +543 544 1944.576002020595 +544 544 12597.74323218935 +545 544 2227.055162689263 +544 545 2225.280313146701 +545 545 14260.93565927009 +546 545 2504.522162587776 +545 546 2503.496399644544 +546 546 16180.36187710691 +547 546 2869.196780667785 +23 547 3216.582152589823 +450 547 -491.8653946111349 +455 547 -491.8685092567169 +546 547 2868.522630765711 +547 547 18291.5172635472 +577 547 -953.2247626977539 +2 548 -1.100454963617502 +106 548 -0.5483855873079864 +107 548 -0.548387246372523 +127 548 -0.6068661250496814 +548 548 7.853277263800715 +549 548 -0.8594804416636137 +761 548 -0.1306646261083119 +811 548 -0.1817313121528402 +832 548 -0.181732224978162 +548 549 -0.9043276992343616 +549 549 8.766248343327764 +550 549 -0.6059379906084588 +549 550 -0.5983995137834439 +550 550 9.3464809160625 +551 550 -0.2988234539458569 +550 551 -0.3210984697415762 +551 551 10.15138974465592 +552 551 0.04298828153216666 +551 552 0.007995532636051683 +552 552 11.39065702449542 +553 552 0.3923804163312019 +552 553 0.3375903048389872 +553 553 13.12938148763254 +554 553 0.8368949433204409 +553 554 0.7473619884335974 +554 554 15.63483519704139 +555 554 1.393347113810158 +554 555 1.24499414085747 +555 555 19.30542573521553 +556 555 2.172088287617008 +555 556 1.917885638054206 +556 556 24.97156324774754 +557 556 3.363199815724808 +556 557 2.918740912163668 +557 557 33.93894355408962 +558 557 5.236558951552784 +557 558 4.436274048319706 +558 558 49.05884347504008 +559 558 8.574864868803019 +558 559 7.095707700461761 +559 559 75.13331591219648 +560 559 14.37465902735671 +559 560 11.57643163826526 +560 560 123.0246634732779 +561 560 25.76255605935543 +560 561 20.34464125103098 +561 561 211.4681944647467 +562 561 46.66789931085445 +561 562 36.16951135087409 +562 562 382.3288145166612 +563 562 88.88896579939995 +562 563 68.73797589908558 +563 563 700.1779667336511 +564 563 162.9649956196469 +563 564 127.2336945324684 +564 564 1268.675501762064 +565 564 291.5892661992293 +564 565 235.673630989558 +565 565 2162.112030277715 +566 565 466.9432974757544 +565 566 396.9826797250702 +566 566 3355.770145195251 +567 566 681.1747298897435 +566 567 612.8350133996184 +567 567 4684.12136205875 +568 567 890.3402869874678 +567 568 837.8471488478638 +568 568 5987.678395762458 +569 568 1097.410752118147 +568 569 1063.045714167994 +569 569 7236.227727844204 +570 569 1294.822074692797 +569 570 1274.485776533678 +570 570 8451.722022308331 +571 570 1497.075403970574 +570 571 1485.630207234524 +571 571 9727.210034215293 +572 571 1718.508199802206 +571 572 1712.300845380359 +572 572 11077.55536214524 +573 572 1947.883832815272 +572 573 1944.575487685396 +573 573 12597.74150229217 +574 573 2227.054995589275 +573 574 2225.280077517981 +574 574 14260.93471766711 +575 574 2504.522051290464 +574 575 2503.496262365375 +575 575 16180.36120251829 +576 575 2869.196690227582 +22 576 3216.582063634519 +445 576 -491.8684521044319 +446 576 -491.865446206534 +575 576 2868.522525001784 +576 576 18291.51669917305 +587 576 -953.2243377110619 +23 577 -2494.921943038301 +450 577 -43.09366858926047 +455 577 -43.0697707839015 +547 577 -833.6845790201023 +577 577 10639.63575089647 +578 577 -3459.282516909714 +577 578 -3163.90504458772 +578 578 11863.30876933069 +579 578 -4457.686418583824 +578 579 -4155.855564452617 +579 579 13631.3896831405 +580 579 -5587.416507390403 +579 580 -5272.108141861598 +580 580 15639.07519441917 +581 580 -6786.573124023819 +18 581 -7776.171076384744 +296 581 -1380.351515376147 +325 581 -2600.001424479045 +368 581 -1380.313276447658 +580 581 -6457.63486116848 +581 581 17498.98373875935 +24 582 -2494.921095180036 +451 582 -43.06977117774131 +460 582 -43.09204559032577 +489 582 -833.6842948657909 +582 582 10639.63129868983 +583 582 -3459.27827188089 +582 583 -3163.901208096066 +583 583 11863.298372759 +584 583 -4457.678569221254 +583 584 -4155.848470456411 +584 584 13631.37234047071 +585 584 -5587.405655422875 +584 585 -5272.097809243548 +585 585 15639.05332300708 +586 585 -6786.559541184164 +20 586 -7776.127820358392 +372 586 -1380.312146472707 +401 586 -2599.98694265157 +436 586 -1380.329806372442 +585 586 -6457.622164502371 +586 586 17498.92361971994 +22 587 -2494.921101809047 +445 587 -43.06977135148053 +446 587 -43.09204566542856 +576 587 -833.6842962708397 +587 587 10639.63132992735 +588 587 -3459.278282319911 +587 588 -3163.901217834512 +588 588 11863.29841123642 +589 588 -4457.678583676169 +588 589 -4155.848484031309 +589 589 13631.37237924284 +590 589 -5587.405668898784 +589 590 -5272.097821664735 +590 590 15639.05334155582 +591 590 -6786.55954236509 +16 591 -7776.128217862464 +162 591 -1380.295394386621 +191 591 -2599.987079369668 +292 591 -1380.346691498149 +590 591 -6457.622165057279 +591 591 17498.92407367592 +1026 591 -461.538118048759 +21 592 -2494.921955469828 +441 592 -43.06977100683913 +456 592 -43.0936688598746 +518 592 -833.6845817457149 +592 592 10639.63581127319 +593 592 -3459.282537367605 +592 593 -3163.9050637982 +593 593 11863.30884919076 +594 593 -4457.686449578294 +593 594 -4155.855593609416 +594 594 13631.38977073439 +595 594 -5587.416539759725 +594 595 -5272.108171834642 +595 595 15639.07524961769 +596 595 -6786.57313565917 +13 596 -7774.824929187163 +158 596 -1380.062872536173 +220 596 -2599.55064223833 +440 596 -1380.101285163319 +595 596 -6457.634871171418 +596 596 17497.43366345873 +1022 596 -461.4602805247667 +6 597 -0.1113995649562018 +30 597 -0.355912865499056 +31 597 -0.1106332734770053 +100 597 0.1374689189535526 +101 597 2.007138702840491 +192 597 -0.2844369825618381 +597 597 13.79862800427398 +598 597 1.109529399003656 +605 597 1.99174567619484 +606 597 0.1372102154614681 +882 597 -1.596122282124526 +883 597 -0.2830782028005233 +1172 597 -1.595902049056434 +1201 597 -0.5552061819561538 +99 598 0.7026558198419938 +100 598 4.08884572543594 +101 598 0.02094395658430787 +597 598 0.6018929358590892 +598 598 27.81171142020743 +599 598 4.84502842496375 +605 598 0.02087081043378419 +606 598 4.07278264112378 +607 598 0.7025889069212166 +1172 598 -0.4708836759213634 +1201 598 -3.789431234013696 +1230 598 -1.290935449229267 +98 599 2.510208741827313 +99 599 10.31018211375302 +100 599 0.3660701277464004 +598 599 3.064304245660899 +599 599 68.77265332873907 +600 599 16.45483155155411 +606 599 0.3652775098234678 +607 599 10.30904345641438 +608 599 2.509466895372478 +1201 599 -0.9951043107342455 +1230 599 -10.24432782084244 +1259 599 -3.460772467782338 +97 600 9.126540472782963 +98 600 29.38624157708961 +99 600 1.50447997453928 +599 600 10.8055257376381 +600 600 190.868541886603 +601 600 58.02619723833303 +607 600 1.505073785409588 +608 600 29.36382869668083 +609 600 9.117182006298238 +1230 600 -2.517459486903443 +1259 600 -29.89676459166631 +1288 600 -10.83908107293929 +96 601 34.63570629773393 +97 601 99.89275284797874 +98 601 5.341183902508963 +600 601 35.70883016285806 +601 601 633.4062224542109 +602 601 215.7290948241863 +608 601 5.335605933002364 +609 601 99.78565899188501 +610 601 34.60357028303213 +1259 601 -7.116782205486194 +1288 601 -102.1724586948415 +1317 601 -38.15310319607028 +95 602 118.9587869579888 +96 602 355.4160870176547 +97 602 20.69928735793558 +601 602 132.7691369834189 +602 602 2210.948565250566 +603 602 730.4323202241146 +609 602 20.6764778055743 +610 602 355.126344874616 +611 602 118.8942143835484 +1288 602 -24.31759636089093 +1317 602 -362.3259817902787 +1346 602 -125.7567301804282 +94 603 322.8649081532538 +95 603 1106.721596673775 +96 603 77.48982208381979 +602 603 484.0912193533914 +603 603 6790.933780294751 +604 603 1964.035644411098 +610 603 77.43022375004998 +611 603 1106.268580609609 +612 603 322.7972631615079 +1317 603 -84.67988115514328 +1346 603 -1122.13880573201 +1375 603 -333.3803957358048 +5 604 684.339860986732 +65 604 4138.932642224661 +66 604 684.2754535202582 +94 604 2708.657680181569 +95 604 239.8890065931932 +250 604 -688.7093100302527 +603 604 1473.950210974569 +604 604 16472.15487400327 +611 604 239.806775603579 +612 604 2708.236378131226 +1027 604 -4120.298874002047 +1028 604 -688.6454795589129 +1346 604 -251.6870463874637 +1375 604 -2733.160103689278 +30 605 -0.1108110074554492 +31 605 -0.3535499725096735 +32 605 -0.1103000714920561 +597 605 1.998134989036808 +598 605 0.1373430764335994 +605 605 13.72890257412259 +606 605 1.107399047954297 +613 605 1.986364095850089 +614 605 0.1372284986616419 +882 605 -0.2834936040489232 +883 605 -1.591448959960436 +884 605 -0.2826401613692182 +597 606 0.02108298971517897 +598 606 4.079782907910553 +599 606 0.7024987213784675 +605 606 0.5996262641379249 +606 606 27.73775069931122 +607 606 4.844632930954385 +613 606 0.02100510391262689 +614 606 4.067026243459411 +615 606 0.7027799639786005 +598 607 0.3657752587088033 +599 607 10.30908574949062 +600 607 2.509494317552914 +606 607 3.06035126464303 +607 607 68.77553572128089 +608 607 16.45218206328933 +614 607 0.3651218753385019 +615 607 10.31111530684468 +616 607 2.509666878947226 +599 608 1.504907138701208 +600 608 29.37263232545549 +601 608 9.120702557640332 +607 608 10.81072443918915 +608 608 190.7803516936023 +609 608 57.98581871989078 +615 608 1.505807761473278 +616 608 29.35919892526539 +617 608 9.114203219970463 +600 609 5.338186021066216 +601 609 99.82996245145878 +602 609 34.61640611306987 +608 609 35.68628203988648 +609 609 632.9485873713745 +610 609 215.5893194331298 +616 609 5.334147543928419 +617 609 99.74799339605232 +618 609 34.59126868493748 +601 610 20.68645910034293 +602 610 355.2469451241753 +603 610 118.9204619352949 +609 610 132.6718602499851 +610 610 2209.69193460695 +611 610 730.1490361871821 +617 610 20.66830010623255 +618 610 355.0099204870472 +619 610 118.8664670911682 +602 611 77.45570172804071 +603 611 1106.456554730172 +604 611 322.8246220380972 +610 611 483.8328065366808 +611 611 6788.931414023486 +612 611 1963.727398565082 +618 611 77.40575243234984 +619 611 1106.060985272167 +620 611 322.7614489098833 +65 612 684.2996794504211 +66 612 4138.608912196344 +67 612 684.2268307034302 +603 612 239.8411928041641 +604 612 2708.403707383211 +611 612 1473.583182335953 +612 612 16470.16499295273 +619 612 239.7670740184652 +620 612 2707.981910570527 +1027 612 -688.6683064367346 +1028 612 -4119.97493360814 +1029 612 -688.5967854733863 +31 613 -0.1102960661297616 +32 613 -0.3525012546417421 +33 613 -0.1103347901172705 +605 613 1.988570781762037 +606 613 0.1371575153871645 +613 613 13.70253643732715 +614 613 1.106806386363163 +621 613 1.988715051798756 +622 613 0.1373709173092234 +883 613 -0.2827531376810636 +884 613 -1.589810934582515 +885 613 -0.2828010288461961 +605 614 0.02115838222743976 +606 614 4.069396990317837 +607 614 0.7024984885241177 +613 614 0.5989549660428598 +614 614 27.71030313932565 +615 614 4.845456095706945 +621 614 0.02110308984606984 +622 614 4.069810802258235 +623 614 0.7028684960779985 +606 615 0.3654118850523194 +607 615 10.31004622580906 +608 615 2.509177728912829 +614 615 3.059230500999168 +615 615 68.78739159161984 +616 615 16.4535909118572 +622 615 0.365339272150479 +623 615 10.31121795606553 +624 615 2.509920693074823 +607 616 1.505771977510156 +608 616 29.36051334661573 +609 616 9.114683972710898 +615 616 10.81495321623704 +616 616 190.7648121323327 +617 616 57.97400107931546 +623 616 1.505724356751482 +624 616 29.36377445779832 +625 616 9.116298146328795 +608 617 5.335156837858154 +609 617 99.7616075507193 +610 617 34.59485871769866 +616 617 35.68064878003539 +617 617 632.7960007132881 +618 617 215.5392625834085 +624 617 5.335333843681187 +625 617 99.76992904872245 +626 617 34.59801875922442 +609 618 20.67212211188899 +610 618 355.0529225886783 +611 618 118.8757336843754 +617 618 132.638318977737 +618 618 2209.209389299829 +619 618 730.0321683324846 +625 618 20.67295497893652 +626 618 355.065589074772 +627 618 118.8778341431492 +610 619 77.41590383840695 +611 619 1106.138454244923 +612 619 322.7744132037024 +618 619 483.730091900527 +619 619 6788.021395599544 +620 619 1963.558985670967 +626 619 77.4167087522421 +627 619 1106.121425671783 +628 619 322.7632178756676 +66 620 684.2442160899624 +67 620 4138.347237764907 +68 620 684.2033233435466 +611 620 239.7824666885894 +612 620 2708.073140383899 +619 620 1473.40341026411 +620 620 16468.88486826399 +627 620 239.7750703953772 +628 620 2707.93668971228 +1028 620 -688.6120093799789 +1029 620 -4119.713335956782 +1030 620 -688.5731424142143 +32 621 -0.1101770232897716 +33 621 -0.3530481127748535 +34 621 -0.1107542853286894 +613 621 1.98643159090679 +614 621 0.1371297074125456 +621 621 13.73054288468575 +622 621 1.1081802723493 +629 621 1.998473444476485 +630 621 0.1376190042671816 +884 621 -0.2826154119335968 +885 621 -1.591576133909903 +886 621 -0.2835527707257348 +613 622 0.02116061743896624 +614 622 4.067209413640597 +615 622 0.7026356212180673 +621 622 0.6002505907185719 +622 622 27.7421212451657 +623 622 4.846200765577472 +629 622 0.02114264824277373 +630 622 4.080790294667562 +631 622 0.7030276958758057 +614 623 0.3653629582672296 +615 623 10.31159578619193 +616 623 2.509476152695535 +622 623 3.061462741871595 +623 623 68.78746452241 +624 623 16.4560348752513 +630 623 0.3659009871611225 +631 623 10.31207483661939 +632 623 2.51073809735941 +615 624 1.506228787349696 +616 624 29.360443512096 +617 624 9.114022194590873 +623 624 10.81330484912562 +624 624 190.8127000534814 +625 624 57.99596326773238 +631 624 1.50531799138198 +632 624 29.38136062385443 +633 624 9.123954524671557 +616 625 5.334902380424173 +617 625 99.7509426800794 +618 625 34.59112097112979 +624 625 35.69290454529903 +625 625 633.0318815270023 +626 625 215.6122848353062 +632 625 5.339592343920438 +633 625 99.85422589718331 +634 625 34.62407802594778 +617 626 20.6696821146416 +618 626 355.0132753136912 +619 626 118.8653312820591 +625 626 132.6884359680864 +626 626 2209.837003579164 +627 626 730.1697840128834 +633 626 20.69070623854525 +634 626 355.2950716521337 +635 626 118.9296015544301 +618 627 77.40709018073673 +619 627 1106.047611989871 +620 627 322.7546318876566 +626 627 483.8563643790677 +627 627 6788.888219301842 +628 627 1963.65817213045 +634 627 77.4632945853558 +635 627 1106.469264787742 +636 627 322.811850314428 +67 628 684.2059582125834 +68 628 4138.32264278451 +69 628 684.2316254538505 +619 628 239.7631006284826 +620 628 2707.904516899463 +627 628 1473.545401826711 +628 628 16469.21515418549 +635 628 239.8357792020925 +636 628 2708.192576397406 +1029 628 -688.5733715496294 +1030 628 -4119.689191086228 +1031 628 -688.6008917958994 +8 629 -0.1112635178893547 +33 629 -0.1104606196674863 +34 629 -0.3550378361068255 +92 629 0.1377361771216093 +93 629 2.00759065961601 +163 629 -0.2844925665604545 +621 629 1.992020088102739 +622 629 0.137255750688364 +629 629 13.80158140286741 +630 629 1.110907463130753 +885 629 -0.2830842333779043 +886 629 -1.596348190099423 +1404 629 -1.596689354753938 +1433 629 -0.5553789840037436 +91 630 0.7032072323179108 +92 630 4.090202768654848 +93 630 0.02110362537484189 +621 630 0.02108382344966347 +622 630 4.073576265588217 +623 630 0.7027267596016089 +629 630 0.6029816430299357 +630 630 27.81982415314014 +631 630 4.847900667581123 +1404 630 -0.4710229696226078 +1433 630 -3.791162541239801 +1462 630 -1.291445823670615 +90 631 2.51164259806243 +91 631 10.3142634796682 +92 631 0.3663622909642986 +622 631 0.3656271550160903 +623 631 10.31131015952613 +624 631 2.509959974048873 +630 631 3.066295745950381 +631 631 68.79571835153536 +632 631 16.46222062694688 +1433 631 -0.9954743097361258 +1462 631 -10.24895390666753 +1491 631 -3.462272145354451 +89 632 9.130613902818585 +90 632 29.39832213377286 +91 632 1.505250434975364 +623 632 1.505793731959696 +624 632 29.37024354039084 +625 632 9.118828154309632 +631 632 10.81038696941754 +632 632 190.9336289290157 +633 632 58.04678491582568 +1462 632 -2.518502952719819 +1491 632 -29.90977014732201 +88 633 34.64587700649715 +89 633 99.92702175364731 +90 633 5.34348201961495 +624 633 5.337279217203342 +625 633 99.80298385831559 +626 633 34.60786743088075 +632 633 35.7220632173436 +633 633 633.5829955066068 +634 633 215.7790557862296 +1491 633 -7.119711258758923 +87 634 118.9714598018676 +88 634 355.4858202290268 +89 634 20.70593375656577 +625 634 20.68052478334604 +626 634 355.1591076250362 +627 634 118.8989426859454 +633 634 132.8046288942835 +634 634 2211.294585636278 +635 634 730.4918432603647 +86 635 322.8483448467146 +87 635 1106.747505597777 +88 635 77.50183239878265 +626 635 77.43646514081001 +627 635 1106.26987015884 +628 635 322.7856611199413 +634 635 484.1518483520844 +635 635 6791.035781304703 +636 635 1963.946250656798 +7 636 684.2466172686219 +68 636 684.2215024466593 +69 636 4138.460959622807 +86 636 2708.375625299206 +87 636 239.8838497027666 +221 636 -688.6154331944306 +627 636 239.8013690568581 +628 636 2708.059260945704 +635 636 1473.918553299514 +636 636 16470.6928801935 +1030 636 -688.5888947834977 +1031 636 -4119.828233376744 +8 637 -0.1112589092520859 +40 637 -0.3549750476318569 +41 637 -0.110459272716295 +92 637 0.1377442124992137 +93 637 2.007734479525582 +163 637 -0.2845033374268605 +637 637 13.8024674493741 +638 637 1.111105186984676 +645 637 1.992190130939008 +646 637 0.13735487693316 +1404 637 -1.596782550715123 +1433 637 -0.5554198850118814 +91 638 0.7032625904736798 +92 638 4.090560319753489 +93 638 0.02112111167960656 +637 638 0.6031039401939773 +638 638 27.82249053848378 +639 638 4.848573744733092 +645 638 0.02108808354103647 +646 638 4.074157573741074 +647 638 0.7029631553230687 +1404 638 -0.471048182895834 +1433 638 -3.791436557252009 +1462 638 -1.291554682555347 +90 639 2.51185703653575 +91 639 10.3152468090404 +92 639 0.3664204577679926 +638 639 3.066693574132453 +639 639 68.80398801795789 +640 639 16.46451444187839 +646 639 0.3656736478619467 +647 639 10.31321911926271 +648 639 2.51063374051162 +1433 639 -0.9955425867029239 +1462 639 -10.24979197548879 +1491 639 -3.462575026596724 +89 640 9.131351707117251 +90 640 29.40106735923205 +91 640 1.505436717188452 +639 640 10.8118155616988 +640 640 190.9588530737778 +641 640 58.05453628281519 +647 640 1.506045084784167 +648 640 29.37623973991745 +649 640 9.120905498351496 +1462 640 -2.518701233109652 +1491 640 -29.91227089628197 +88 641 34.64807261052491 +89 641 99.93503644228197 +90 641 5.344044737285112 +640 641 35.72693237276721 +641 641 633.6606275009168 +642 641 215.8019929928387 +648 641 5.33829445984092 +649 641 99.82173709744758 +650 641 34.61376949065974 +1491 641 -7.120285250999673 +87 642 118.9756049364548 +88 642 355.5057240048603 +89 642 20.70765694161719 +641 642 132.8205910705019 +642 642 2211.490514608355 +643 642 730.5356406351016 +649 642 20.68413457117991 +650 642 355.2066011959791 +651 642 118.909956283428 +86 643 322.8483783738317 +87 643 1106.77378809671 +88 643 77.50598083127971 +642 643 484.1911549101778 +643 643 6791.3113352564 +644 643 1963.96558857557 +650 643 77.44565518526612 +651 643 1106.336313811114 +652 643 322.7913065020023 +7 644 684.2211118795152 +50 644 4138.320085340803 +51 644 684.1957960749091 +86 644 2708.342875362001 +87 644 239.888196062359 +221 644 -688.5900906588093 +643 644 1473.963797992275 +644 644 16470.58566277439 +651 644 239.8120144454009 +652 644 2708.04567491226 +40 645 -0.110716451002412 +41 645 -0.3527838838187115 +42 645 -0.1101559856217036 +637 645 1.998608595245628 +638 645 0.1376257419417153 +645 645 13.73160655949145 +646 645 1.108649952521954 +653 645 1.986591643260672 +654 645 0.1372990588478301 +637 646 0.0211977399144716 +638 646 4.081252655125081 +639 646 0.7031002214158391 +645 646 0.6005851646108994 +646 646 27.74605077208346 +647 646 4.847465657864909 +653 646 0.02117803289416265 +654 646 4.067945061302149 +655 646 0.7030069015503807 +638 647 0.3660225892607714 +639 647 10.31358192773686 +640 647 2.511079273919321 +646 647 3.062238782068897 +647 647 68.80074854786167 +648 647 16.46010582511023 +654 647 0.3654351152223045 +655 647 10.31424033845254 +656 647 2.51050473379266 +639 648 1.505662745323293 +640 648 29.38609997132112 +641 648 9.125291084912423 +647 648 10.81580875075142 +648 648 190.8550675676341 +649 648 58.00959614250442 +655 648 1.506589613996273 +656 648 29.36913728540624 +657 648 9.117179606108673 +640 649 5.340640735150448 +641 649 99.86919813102253 +642 649 34.6283493577473 +648 649 35.70126031277599 +649 649 633.1664038341148 +650 649 215.6536688377475 +656 649 5.336376634671313 +657 649 99.7790479897384 +658 649 34.60041247928721 +641 650 20.69400283445259 +642 650 355.3339106441066 +643 650 118.9383755822129 +649 650 132.7162069839088 +650 650 2210.191689138182 +651 650 730.2563121749436 +657 650 20.67507641629657 +658 650 355.0884921051497 +659 650 118.8847123424446 +642 651 77.47136203930201 +643 651 1106.527955963883 +644 651 322.8179336014958 +650 651 483.9276375074773 +651 651 6789.469697009752 +652 651 1963.744586641268 +658 651 77.42163313633391 +659 651 1106.175689304646 +660 651 322.7761673344691 +50 652 684.212608372114 +51 652 4138.281173536574 +52 652 684.2089988184118 +643 652 239.8457265137849 +644 652 2708.192751839102 +651 652 1473.645977134045 +652 652 16469.53797339262 +659 652 239.7851575431851 +660 652 2708.002581557608 +41 653 -0.1102448096978015 +42 653 -0.3519712320315259 +43 653 -0.1102456713847578 +645 653 1.988835008335901 +646 653 0.1373969849282957 +653 653 13.70407447088103 +654 653 1.107642527357136 +661 653 1.988816955916391 +662 653 0.1373964486998547 +645 654 0.02121269579327661 +646 654 4.070423851710916 +647 654 0.7029993690799823 +653 654 0.5995839753265787 +654 654 27.71595130546382 +655 654 4.847456133711025 +661 654 0.02120977951841574 +662 654 4.070393197141414 +663 654 0.7029963727500391 +646 655 0.3655476560466264 +647 655 10.31349176504308 +648 655 2.510505001829044 +654 655 3.060516492904743 +655 655 68.80613211569579 +656 655 16.45956440430759 +662 655 0.3655422405543658 +663 655 10.31343803366114 +664 655 2.510498499165092 +647 656 1.506285820108535 +648 656 29.37140574541429 +649 656 9.118592501734087 +655 656 10.8186839021312 +656 656 190.8234739618488 +657 656 57.9930326436411 +663 656 1.506275948317799 +664 656 29.3712856476594 +665 656 9.118567104482448 +648 657 5.337043788703914 +649 657 99.79516555485974 +650 657 34.60567725217747 +656 657 35.69235750179249 +657 657 632.9780420722479 +658 657 215.595272118898 +664 657 5.337014988418129 +665 657 99.79490110430108 +666 657 34.60562403384126 +649 658 20.6785034036707 +650 658 355.1356966797375 +651 658 118.8956247812422 +657 658 132.6757927363835 +658 658 2209.673677157924 +659 658 730.1444651175686 +665 658 20.67844575213953 +666 658 355.135107363189 +667 658 118.895490215003 +650 659 77.43130875845097 +651 659 1106.250369076548 +652 659 322.7868790468453 +658 659 483.8216737991708 +659 659 6788.739395699176 +660 659 1963.664226657768 +666 659 77.43116889724682 +667 659 1106.248879214385 +668 659 322.7865437766681 +51 660 684.2161329602408 +52 660 4138.297828724928 +53 660 684.216138697957 +651 660 239.7984588471054 +652 660 2708.062406401067 +659 660 1473.520922937651 +660 660 16469.21227910755 +667 660 239.7981022410504 +668 660 2708.060883964245 +42 661 -0.1101545083653944 +43 661 -0.3527845846166308 +44 661 -0.1107179737430333 +653 661 1.986574414683558 +654 661 0.137296321919118 +661 661 13.73162458862533 +662 661 1.108648756131191 +669 661 1.99863398018209 +670 661 0.137628998061537 +653 662 0.02117835704498378 +654 662 4.067915789498505 +655 662 0.7030006832676706 +661 662 0.6005835039609989 +662 662 27.74608693965171 +663 662 4.847472940150663 +669 662 0.02119820664716954 +670 662 4.081298414147176 +671 662 0.7031099869913136 +654 663 0.3654334161274643 +655 663 10.3141833313816 +656 663 2.510490578693701 +662 663 3.062242281739874 +663 663 68.80089777092563 +664 663 16.46015122700451 +670 663 0.3660258906789693 +671 663 10.31368860578356 +672 663 2.511106614588728 +655 664 1.506583758742333 +656 664 29.36901164592223 +657 664 9.117142986365376 +663 664 10.81584072558231 +664 664 190.8554105553258 +665 664 58.00967871822441 +671 664 1.505677767065405 +672 664 29.38634235194278 +673 664 9.12535525902247 +656 665 5.336358079802353 +657 665 99.77875143377308 +658 665 34.60032654223031 +664 665 35.70130964952753 +665 665 633.1675041728926 +666 665 215.6540311311376 +672 665 5.34067740665108 +673 665 99.86986314959384 +674 665 34.62854593178957 +657 666 20.67502625649125 +658 666 355.0877992645753 +659 666 118.8845326287259 +665 666 132.7164569324502 +666 666 2210.19480974053 +667 666 730.2570045414169 +673 666 20.69413847709829 +674 666 355.3356677052395 +675 666 118.938798036404 +658 667 77.42150495744289 +659 667 1106.174329627095 +660 667 322.7758938786409 +666 667 483.9282718781221 +667 667 6789.472494019496 +668 667 1963.744407506098 +674 667 77.47172098645258 +675 667 1106.530491815256 +676 667 322.818231013115 +52 668 684.2089622144219 +53 668 4138.28196577097 +54 668 684.2127296106942 +659 668 239.7848949948722 +660 668 2708.001238057112 +667 668 1473.646165792335 +668 668 16469.54066946083 +675 668 239.8461197497397 +676 668 2708.194690687773 +9 669 -0.1112593801382966 +43 669 -0.1104587906822998 +44 669 -0.354980215642747 +78 669 2.007745281961731 +79 669 0.1377460022081142 +297 669 -0.2845042579219569 +661 669 1.992215217591726 +662 669 0.1373553565485199 +669 669 13.802558588624 +670 669 1.111113756067136 +78 670 0.02112126148608595 +79 670 4.090598719614089 +80 670 0.7032716114423763 +661 670 0.02109041131326944 +662 670 4.074201473233019 +663 670 0.7029684420407517 +669 670 0.6031080335644606 +670 670 27.822691066026 +671 670 4.848610934438236 +79 671 0.3664240909335575 +80 671 10.31537775906899 +81 671 2.51189317085967 +662 671 0.3656805921114107 +663 671 10.31332200716542 +664 671 2.510655375551595 +670 671 3.066715425664745 +671 671 68.80453063381898 +672 671 16.46464886424512 +80 672 1.505456781652615 +81 672 29.40148758721863 +82 672 9.131478599661783 +663 672 1.506065204221682 +664 672 29.3764729568429 +665 672 9.120959698604734 +671 672 10.81190484485079 +672 672 190.9602219124718 +673 672 58.05489219733104 +81 673 5.344121017946527 +82 673 99.93634866047056 +83 673 34.64845520231692 +664 673 5.338338775671274 +665 673 99.82236277839414 +666 673 34.61394633039141 +672 673 35.72716512832017 +673 673 633.6646217817323 +674 673 215.8031659805494 +82 674 20.7079230567026 +83 674 355.5090055713267 +84 674 118.976294932028 +665 674 20.68427008527704 +666 674 355.2082159232509 +667 674 118.9103251281697 +673 674 132.821432482079 +674 674 2211.501180627063 +675 674 730.5380578676004 +83 675 77.50663781276543 +84 675 1106.778037989395 +85 675 322.848762613373 +666 675 77.44599806972721 +667 675 1106.338743843569 +668 675 322.7915828319153 +674 675 484.1933787536357 +675 675 6791.32556498249 +676 675 1963.966864335383 +10 676 684.2210054868722 +53 676 684.1960530903971 +54 676 4138.320228854247 +84 676 239.8888827816383 +85 676 2708.344223771753 +326 676 -688.5899835038174 +667 676 239.8124385320294 +668 676 2708.048107850856 +675 676 1473.965990190464 +676 676 16470.59313762731 +9 677 -0.1112542500218409 +25 677 -0.3549651880094754 +26 677 -0.110469262651785 +78 677 2.007662240114359 +79 677 0.137735723111283 +297 677 -0.2844923196322728 +677 677 13.80224022749582 +678 677 1.111096323117062 +685 677 1.992173809063772 +686 677 0.1373646366315042 +78 678 0.02112083209830867 +79 678 4.090481271368435 +80 678 0.7032504545782575 +677 678 0.6030969607501863 +678 678 27.82221785317291 +679 678 4.848547473576627 +685 678 0.02107442189792613 +686 678 4.074132777355389 +687 678 0.7029757477717991 +79 679 0.3664164801464727 +80 679 10.31522061675869 +81 679 2.511867113453655 +678 679 3.066664117036422 +679 679 68.80380296763387 +680 679 16.46454759704535 +686 679 0.3656528987741626 +687 679 10.31319354650767 +688 679 2.510660183929195 +80 680 1.505441747623904 +81 680 29.40141513394541 +82 680 9.131514030064359 +679 680 10.81179938366987 +680 680 190.9595481160109 +681 680 58.05494589078998 +687 680 1.506016467623044 +688 680 29.3762450454991 +689 680 9.120960701029386 +81 681 5.344128105206013 +82 681 99.93727460799565 +83 681 34.64898676191465 +680 681 35.72707931855628 +681 681 633.666452537057 +682 681 215.8046232499704 +688 681 5.338254018046181 +689 681 99.8218955694731 +690 681 34.61392880627674 +82 682 20.70816742339737 +83 682 355.5158936428234 +84 682 118.9792606994007 +681 682 132.8219132175118 +682 682 2211.520875334059 +683 682 730.5473768989181 +689 682 20.68409544677559 +690 682 355.2076375373839 +691 682 118.9105211138115 +83 683 77.5082837302337 +84 683 1106.80894542701 +85 683 322.859326594287 +682 683 484.1981132838129 +683 683 6791.424572298089 +684 683 1964.002293012762 +690 683 77.44578216231389 +691 683 1106.340616354276 +692 683 322.7929590980366 +10 684 684.2478366771651 +60 684 4138.413560759633 +61 684 684.200257479204 +84 684 239.8959349202357 +85 684 2708.439080938684 +326 684 -688.616504387247 +683 684 1473.988742371169 +684 684 16470.91612700908 +691 684 239.8128076262359 +692 684 2708.060135790784 +25 685 -0.110705753966986 +26 685 -0.3527891805737253 +27 685 -0.1101610396942302 +677 685 1.99859802505402 +678 685 0.1376146288145607 +685 685 13.73182889969397 +686 685 1.108661223775614 +693 685 1.986688442145242 +694 685 0.1373102753073311 +677 686 0.02120916673281498 +678 686 4.081244190029913 +679 686 0.7030835937608113 +685 686 0.6005917918591505 +686 686 27.74636238494894 +687 686 4.847500873755367 +693 686 0.02117930749338687 +694 686 4.06807844552367 +695 686 0.7030298823619128 +678 687 0.3660376064156797 +679 687 10.31359208700438 +680 687 2.511062561973362 +686 687 3.062267332198361 +687 687 68.80124794831271 +688 687 16.46017924276211 +694 687 0.3654443450390605 +695 687 10.31441717733722 +696 687 2.510531048806373 +679 688 1.505690018623627 +680 688 29.38619828616968 +681 688 9.125287167123899 +687 688 10.8158916942986 +688 688 190.8553980167553 +689 688 58.00946310266031 +695 688 1.506607375181064 +696 688 29.36916887617459 +697 688 9.117112016440336 +680 689 5.340697658922364 +681 689 99.86967897178067 +682 689 34.62845964016601 +688 689 35.701290907362 +689 689 633.1634497589616 +690 689 215.6518319601067 +696 689 5.336360404645452 +697 689 99.77765803629543 +698 689 34.59965641301995 +681 690 20.69417796561948 +682 690 355.3359284923342 +683 690 118.9389802070025 +689 690 132.7154672037388 +690 690 2210.168815850923 +691 690 730.2463515155532 +697 690 20.67472709561286 +698 690 355.0790368928611 +699 690 118.8807404811885 +682 691 77.47192773486083 +683 691 1106.534240043489 +684 691 322.8197280128109 +690 691 483.9222727557035 +691 691 6789.365104274119 +692 691 1963.708898855852 +698 691 77.41940358660132 +699 691 1106.134788447856 +700 691 322.7623982244629 +60 692 684.217469269407 +61 692 4138.193200495189 +62 692 684.1747399635084 +683 692 239.8471839603822 +684 692 2708.210474808619 +691 692 1473.622025678526 +692 692 16469.22297214731 +699 692 239.7758700903644 +700 692 2707.880099845643 +26 693 -0.1102390642966326 +27 693 -0.351992195188139 +28 693 -0.1102377762475907 +685 693 1.988934616083783 +686 693 0.1373972446727011 +693 693 13.70462858313476 +694 693 1.107673775561949 +701 693 1.988932751526133 +702 693 0.1373954647971891 +685 694 0.0212259803881289 +686 694 4.070564117105869 +687 694 0.7030063128457444 +693 694 0.5996047210865935 +694 694 27.7167225548882 +695 694 4.847547425690742 +701 694 0.02122764985194825 +702 694 4.070555516613839 +703 694 0.7030019327515376 +686 695 0.3655745767103307 +687 695 10.3136920993938 +688 695 2.510511976727483 +694 695 3.060595186946034 +695 695 68.80716728355337 +696 695 16.4596621424316 +702 695 0.3655760930221787 +703 695 10.31365515174873 +704 695 2.510496510536274 +687 696 1.506335174097055 +688 696 29.37150236350348 +689 696 9.118502187487175 +695 696 10.81883248119603 +696 696 190.8236251161517 +697 696 57.99253633054376 +703 696 1.506333039154752 +704 696 29.37134910321157 +705 696 9.11844114287857 +688 697 5.337078894920609 +689 697 99.7939524095781 +690 697 34.60490074209019 +696 697 35.69232013215878 +697 697 632.9693380011515 +698 697 215.5904242150815 +704 697 5.337054332572545 +705 697 99.79334615881916 +706 697 34.60466514217693 +689 698 20.67825712131543 +690 698 355.1267557697429 +691 698 118.8916769194596 +697 698 132.6737141021923 +698 698 2209.614115163195 +699 698 730.1192039460822 +705 698 20.67814106505299 +706 698 355.124340912658 +707 698 118.8908087800638 +690 699 77.42930195845391 +691 699 1106.210462927229 +692 699 322.773165781046 +698 699 483.8077604881255 +699 699 6788.480119953596 +700 699 1963.576573385059 +706 699 77.42878167581321 +707 699 1106.202537134771 +708 699 322.7707875737119 +61 700 684.182078274918 +62 700 4138.078041018922 +63 700 684.1765741470388 +691 700 239.7895029981522 +692 700 2707.941568610262 +699 700 1473.462161766306 +700 700 16468.42995325605 +707 700 239.7878069082747 +708 700 2707.920908096767 +27 701 -0.1101620128862816 +28 701 -0.3527897464264946 +29 701 -0.1107050990228545 +693 701 1.986686210082338 +694 701 0.1373111352321558 +701 701 13.73182822270479 +702 701 1.108660317199048 +709 701 1.998599820116499 +710 701 0.1376134530562626 +693 702 0.02117801683263532 +694 702 4.068069131343848 +695 702 0.7030293420725235 +701 702 0.6005911539446296 +702 702 27.74636187070349 +703 702 4.847500860389189 +709 702 0.02120952100606777 +710 702 4.081252739456948 +711 702 0.7030847377699337 +694 703 0.3654416525447806 +695 703 10.31438084744666 +696 703 2.510522650655119 +702 703 3.0622679477109 +703 703 68.80123515755585 +704 703 16.46017394519284 +710 703 0.3660403360077213 +711 703 10.3136251704706 +712 703 2.511070899846565 +695 704 1.506598877740263 +696 704 29.36902733494276 +697 704 9.117066362462038 +703 704 10.81588892011878 +704 704 190.8553053982433 +705 704 58.00942857028608 +711 704 1.505697388291193 +712 704 29.38631747375216 +713 704 9.12532654877778 +696 705 5.336329029499167 +697 705 99.77708745219968 +698 705 34.59944906901984 +704 705 35.7012665757721 +705 705 633.1633378165797 +706 705 215.651887131755 +712 705 5.340722481359944 +713 705 99.87023433119214 +714 705 34.62869842719375 +697 706 20.67459892989101 +698 706 355.0767247475224 +699 706 118.8799244413074 +705 706 132.7154665288535 +706 706 2210.169603873373 +707 706 730.2469076673406 +713 706 20.69430564241224 +714 706 355.3385768429559 +715 706 118.9400136481689 +698 707 77.41887756119729 +699 707 1106.1269175423 +700 707 322.7600168114448 +706 707 483.9224648687419 +707 707 6789.37260142394 +708 707 1963.711851038699 +714 707 77.47252562908724 +715 707 1106.544667545694 +716 707 322.8230752859335 +62 708 684.1692708683647 +63 708 4138.199657101961 +64 708 684.2253525558427 +699 708 239.7741340183031 +700 708 2707.859416658532 +707 708 1473.623908332431 +708 708 16469.2469875382 +715 708 239.8495360598847 +716 708 2708.239897945254 +11 709 -0.1112540173917435 +28 709 -0.1104705144969548 +29 709 -0.3549645540152651 +70 709 2.007658148677907 +71 709 0.1377345723949437 +373 709 -0.2844921425106453 +701 709 1.992175810900541 +702 709 0.1373660758049632 +709 709 13.80223594073033 +710 709 1.111091003618681 +70 710 0.02112080675787176 +71 710 4.090456999960709 +72 710 0.7032443096770233 +701 710 0.02107284813938032 +702 710 4.074142253256998 +703 710 0.7029802770735017 +709 710 0.6030932248621848 +710 710 27.82220066054727 +711 710 4.848544966558359 +71 711 0.3664143556354539 +72 711 10.3151256362 +73 711 2.51183950672484 +702 711 0.3656519502121223 +703 711 10.31322983556869 +704 711 2.510674493619877 +710 711 3.066663918520878 +711 711 68.80375115932104 +712 711 16.46453455665843 +72 712 1.505427693607084 +73 712 29.4010848104306 +74 712 9.131412764466146 +703 712 1.506018971188718 +704 712 29.37637861677828 +705 712 9.121012293571285 +711 712 10.81179044613454 +712 712 190.9593883332583 +713 712 58.05492055476703 +73 713 5.344067172747099 +74 713 99.93626299036193 +75 713 34.64871387887979 +704 713 5.338273869184635 +705 713 99.82249041681328 +706 713 34.61418632667542 +712 713 35.72704217324879 +713 713 633.6667611551063 +714 713 215.8050313476256 +74 714 20.7079653178382 +75 714 355.5137169879983 +76 714 118.9789233694943 +705 714 20.68421940516216 +706 714 355.2103733897362 +707 714 118.9115848658427 +713 714 132.8220259184945 +714 714 2211.526351231859 +715 714 730.5502582829918 +75 715 77.50786762286961 +76 715 1106.807784385434 +77 715 322.859808364096 +706 715 77.44638298591602 +707 715 1106.351136348653 +708 715 322.7963450132498 +714 715 484.1994212830706 +715 715 6791.456903391227 +716 715 1964.014057755769 +12 716 684.2499336683695 +63 716 684.2079404939534 +64 716 4138.443285327507 +76 716 239.8958952856551 +77 716 2708.445283167119 +402 716 -688.6185746331226 +707 716 239.8151464704091 +708 716 2708.088929450305 +715 716 1473.996325713642 +716 716 16471.02363214647 +11 717 -0.1112684151222162 +35 717 -0.3550491152112604 +36 717 -0.1104494333433372 +70 717 2.007667218454202 +71 717 0.1377459946913179 +373 717 -0.2845037408653813 +717 717 13.80181036373975 +718 717 1.110920875399602 +725 717 1.992033720525753 +726 717 0.1372444226001813 +70 718 0.02110372775478414 +71 718 4.090305925324267 +72 718 0.7032256313343654 +717 718 0.6029917332690747 +718 718 27.82011467544272 +719 718 4.847931749567023 +725 718 0.02109907239657249 +726 718 4.073589722239815 +727 718 0.7027084615908528 +71 719 0.3663686036069542 +72 719 10.3143875505509 +73 719 2.511660206072197 +718 719 3.066327433453335 +719 719 68.7959571127811 +720 719 16.46220111210157 +726 719 0.3656481960319509 +727 719 10.31129619209302 +728 719 2.509920388265626 +72 720 1.505259742988215 +73 720 29.39829632660468 +74 720 9.130549375381054 +719 720 10.81041255994676 +720 720 190.9330326723286 +721 720 58.04636867348363 +727 720 1.505820679250199 +728 720 29.37010747213416 +729 720 9.118720815639209 +73 721 5.343457024909672 +74 721 99.92577426205382 +75 721 34.64523761646176 +720 721 35.72193113892376 +721 721 633.5768304559651 +722 721 215.7760580088408 +728 721 5.337299179103745 +729 721 99.80221605554416 +730 721 34.60744238652015 +74 722 20.70562260807599 +75 722 355.477888950322 +76 722 118.9681650380567 +721 722 132.803216445474 +722 722 2211.259550940094 +723 722 730.4775408542546 +729 722 20.68043542538286 +730 722 355.155390335614 +731 722 118.8973505456311 +75 723 77.49996682546974 +76 723 1106.713353821954 +77 723 322.8367600477239 +722 723 484.1438218467032 +723 723 6790.886951869239 +724 723 1963.895984427959 +730 723 77.43576695991753 +731 723 1106.254950201119 +732 723 322.7805424208466 +12 724 684.2178565734847 +55 724 4138.339455170348 +56 724 684.2094694744012 +76 724 239.8760683034091 +77 724 2708.272615802533 +402 724 -688.5870091702733 +723 724 1473.884606806991 +724 724 16470.25368493559 +731 724 239.7981644331731 +732 724 2708.016061017154 +35 725 -0.1107655523997323 +36 725 -0.3530422111548931 +37 725 -0.1101709686008088 +717 725 1.998481338852065 +718 725 0.1376312976712712 +725 725 13.7303197660071 +726 725 1.108169756585965 +733 725 1.986337213866036 +734 725 0.1371176236046318 +717 726 0.0211305157864925 +718 726 4.080789909503252 +719 726 0.7030430689058462 +725 726 0.600244485825317 +726 726 27.7418002176142 +727 726 4.846159756244637 +733 726 0.02116067862450594 +734 726 4.067085364751389 +735 726 0.7026131760846905 +718 727 0.3658837661527239 +719 727 10.31202799466121 +720 727 2.510747365730194 +726 727 3.061429141319614 +727 727 68.78697773300982 +728 727 16.45597713844932 +734 727 0.3653561457176453 +735 727 10.31145705899913 +736 727 2.509459231114685 +719 728 1.505282004766883 +720 728 29.38113737380472 +721 728 9.123914975105638 +727 728 10.81323165366494 +728 728 190.812482192176 +729 728 57.99612486975755 +735 728 1.506219752580991 +736 728 29.36055592082681 +737 728 9.114135148729025 +720 729 5.339508268261624 +721 729 99.853194751514 +722 729 34.62373415240912 +728 729 35.69289580555218 +729 729 633.0348229837919 +730 729 215.6140155771336 +736 729 5.334950146151792 +737 729 99.75289196325804 +738 729 34.59208157092614 +721 730 20.69040902501098 +722 730 355.2905246406909 +723 730 118.9280183268657 +729 730 132.6891379819822 +730 730 2209.859376714947 +731 730 730.1793866531505 +737 730 20.67015564845467 +738 730 355.0250527520554 +739 730 118.8701288049869 +722 731 77.46216550949138 +723 731 1106.452023965492 +724 731 322.8064444879697 +730 731 483.8616879966354 +731 731 6788.985165949372 +732 731 1963.690634256037 +738 731 77.40985132722551 +739 731 1106.096409784371 +740 731 322.7707830140208 +55 732 684.21918918353 +56 732 4138.404511179819 +57 732 684.245692022677 +723 732 239.8317378091895 +724 732 2708.145571407504 +731 732 1473.567224069512 +732 732 16469.50628186507 +739 732 239.7741242649421 +740 732 2708.047692529266 +36 733 -0.1103418625952624 +37 733 -0.3524802677413817 +38 733 -0.1103027101591933 +725 733 1.988617471174193 +726 733 0.1373725136398145 +733 733 13.70198353768228 +734 733 1.106775441890985 +741 733 1.988453585754923 +742 733 0.1371568651660333 +725 734 0.02108810863779909 +726 734 4.069678154232454 +727 734 0.7028650012513862 +733 734 0.598934578206162 +734 734 27.70952889918677 +735 734 4.845363079834573 +741 734 0.02114256395106895 +742 734 4.069224887846389 +743 734 0.7024878372110849 +726 735 0.3653101541444252 +727 735 10.31105740834378 +728 735 2.509930580825234 +734 735 3.059150381551355 +735 735 68.78635860369799 +736 735 16.45349747433634 +742 735 0.3653790051754877 +743 735 10.30979233191591 +744 735 2.509166572322072 +727 736 1.505679277711181 +728 736 29.36383491004187 +729 736 9.116448830165368 +735 736 10.81480741936119 +736 736 190.7646771386817 +737 736 57.97449738273188 +743 736 1.50571355473875 +744 736 29.36030164525672 +745 736 9.11475015906985 +728 737 5.335323118020299 +729 737 99.77172437667075 +730 737 34.59902122605855 +736 737 35.68068794548587 +737 737 632.8046471834798 +738 737 215.544085669146 +744 737 5.335092254851675 +745 737 99.76253681656873 +746 737 34.59557183315474 +729 738 20.67330985695951 +730 738 355.0769833440173 +731 738 118.8826734166367 +737 738 132.6403777428211 +738 738 2209.268917697146 +739 738 730.0574274814846 +745 738 20.67230266402818 +746 738 355.0612373017058 +747 738 118.8795361356365 +730 739 77.41925926499457 +731 739 1106.169308071357 +732 739 322.7793058225653 +738 739 483.7440187523255 +739 739 6788.280521666211 +740 739 1963.646619905488 +746 739 77.41776938770666 +747 739 1106.176798718794 +748 739 322.7877877325625 +56 740 684.242891310501 +57 740 4138.567032757432 +58 740 684.2782758806852 +731 740 239.7857156201459 +732 740 2708.078186096333 +739 740 1473.462126372295 +740 740 16469.66712968235 +747 740 239.7910516730232 +748 740 2708.192435114947 +37 741 -0.1102935092641835 +38 741 -0.3535449921244408 +39 741 -0.1108229523078796 +733 741 1.986250285334343 +734 741 0.1372146254581452 +741 741 13.72870084973682 +742 741 1.10738831809987 +749 741 1.998171161978158 +750 741 0.1373578144696631 +733 742 0.02100421382628614 +734 742 4.066862704291623 +735 742 0.7027504483901286 +741 742 0.5996195024529243 +742 742 27.73747160989279 +743 742 4.844600366024745 +749 742 0.02107201854692742 +750 742 4.079836965514604 +751 742 0.7025238274116596 +734 743 0.3651107722611733 +735 743 10.31088021490906 +736 743 2.509626522988286 +742 743 3.060322744907465 +743 743 68.77519110124075 +744 743 16.45216566478506 +750 743 0.3657631106368877 +751 743 10.30917866687412 +752 743 2.509537497301615 +735 744 1.505784580732008 +736 744 29.35904416246213 +737 744 9.114233554095886 +743 744 10.81068089529471 +744 744 190.780421640604 +745 744 57.98604595619 +751 744 1.504894248701359 +752 744 29.37279117197427 +753 744 9.1207773055384 +736 745 5.334146464228941 +737 745 99.74908038505563 +738 745 34.59193427625326 +744 745 35.6863096699602 +745 745 632.9525461302428 +746 745 215.5914504678304 +752 745 5.33817196434681 +753 745 99.83013503543992 +754 745 34.61647540398208 +737 746 20.66859743534422 +738 746 355.0186617156979 +739 746 118.8702499202799 +745 746 132.672800216779 +746 746 2209.717919717273 +747 746 730.1596816150212 +753 746 20.68640832402316 +754 746 355.2468297289379 +755 746 118.9203329133525 +738 747 77.40785048621905 +739 747 1106.100448186306 +740 747 322.7749371300864 +746 747 483.8388659992414 +747 747 6789.038073170095 +748 747 1963.762797251862 +754 747 77.45556503674695 +755 747 1106.452501388121 +756 747 322.8229938064271 +57 748 684.2610495866138 +58 748 4138.697848742186 +59 748 684.2950841332997 +739 748 239.7760838431007 +740 748 2708.103016770827 +747 748 1473.607092646095 +748 748 16470.48302666939 +755 748 239.8399642389042 +756 748 2708.388015144404 +6 749 -0.111404556352996 +38 749 -0.1106226572069498 +39 749 -0.3559264663496506 +100 749 0.1374791942043029 +101 749 2.007222169015158 +192 749 -0.2844489241266202 +741 749 1.991787282175139 +742 749 0.1372012574966388 +749 749 13.79894979347276 +750 749 1.109548048226312 +1172 749 -1.595951450372922 +1201 749 -0.5552192256411559 +99 750 0.7026766303825606 +100 750 4.088962815325802 +101 750 0.02094450723306851 +741 750 0.02088698080563373 +742 750 4.072851579207308 +743 750 0.7025810283319518 +749 750 0.6019050521869209 +750 750 27.8121784813938 +751 750 4.845085448269026 +1172 750 -0.4708989769469035 +1201 750 -3.789515661217151 +1230 750 -1.290954179340621 +98 751 2.510234879380774 +99 751 10.31033887445048 +100 751 0.3660776995992507 +742 751 0.3653045786809421 +743 751 10.30917311942776 +744 751 2.50946441442619 +750 751 3.06435053033248 +751 751 68.77335552637238 +752 751 16.45492729721015 +1201 751 -0.9951264734925316 +1230 751 -10.2444557161139 +1259 751 -3.460789280880574 +97 752 9.126505920816578 +98 752 29.38631394853612 +99 752 1.504494345721747 +743 752 1.505123438456689 +744 752 29.36406904400649 +745 752 9.117185241093411 +751 752 10.8056255852623 +752 752 190.8692839844905 +753 752 58.02618010257714 +1230 752 -2.517488810971315 +1259 752 -29.89683200717032 +1288 752 -10.83902568035092 +96 753 34.63516066796571 +97 753 99.89180274273366 +98 753 5.341177025688726 +744 753 5.335692321876843 +745 753 99.78611689874862 +746 753 34.60357904419219 +752 753 35.70894552238163 +753 753 633.4042281972322 +754 753 215.7275051207882 +1259 753 -7.116789393878451 +1288 753 -102.1715949425332 +1317 753 -38.1525164305703 +95 754 118.955869089863 +96 754 355.409166385725 +97 754 20.69903369776109 +745 754 20.67664301475591 +746 754 355.1269592653969 +747 754 118.8940262649514 +753 754 132.7685619689767 +754 754 2210.929418643206 +755 754 730.4234543267614 +1288 754 -24.31735481385258 +1317 754 -362.3194400927304 +1346 754 -125.7537615431322 +94 755 322.8542837093939 +95 755 1106.690918705252 +96 755 77.48818362571052 +746 755 77.43045731803061 +747 755 1106.266531149851 +748 755 322.7958539454089 +754 755 484.0868057604732 +755 755 6790.834265072747 +756 755 1963.999374908238 +1317 755 -84.67824762679099 +1346 755 -1122.109112237027 +1375 755 -333.3697107886467 +5 756 684.3130349463368 +58 756 684.2713088726497 +59 756 4138.840010508131 +94 756 2708.562464374212 +95 756 239.881974334238 +250 756 -688.6827944690575 +747 756 239.8063474827774 +748 756 2708.224485838199 +755 756 1473.926834508702 +756 756 16471.8310889757 +1346 756 -251.6800242214344 +1375 756 -2733.066685277761 +1 757 -0.07202238895980161 +102 757 0.1757705451882168 +103 757 -0.07205557213332578 +115 757 -0.07205557286743877 +116 757 0.1757705487518101 +490 757 -0.1316560923836632 +757 757 4.706506037653789 +758 757 0.1763202034904443 +762 757 0.1763202063871695 +763 757 -0.07208135143983035 +102 758 -0.07206821560772349 +103 758 0.1760207667299805 +104 758 -0.07209148438461284 +757 758 0.1760190836314272 +758 758 4.710512078466347 +759 758 0.1764188557043242 +762 758 -0.07209275795744115 +763 758 0.176544912068222 +764 758 -0.07211185074923149 +103 759 -0.07209690473147437 +104 759 0.1761310509857135 +105 759 -0.07209690259758175 +758 759 0.1762797412007538 +759 759 4.712271997966937 +760 759 0.1762796932389577 +763 759 -0.07211776992993564 +764 759 0.1766517136229662 +765 759 -0.07211776776038273 +104 760 -0.07209147978058027 +105 760 0.1760207216394004 +106 760 -0.07206820875388878 +759 760 0.1764188599185555 +760 760 4.710511425996217 +761 760 0.1760190342646293 +764 760 -0.07211184694842136 +765 760 0.1765448802569846 +766 760 -0.07209275183067983 +2 761 -0.0720223811362323 +105 761 -0.07205556480204534 +106 761 0.1757704842734814 +107 761 0.175770493482977 +108 761 -0.07205556602173152 +548 761 -0.1316560567506967 +760 761 0.1763201601912128 +761 761 4.706505201257027 +765 761 -0.07208134510611626 +766 761 0.1763201636165216 +114 762 -0.07209148495104148 +115 762 0.1760207697960767 +116 762 -0.07206821624857299 +757 762 0.1760190833537105 +758 762 -0.07209275806571309 +762 762 4.710512124909013 +763 762 0.1765449113305262 +767 762 0.1764188593104241 +768 762 -0.07211185120024556 +757 763 -0.07210216710037635 +758 763 0.1762318904243458 +759 763 -0.07212435477584035 +762 763 0.1762318936092251 +763 763 4.714552237001135 +764 763 0.1766585556838692 +767 763 -0.07212435513587284 +768 763 0.1766585579652356 +769 763 -0.07214564923888007 +758 764 -0.07212859645209281 +759 764 0.1763206542365257 +760 764 -0.07212859454402709 +763 764 0.1765026441288125 +764 764 4.716472253967449 +765 764 0.1765026024180263 +768 764 -0.07215205562294104 +769 764 0.176775279505957 +770 764 -0.07215205366454223 +759 765 -0.07212435089174386 +760 765 0.1762318542021764 +761 765 -0.07210216116700362 +764 765 0.1766585594336864 +765 765 4.71455166988569 +766 765 0.1762318517110543 +769 765 -0.07214564605153422 +770 765 0.1766585336178877 +771 765 -0.07212434981596463 +107 766 -0.07206820962521845 +108 766 0.1760207225743431 +109 766 -0.07209147919116225 +760 766 -0.07209275191103208 +761 766 0.1760190351512664 +765 766 0.176544873843488 +766 766 4.710511405687054 +770 766 -0.07211184593845994 +771 766 0.1764188296442462 +113 767 -0.07209690309150929 +114 767 0.1761310532228157 +115 767 -0.07209690524818627 +762 767 0.1762797436165493 +763 767 -0.07211777047764052 +767 767 4.712272060948871 +768 767 0.1766517144304035 +772 767 0.1762796957152271 +773 767 -0.07211776831075148 +762 768 -0.07212859686713637 +763 768 0.1765026441012873 +764 768 -0.07215205569501618 +767 768 0.1763206586246739 +768 768 4.716472281204853 +769 768 0.1767752785113611 +772 768 -0.07212859495410709 +773 768 0.1765026024160732 +774 768 -0.07215205373708351 +763 769 -0.07215720838754799 +764 769 0.1766051719765175 +765 769 -0.07215720691487154 +768 769 0.1766051734001741 +769 769 4.718546629181924 +770 769 0.1766051397046431 +773 769 -0.07215720691529773 +774 769 0.1766051382884226 +775 769 -0.07215720534681436 +764 770 -0.07215205236470118 +765 770 0.1765026109940841 +766 770 -0.07212859215445347 +769 770 0.1767752814605643 +770 770 4.716471831635781 +771 770 0.1763206277991428 +774 770 -0.07215205130495232 +775 770 0.1765025854424432 +776 770 -0.07212859100471949 +108 771 -0.07209690037663151 +109 771 0.1761310221745187 +110 771 -0.07209689943895779 +765 771 -0.07211776547951175 +766 771 0.1762796991141087 +770 771 0.1766516837025487 +771 771 4.712271535053913 +775 771 -0.07211776457781233 +776 771 0.1762796783926283 +112 772 -0.07206820933980464 +113 772 0.1760207245042495 +114 772 -0.07209148032349569 +767 772 0.1764188635351693 +768 772 -0.07211184740227788 +772 772 4.710511472569563 +773 772 0.1765448795099437 +777 772 0.1760190338378449 +778 772 -0.07209275194749336 +767 773 -0.0721243512547471 +768 773 0.1766585617160403 +769 773 -0.07214564605224932 +772 773 0.1762318574715357 +773 773 4.714551669985848 +774 773 0.1766585313389131 +777 773 -0.07210216116799587 +778 773 0.1762318484512762 +779 773 -0.07212434945475085 +768 774 -0.07215205229334579 +769 774 0.1767752824542999 +770 774 -0.0721520512331309 +773 774 0.1765026110090565 +774 774 4.716471804489075 +775 774 0.1765025854667792 +778 774 -0.0721285917456745 +779 774 0.1763206234125189 +780 774 -0.07212859059018199 +769 775 -0.07214564347793387 +770 775 0.1766585357896964 +771 775 -0.07212434790771172 +774 775 0.1766585335134404 +775 775 4.714551338553253 +776 775 0.1762318375240794 +779 775 -0.07212434754784666 +780 775 0.176231834335114 +781 775 -0.07210215836872441 +109 776 -0.07209147758016715 +110 776 0.1760207098639215 +111 776 -0.07206820732234809 +770 776 -0.0721118439629173 +771 776 0.1764188314634378 +775 776 0.1765448557288365 +776 776 4.710511137626817 +780 776 -0.07209274927127478 +781 776 0.1760190197532273 +4 777 -0.07202238113731757 +112 777 0.175770487286318 +113 777 -0.07205556544410729 +117 777 0.17577049048666 +118 777 -0.07205556538172946 +461 777 -0.1316560567557951 +772 777 0.1763201631555521 +773 777 -0.07208134510707999 +777 777 4.706505201370978 +778 777 0.1763201606648059 +117 778 -0.07206820904116135 +118 778 0.1760207197205715 +119 778 -0.07209147864973865 +772 778 -0.07209275179626397 +773 778 0.1765448746029734 +774 778 -0.07211184548614674 +777 778 0.1760190355906192 +778 778 4.710511359307209 +779 778 0.1764188260283076 +118 779 -0.07209689988339689 +119 779 0.1761310199356084 +120 779 -0.07209689892209635 +773 779 -0.07211776493039396 +774 779 0.1766516829021115 +775 779 -0.0721177640303145 +778 779 0.1762796966513393 +779 779 4.712271472115209 +780 779 0.1762796759697258 +119 780 -0.07209147701310099 +120 780 0.1760207067880595 +121 780 -0.07206820668074808 +774 780 -0.07211184351186335 +775 780 0.1765448564692777 +776 780 -0.07209274916271075 +779 780 0.1764188278598566 +780 780 4.71051109111812 +781 780 0.1760190200317145 +3 781 -0.07202237944903575 +110 781 -0.07205556371008311 +111 781 0.1757704791039184 +120 781 -0.07205556297563502 +121 781 0.1757704755350078 +519 781 -0.1316560499652392 +775 781 -0.07208134262630808 +776 781 0.1763201443397344 +780 781 0.1763201414363449 +781 781 4.706504943204489 +4 782 -0.3306987248384448 +45 782 0.311987585611313 +46 782 0.02485147836276488 +117 782 0.04798347957804669 +118 782 0.005749862305589146 +461 782 -0.1905406954130525 +782 782 5.131639319724352 +783 782 0.3818265199376143 +787 782 0.05024109882547451 +788 782 -0.08451850779016389 +117 783 -0.1952837642175648 +118 783 0.1776467075663247 +119 783 -0.04672515272513146 +782 783 0.3739324165104153 +783 783 5.484491157184245 +784 783 0.4159965149282607 +787 783 0.005523834007351805 +788 783 0.1797745556965383 +789 783 -0.04200949539787523 +118 784 -0.1095947451641356 +119 784 0.2195975477961865 +120 784 -0.1095947435802984 +783 784 0.4121902625734482 +784 784 5.615590619280564 +785 784 0.4121902396019239 +788 784 -0.01418712806036998 +789 784 0.2222341711558609 +790 784 -0.01418712872677438 +119 785 -0.0467251516297105 +120 785 0.177646693513181 +121 785 -0.1952837560459731 +784 785 0.4159965116181433 +785 785 5.484490923345692 +786 785 0.3739323917947791 +789 785 -0.04200949508443663 +790 785 0.1797745473039912 +791 785 0.00552383283521786 +3 786 -0.3306987143730503 +120 786 0.005749860729044404 +121 786 0.047983471651977 +122 786 0.3119875766216105 +123 786 0.02485147769756801 +519 786 -0.1905406847890274 +785 786 0.3818264975625835 +786 786 5.131639067919401 +790 786 -0.08451850563613328 +791 786 0.05024109325063331 +45 787 -0.2289469781618603 +46 787 0.5228160188689335 +47 787 -0.002571992997549594 +782 787 0.04804766302883029 +783 787 -0.01040937787352002 +787 787 5.869787531419099 +788 787 0.6034075414823344 +792 787 0.04934801743339429 +793 787 -0.05157897989226426 +782 788 -0.1391469197690674 +783 788 0.1678452098046404 +784 788 -0.04101021683942063 +787 788 0.5894502098018538 +788 788 6.271782081138477 +789 788 0.635966029038519 +792 788 -0.005697499219482122 +793 788 0.1783222986474668 +794 788 -0.02396909353038085 +783 789 -0.08125437117809137 +784 789 0.2075932328107828 +785 789 -0.0812543709516222 +788 789 0.6304980125267214 +789 789 6.416683764210532 +790 789 0.6304979909021402 +793 789 -0.01052204042936403 +794 789 0.2213488592353223 +795 789 -0.01052204094193002 +784 790 -0.04101021625123601 +785 790 0.1678451962543699 +786 790 -0.1391469157629103 +789 790 0.6359660233812339 +790 790 6.271781892437971 +791 790 0.589450183472092 +794 790 -0.02396909359542843 +795 790 0.1783222932330518 +796 790 -0.005697499745018292 +122 791 -0.2289469735556596 +123 791 0.5228160117097982 +124 791 -0.002571992963052591 +785 791 -0.01040937893997268 +786 791 0.04804765272728342 +790 791 0.6034075184803988 +791 791 5.86978732590751 +795 791 -0.05157897926990804 +796 791 0.04934801395525029 +46 792 -0.168918803610133 +47 792 0.7214510525754116 +48 792 -0.02374293650487222 +787 792 0.04153996500452306 +788 792 -0.02172840667567444 +792 792 6.686863001899791 +793 792 0.805962721754011 +797 792 0.04059026847884911 +798 792 -0.02781584257242106 +787 793 -0.1019725037758861 +788 793 0.1630686524358343 +789 793 -0.03642308067780173 +792 793 0.7885883864677393 +793 793 7.102670368251132 +794 793 0.8371946147556456 +797 793 -0.01411639068727191 +798 793 0.1773829222162656 +799 793 -0.01004092072268259 +788 794 -0.06104029370996156 +789 794 0.2038998845379685 +790 794 -0.061040294098618 +793 794 0.830738084112187 +794 794 7.251979983913985 +795 794 0.8307380668717423 +798 794 -0.00723922368127497 +799 794 0.2234063873110657 +800 794 -0.007239224004772005 +789 795 -0.0364230804294243 +790 795 0.1630686423225777 +791 795 -0.1019725024532339 +794 795 0.837194608658592 +795 795 7.102670234482657 +796 795 0.7885883651107231 +799 795 -0.0100409209340151 +800 795 0.1773829194150566 +801 795 -0.01411639087078487 +123 796 -0.1689188023898884 +124 796 0.7214510491132231 +125 796 -0.02374293656837906 +790 796 -0.02172840736828617 +791 796 0.04153995658434306 +795 796 0.8059627034367532 +796 796 6.686862857234371 +800 796 -0.02781584246753507 +801 796 0.04059026625426543 +47 797 -0.1303184214273285 +48 797 0.9123274376467005 +49 797 -0.04088686083534776 +792 797 0.03077847098147907 +793 797 -0.03014115310103291 +797 797 7.549498913859455 +798 797 0.9969980910763864 +802 797 0.03048352943138433 +803 797 -0.009631033542200768 +792 798 -0.075565870270317 +793 798 0.1610951113757548 +794 798 -0.03242686557438942 +797 798 0.9775066330012518 +798 798 7.960633796307348 +799 798 1.026715279232184 +802 798 -0.0203918627328733 +803 798 0.1809161187689356 +804 798 0.00159554623795205 +793 799 -0.04559978864726327 +794 799 0.2051340139750971 +795 799 -0.04559978921459781 +798 799 1.019613722141605 +799 799 8.109152647103594 +800 799 1.019613709803659 +803 799 -0.003799115311520995 +804 799 0.2317201581975596 +805 799 -0.00379911556360471 +794 800 -0.03242686551530211 +795 800 0.1610951044799114 +796 800 -0.07556587008602261 +799 800 1.026715273491532 +800 800 7.960633711128526 +801 800 0.9775066177361693 +804 800 0.001595545980817126 +805 800 0.180916117257527 +806 800 -0.02039186266983223 +124 801 -0.1303184203881588 +125 801 0.9123274348289989 +126 801 -0.04088685905695891 +795 801 -0.03014115357897873 +796 801 0.03077846574101917 +800 801 0.9969980789575078 +801 801 7.549498814730663 +805 801 -0.009631033552475382 +806 801 0.03048353126768383 +11 802 -0.0550719098418197 +28 802 0.006545534967581146 +29 802 0.0307528412978435 +48 802 -0.1049386985973338 +49 802 1.109970286202095 +373 802 -0.2491478723580842 +797 802 0.01468653313185447 +798 802 -0.03712473394701729 +802 802 8.52916240537475 +803 802 1.192434425599129 +27 803 0.01345595440906017 +28 803 0.2014576269420408 +29 803 -0.02418664228524892 +797 803 -0.05644381763512987 +798 803 0.1587561079347323 +799 803 -0.02921882254268013 +802 803 1.171733841357575 +803 803 8.924981876159375 +804 803 1.22034600325807 +26 804 0.001280664880029175 +27 804 0.2590949520659768 +28 804 0.001280664254143249 +798 804 -0.03368118713814544 +799 804 0.207573917082407 +800 804 -0.03368118757018057 +803 804 1.212877033856192 +804 804 9.069380698446462 +805 804 1.212877025809588 +25 805 -0.02418664100642054 +26 805 0.2014576334140321 +27 805 0.01345595433821792 +799 805 -0.02921882254172667 +800 805 0.158756104183312 +801 805 -0.05644381766054871 +804 805 1.220345998057303 +805 805 8.924981830087603 +806 805 1.171733832237188 +9 806 -0.05507189669943974 +25 806 0.03075287094575074 +26 806 0.006545536115286688 +125 806 -0.1049386991132877 +126 806 1.109970340373508 +297 806 -0.2491479207847793 +800 806 -0.0371247341403623 +801 806 0.01468652945538307 +805 806 1.192434419587332 +806 806 8.529162413505308 +3 807 -0.3306932909204195 +110 807 0.005744229704510856 +111 807 0.04798879543298373 +122 807 0.3120062548701 +123 807 0.02484892730640537 +519 807 -0.1905394721616908 +807 807 5.131686411648714 +808 807 0.3818385398486379 +812 807 0.05024404984727543 +813 807 -0.08451141452590459 +109 808 -0.04672740684443601 +110 808 0.1776515641091382 +111 808 -0.1952751915182724 +807 808 0.3739440325318922 +808 808 5.484474739799832 +809 808 0.4159739346325332 +812 808 0.0055203484755212 +813 808 0.1797781350628405 +814 808 -0.04201076396216351 +108 809 -0.1095912159322892 +109 809 0.2195997047494658 +110 809 -0.1095898167227288 +808 809 0.4121682979037478 +809 809 5.615519564087579 +810 809 0.4121711078460828 +813 809 -0.01419201981248386 +814 809 0.2222352548210373 +815 809 -0.01419090998898899 +107 810 -0.1952765391190574 +108 810 0.1776504754517266 +109 810 -0.04672651334435658 +809 810 0.4159768449363326 +810 810 5.484470569630388 +811 810 0.3739389245567156 +814 810 -0.04201105510292989 +815 810 0.1797777282626591 +816 810 0.005520847492358247 +2 811 -0.3306936855871376 +107 811 0.0479883720445502 +108 811 0.005745357173078988 +127 811 0.31200508534298 +128 811 0.02484909073786139 +548 811 -0.1905395682224045 +810 811 0.3818332035616169 +811 811 5.131677117399905 +815 811 -0.08451336016972816 +816 811 0.05024434708628261 +122 812 -0.228941495882407 +123 812 0.5228461688212166 +124 812 -0.002574215758311002 +807 812 0.04804976245169532 +808 812 -0.01041400753329584 +812 812 5.869879048527997 +813 812 0.6034240260322924 +817 812 0.04934801102737058 +818 812 -0.05157324174958111 +807 813 -0.139139889255068 +808 813 0.1678492913673289 +809 813 -0.04101268100655177 +812 813 0.5894665320912543 +813 813 6.271734999960952 +814 813 0.635924497300336 +817 813 -0.005700261456441036 +818 813 0.1783243209594731 +819 813 -0.02397126518205489 +808 814 -0.08125184283583213 +809 814 0.2075960911182699 +810 814 -0.08125272429000635 +813 814 0.6304573459402731 +814 814 6.416531580629683 +815 814 0.630462752986917 +818 814 -0.01052700325504982 +819 814 0.2213490001453447 +820 814 -0.01052610471464346 +809 815 -0.04101187887449258 +810 815 0.167848935818169 +811 815 -0.1391412346619045 +814 815 0.6359300812639361 +815 815 6.271728386274487 +816 815 0.5894580500487983 +819 815 -0.0239713101681962 +820 815 0.1783236333456223 +821 815 -0.005699911975025895 +127 816 -0.2289418529400775 +128 816 0.5228442674423639 +129 816 -0.002574055947972539 +810 816 -0.01041299387978598 +811 816 0.04805023993641161 +815 816 0.6034152713715626 +816 816 5.869859227984707 +820 816 -0.05157505277161561 +821 816 0.04934817614664055 +123 817 -0.1689147011009628 +124 817 0.7214916686358677 +125 817 -0.02374479857692066 +812 817 0.0415391390935661 +813 817 -0.02173223642631622 +817 817 6.686999613418591 +818 817 0.8059831863032287 +822 817 0.04058895775040366 +823 817 -0.0278110818031431 +812 818 -0.1019669565117241 +813 818 0.1630714025640608 +814 818 -0.03642567966227706 +817 818 0.7886088888487434 +818 818 7.102590451605504 +819 818 0.8371363034886767 +822 818 -0.01411842187609721 +823 818 0.1773839813112102 +824 818 -0.01004353307402553 +813 819 -0.06103900866833328 +814 819 0.2039021096254844 +815 819 -0.06103961931789365 +818 819 0.8306807323154817 +819 819 7.25174280802236 +820 819 0.8306883151571316 +823 819 -0.007244329588293463 +824 819 0.2234055601362004 +825 819 -0.007243394730121561 +814 820 -0.03642497761619895 +815 820 0.1630707797493626 +816 820 -0.1019682430175869 +819 820 0.8371440858674701 +820 820 7.102581656068429 +821 820 0.7885976331970901 +824 820 -0.01004344312497404 +825 820 0.1773839959455176 +826 820 -0.01411829519187618 +128 821 -0.1689149837947605 +129 821 0.721488961228812 +130 821 -0.02374472756280177 +815 821 -0.02173147030497723 +816 821 0.04153951739171097 +820 821 0.8059716671488745 +821 821 6.686969062154948 +825 821 -0.02781256153310244 +826 821 0.04058956484336462 +124 822 -0.1303157994609663 +125 822 0.9123779514846282 +126 822 -0.04088833290119984 +817 822 0.03077637956814905 +818 822 -0.03014435270938282 +822 822 7.549679038271284 +823 822 0.9970227493142176 +827 822 0.03047897379573911 +828 822 -0.009626809235125239 +817 823 -0.07556134418430174 +818 823 0.161096976530083 +819 823 -0.03242963502124449 +822 823 0.9775312209657074 +823 823 7.960521721531176 +824 823 1.026641063436599 +827 823 -0.02039368999709185 +828 823 0.1809169225826157 +829 823 0.001592615436008082 +818 824 -0.04559905267541309 +819 824 0.2051353609938984 +820 824 -0.04559945675388172 +823 824 1.019540615330781 +824 824 8.108829156530856 +825 824 1.019550385485964 +828 824 -0.003804191314387917 +829 824 0.2317184068641579 +830 824 -0.003803217127905739 +819 825 -0.03242897666837388 +820 825 0.1610970380996903 +821 825 -0.07556224161176622 +824 825 1.02665101387839 +825 825 7.960510789203076 +826 825 0.977516957280173 +829 825 0.001592769571120589 +830 825 0.1809171142878864 +831 825 -0.02039366055153358 +129 826 -0.1303159031823392 +130 826 0.9123747856727825 +131 826 -0.0408882352244265 +820 826 -0.03014369553402108 +821 826 0.03077719239386295 +825 826 0.9970082895200032 +826 826 7.549637798719409 +830 826 -0.009628140223191611 +831 826 0.03047945998845653 +9 827 -0.05507309107168026 +43 827 0.006549550343814547 +44 827 0.03075039300774218 +125 827 -0.104937681254773 +126 827 1.110030864869338 +297 827 -0.2491581001148479 +822 827 0.01468118393972173 +823 827 -0.03712742468589311 +827 827 8.52939060002803 +828 827 1.192463924191263 +42 828 0.01345253319584702 +43 828 0.2014579142902851 +44 828 -0.02418785654439856 +822 828 -0.0564403901084706 +823 828 0.1587578120569736 +824 828 -0.02922164796539595 +827 828 1.171763390492825 +828 828 8.924836714140774 +829 828 1.220255421658603 +41 829 0.001276296324652426 +42 829 0.2590912300192098 +43 829 0.001275323508606374 +823 829 -0.03368063746992542 +824 829 0.207574572739577 +825 829 -0.03368099107454783 +828 829 1.212787707704515 +829 829 9.068966017104373 +830 829 1.21279978076699 +40 830 -0.02418803092363239 +41 830 0.2014581419592695 +42 830 0.01345277991645591 +824 830 -0.02922098200194628 +825 830 0.1587580340282682 +826 830 -0.05644121773179828 +829 830 1.220267691532723 +830 830 8.924823475945473 +831 830 1.171746133138949 +8 831 -0.05507301727030448 +40 831 0.03075086496491219 +41 831 0.006548399123881998 +130 831 -0.1049377624315839 +131 831 1.110026905407274 +163 831 -0.2491573846702244 +825 831 -0.03712685081546696 +826 831 0.01468190874822006 +830 831 1.192446511189399 +831 831 8.529337677780489 +2 832 -0.3306987207435538 +105 832 0.005749862178517112 +106 832 0.04798347994221705 +127 832 0.3119875855544445 +128 832 0.02485147792163529 +548 832 -0.1905406922645517 +832 832 5.131639112277671 +833 832 0.381826510686549 +837 832 0.05024109304862112 +838 832 -0.08451850538236616 +104 833 -0.04672515210216509 +105 833 0.1776467102488608 +106 833 -0.1952837592143807 +832 833 0.3739323947627069 +833 833 5.484491130680388 +834 833 0.4159965684720287 +837 833 0.005523832716140084 +838 833 0.1797745596136357 +839 833 -0.04200949334690834 +103 834 -0.1095947554825203 +104 834 0.219597584778921 +105 834 -0.1095947482990817 +833 834 0.4121902598767491 +834 834 5.615591275269651 +835 834 0.4121903598991491 +838 834 -0.01418712848301333 +839 834 0.2222342187677515 +840 834 -0.01418712278475463 +102 835 -0.195283792284652 +103 835 0.1776467552450982 +104 835 -0.0467251554335512 +834 835 0.4159965784729253 +835 835 5.484492210913404 +836 835 0.3739325157886454 +839 835 -0.04200949675521927 +840 835 0.1797746269954893 +841 835 0.005523842259601786 +1 836 -0.330698784667553 +102 836 0.04798350931093309 +103 836 0.005749867046102961 +132 836 0.3119876835566691 +133 836 0.024851490643195 +490 836 -0.1905407554257031 +835 836 0.3818266163975108 +836 836 5.131640454407531 +840 836 -0.08451851623298383 +841 836 0.05024115134216917 +127 837 -0.2289469742566915 +128 837 0.5228160151508029 +129 837 -0.002571993006740617 +832 837 0.04804765694502972 +833 837 -0.01040937795365654 +837 837 5.86978730179024 +838 837 0.6034075306337939 +842 837 0.04934801373864633 +843 837 -0.05157897837858122 +832 838 -0.139146915833857 +833 838 0.1678452094475006 +834 838 -0.04101021553940211 +837 838 0.5894501803570266 +838 838 6.271782094180873 +839 838 0.6359661051845735 +842 838 -0.005697499859285304 +843 838 0.1783223092582167 +844 838 -0.02396908946205145 +833 839 -0.08125437349339551 +834 839 0.2075932737334645 +835 839 -0.08125437734406538 +838 839 0.6304980204848641 +839 839 6.416684581785733 +840 839 0.6304981636280735 +843 839 -0.010522039970744 +844 839 0.221348921124146 +845 839 -0.01052203219333425 +834 840 -0.04101021832901974 +835 840 0.1678452678445616 +836 840 -0.1391469397025675 +839 840 0.6359661316990054 +840 840 6.27178345271003 +841 840 0.5894503742064637 +844 840 -0.02396909127233385 +845 840 0.1783223935913375 +846 840 -0.005697489967082137 +132 841 -0.2289470221607122 +133 841 0.5228161872465895 +134 841 -0.002571983589187241 +835 841 -0.0104093743088004 +836 841 0.04804770379968437 +840 841 0.6034077011915011 +841 841 5.869789021745353 +845 841 -0.05157898123632154 +846 841 0.04934809308759525 +128 842 -0.1689188012682289 +129 842 0.7214510488646575 +130 842 -0.02374293637874522 +837 842 0.04153995795373666 +838 842 -0.02172840660370348 +842 842 6.686862885651761 +843 842 0.8059627397067394 +847 842 0.04059028536560899 +848 842 -0.02781583882817265 +837 843 -0.1019725021003334 +838 843 0.1630686541536064 +839 843 -0.0364230791420676 +842 843 0.7885883709330848 +843 843 7.102670688596414 +844 843 0.8371947627743652 +847 843 -0.0141163897020859 +848 843 0.1773829949387949 +849 843 -0.01004090786709619 +838 844 -0.06104029583116918 +839 844 0.2038999305378608 +840 844 -0.06104029709333683 +843 844 0.8307381390837285 +844 844 7.25198139861387 +845 844 0.8307383602465608 +848 844 -0.007239218447511686 +849 844 0.2234065633913914 +850 844 -0.007239202857063087 +839 845 -0.03642308149210555 +840 845 0.163068720059074 +841 845 -0.1019725189172371 +844 845 0.8371948135319671 +845 845 7.102672669917931 +846 845 0.788588703874622 +849 845 -0.01004090869483829 +850 845 0.1773831649108795 +851 845 -0.01411637171729474 +133 846 -0.1689188392853991 +134 846 0.7214513765525199 +135 846 -0.02374292487504212 +840 846 -0.0217284045313437 +841 846 0.04154001103670701 +845 846 0.8059630233819507 +846 846 6.686865570127465 +850 846 -0.02781583298250059 +851 846 0.04059046889407925 +129 847 -0.1303184218296728 +130 847 0.9123274352383697 +131 847 -0.04088686202094363 +842 847 0.03077845062925028 +843 847 -0.03014115852304317 +847 847 7.54949898174339 +848 847 0.9969981505294225 +852 847 0.03048345319288287 +853 847 -0.00963105438001452 +842 848 -0.07556587583722515 +843 848 0.1610950933206462 +844 848 -0.03242687361909483 +847 848 0.9775066411853004 +848 848 7.960634537223148 +849 848 1.026715509995766 +852 848 -0.02039187416062854 +853 848 0.1809159265133636 +854 848 0.001595509319566452 +843 849 -0.04559979975904807 +844 849 0.2051340339281841 +845 849 -0.04559980547031167 +848 849 1.019613834638872 +849 849 8.10915477648955 +850 849 1.019614127571437 +853 849 -0.003799142624034718 +854 849 0.2317198457283828 +855 849 -0.003799166222442862 +844 850 -0.03242687852913534 +845 850 0.1610951396856393 +846 850 -0.07556590639259742 +849 850 1.02671558044405 +850 850 7.960637104703945 +851 850 0.9775070967586734 +854 850 0.001595503047971486 +855 850 0.1809157032554144 +856 850 -0.0203919228641794 +134 851 -0.1303184886686828 +135 851 0.9123278928680911 +136 851 -0.0408869187668762 +845 851 -0.03014116868484668 +846 851 0.03077844078241132 +850 851 0.9969985319818957 +851 851 7.549502544440781 +855 851 -0.009631088528770565 +856 851 0.03048306126187628 +8 852 -0.0550719162039634 +33 852 0.006545218162697014 +34 852 0.03075185444664241 +130 852 -0.1049386969489124 +131 852 1.109970204503063 +163 852 -0.2491477812319785 +847 852 0.01468657091475495 +848 852 -0.03712472020237426 +852 852 8.529159493706295 +853 852 1.192433581101188 +885 852 -0.2639304258718558 +886 852 -1.494362823848374 +32 853 0.01345532472052735 +33 853 0.2014546854167413 +34 853 -0.02418676516803644 +847 853 -0.05644381020594175 +848 853 0.1587562274266557 +849 853 -0.02921879271245642 +852 853 1.171733326564062 +853 853 8.924974721175534 +854 853 1.220344460544063 +884 853 -0.2723149000226667 +885 853 -1.551727228174179 +886 853 -0.2659140969691449 +31 854 0.001279795200674616 +32 854 0.2590894417776671 +33 854 0.001280279389560712 +848 854 -0.03368116869085169 +849 854 0.2075741760599934 +850 854 -0.03368114190058513 +853 854 1.212875889460322 +854 854 9.069368451847343 +855 854 1.212874759392903 +883 854 -0.2735753260349313 +884 854 -1.572958636080507 +885 854 -0.2735765650297836 +30 855 -0.02418754434078318 +31 855 0.2014500137913304 +32 855 0.0134552157694407 +849 855 -0.02921878700958058 +850 855 0.1587564889327515 +851 855 -0.05644376611159138 +854 855 1.220344144488697 +855 855 8.924964580356653 +856 855 1.171730938336491 +882 855 -0.2659114764851792 +883 855 -1.551718082132025 +884 855 -0.272314461697847 +6 856 -0.05507258875718993 +30 856 0.03074482425795577 +31 856 0.006544531095682621 +135 856 -0.1049386528594852 +136 856 1.109967181962259 +192 856 -0.2491445666534081 +850 856 -0.03712468427613347 +851 856 0.0146869583332041 +855 856 1.192431891252696 +856 856 8.529141304233463 +882 856 -1.494346910816075 +883 856 -0.2639284561823488 +1 857 -0.3306933612120182 +115 857 0.005744236019273097 +116 857 0.04798883309137089 +132 857 0.3120063618096881 +133 857 0.02484894025120941 +490 857 -0.1905395427961768 +857 857 5.131687798014286 +858 857 0.3818386586571733 +862 857 0.05024410792982698 +863 857 -0.08451142511964226 +114 858 -0.04672741059964788 +115 858 0.1776516258447362 +116 858 -0.195275227750619 +857 858 0.3739441565160248 +858 858 5.484476026638762 +859 858 0.4159740012007478 +862 858 0.005520357897707343 +863 858 0.1797782147377373 +864 858 -0.04201076570562107 +113 859 -0.1095912190365445 +114 859 0.2195997417309152 +115 859 -0.1095898286546105 +858 859 0.4121684178944043 +859 859 5.615520220026774 +860 859 0.4121711054528646 +863 859 -0.01419201387784085 +864 859 0.222235302429599 +865 859 -0.01419091040522732 +112 860 -0.1952765341260815 +113 860 0.177650478133753 +114 860 -0.04672651277064882 +859 860 0.4159768987510148 +860 860 5.484470543916023 +861 860 0.3739389028502573 +864 860 -0.04201105298036281 +865 860 0.1797777322008602 +866 860 0.005520846205312013 +4 861 -0.3306936815126649 +45 861 0.3120050853217221 +46 861 0.02484909030229479 +112 861 0.04798837241496554 +113 861 0.005745357047278021 +461 861 -0.1905395650938397 +860 861 0.3818331943452034 +861 861 5.131676910417532 +865 861 -0.08451335776594193 +866 861 0.05024434133507372 +132 862 -0.2289415444841486 +133 862 0.5228463443631383 +134 862 -0.002574206385057981 +857 862 0.04804981352142756 +858 862 -0.01041400290412846 +862 862 5.86988074413695 +863 862 0.6034242086918445 +867 862 0.04934809014055019 +868 862 -0.05157324371486824 +857 863 -0.1391399131885779 +858 863 0.1678493629608156 +859 863 -0.04101268305281652 +862 863 0.5894667227970032 +863 863 6.271736558825623 +864 863 0.6359246051089326 +867 863 -0.005700251681565599 +868 863 0.1783244212829053 +869 863 -0.02397126293119067 +858 864 -0.08125184926676338 +859 864 0.2075961320378314 +860 864 -0.08125272656637626 +863 864 0.6304575181208953 +864 864 6.416532398134724 +865 864 0.6304627614815741 +868 864 -0.01052699452565681 +869 864 0.221349062028069 +870 864 -0.01052610423866418 +859 865 -0.04101187760713852 +860 865 0.1678489354613856 +861 865 -0.1391412307360032 +864 865 0.6359301578954227 +865 865 6.271728400792391 +866 865 0.5894580206827666 +869 865 -0.02397130602942357 +870 865 0.1783236439903186 +871 865 -0.005699912610250851 +45 866 -0.2289418490539008 +46 866 0.5228442637972638 +47 866 -0.00257405595281722 +860 866 -0.01041299395897421 +861 866 0.0480502338666674 +865 866 0.6034152605909371 +866 866 5.869858999062046 +870 866 -0.05157505125898784 +871 866 0.04934817248793444 +133 867 -0.1689147379925271 +134 867 0.721491996073246 +135 867 -0.0237447868833128 +862 867 0.04153919354303715 +863 867 -0.02173223359051121 +867 867 6.687002325555426 +868 867 0.8059835061131259 +872 867 0.04058916029797832 +873 867 -0.0278110723215006 +862 868 -0.1019669729688629 +863 868 0.1630714802977053 +864 868 -0.03642568070478747 +867 868 0.788609227502801 +868 868 7.102592884508866 +869 868 0.8371365076262621 +872 868 -0.01411840273317808 +873 868 0.1773842266681763 +874 868 -0.01004352090777125 +863 869 -0.06103901170240436 +864 869 0.2039021556225843 +865 869 -0.06103962139902191 +868 869 0.8306810248739462 +869 869 7.251744222494958 +870 869 0.830688370888934 +873 869 -0.007244308478528139 +874 869 0.2234057361755151 +875 869 -0.007243389468544359 +864 870 -0.03642497610162682 +865 870 0.1630707814767092 +866 870 -0.1019682413495137 +869 870 0.8371442345555906 +870 870 7.102581978724968 +871 870 0.7885976178140788 +874 870 -0.01004343020456705 +875 870 0.1773840687431293 +876 870 -0.01411829419769214 +46 871 -0.1689149814696801 +47 871 0.7214889576700191 +48 871 -0.02374472743104677 +865 871 -0.02173147023239394 +866 871 0.04153951036206743 +870 871 0.8059716852278784 +871 871 6.686968947134078 +875 871 -0.02781255778598651 +876 871 0.04058958182135491 +134 872 -0.1303158677297152 +135 872 0.9123784095394083 +136 872 -0.04088839260777555 +867 872 0.03077635465217343 +868 872 -0.03014436780508706 +872 872 7.549682767202598 +873 872 0.9970232021450145 +877 872 0.03047850422068954 +878 872 -0.009626864169893612 +867 873 -0.0755613804661032 +868 873 0.1610970117553399 +869 873 -0.03242964801782902 +872 873 0.9775316998716009 +873 873 7.960525111495618 +874 873 1.026641369413487 +877 873 -0.02039375013042496 +878 873 0.1809165089114558 +879 873 0.001592572451089569 +868 874 -0.0455990689590928 +869 874 0.2051353809550543 +870 874 -0.04559946782806212 +873 874 1.01954103201333 +874 874 8.108831285335448 +875 874 1.019550498935483 +878 874 -0.00380424196236312 +879 874 0.2317180944558053 +880 874 -0.003803244421070356 +869 875 -0.03242898472430136 +870 875 0.1610970200546565 +871 875 -0.07556224719401061 +874 875 1.026651245454819 +875 875 7.960511533113094 +876 875 0.9775169656594441 +879 875 0.001592732721820783 +880 875 0.1809169219140017 +881 875 -0.02039367201050254 +47 876 -0.1303159036181367 +48 876 0.9123747834687916 +49 876 -0.04088823644169243 +870 876 -0.03014370096121863 +871 876 0.03077717202897345 +875 876 0.9970083491344001 +876 876 7.549637868151252 +880 876 -0.009628161080413367 +881 876 0.03047938349304574 +6 877 -0.05507378311961469 +38 877 0.006548545998632666 +39 877 0.03074235400806791 +135 877 -0.1049376350166581 +136 877 1.110027707176016 +192 877 -0.2491547468930872 +872 877 0.01468161249583955 +873 877 -0.03712737486548662 +877 877 8.529369513323706 +878 877 1.192461397941188 +37 878 0.01345179478486011 +38 878 0.2014502997197599 +39 878 -0.0241887588453569 +872 878 -0.05644033861663045 +873 878 0.1587581965616774 +874 878 -0.0292216124410499 +877 878 1.171760500101585 +878 878 8.924819474607812 +879 878 1.220253567620453 +36 879 0.001275911394145596 +37 879 0.2590857207778139 +38 879 0.001274454348656834 +873 879 -0.03368059186703048 +874 879 0.2075748316659542 +875 879 -0.03368097257826469 +878 879 1.212785441688694 +879 879 9.068953772618688 +880 879 1.212798637052598 +35 880 -0.02418815437269692 +36 880 0.2014551985622917 +37 880 0.01345215036227498 +874 880 -0.02922095217619419 +875 880 0.1587581536404268 +876 880 -0.05644121027303578 +879 880 1.220266149904904 +880 880 8.924816318752306 +881 880 1.171745616572137 +11 881 -0.05507302393498961 +35 881 0.03074987335675738 +36 881 0.00654808200660606 +48 881 -0.1049377607529819 +49 881 1.110026822123298 +373 881 -0.2491572919140163 +875 881 -0.037126837049374 +876 881 0.01468194675747531 +880 881 1.192445665785065 +881 881 8.529334753137537 +6 882 -0.968065978563393 +30 882 -5.650646303333217 +31 882 -1.059656580186782 +101 882 -0.3016459035420894 +136 882 -0.2403526748574233 +192 882 2.726807077608114 +193 882 -0.8962641542581142 +597 882 -1.75659725535494 +605 882 -0.2997005131745282 +855 882 -0.2602174732400773 +856 882 -1.385315412275531 +882 882 19.70592872800064 +883 882 2.787736732572396 +887 882 -5.112552626656445 +888 882 -0.9896175526161022 +1172 882 -0.1981146730242116 +1173 882 -0.3114645287747521 +30 883 -1.038409949109508 +31 883 -5.925592073270511 +32 883 -1.086643416218344 +597 883 -0.3003878955257886 +605 883 -1.749489624368465 +613 883 -0.2990242229757577 +854 883 -0.2650280272300607 +855 883 -1.443747245076889 +856 883 -0.2514323689408656 +882 883 2.771393274455671 +883 883 20.03814484655518 +884 883 2.809387929460325 +887 883 -0.9677568215803244 +888 883 -5.389276114994593 +889 883 -1.017302696838534 +31 884 -1.079460782241663 +32 884 -6.022142642590459 +33 884 -1.079554352217599 +605 884 -0.2992821199586577 +613 884 -1.746920233719498 +621 884 -0.2992697496271372 +853 884 -0.2613354631936647 +854 884 -1.465222612228803 +855 884 -0.2613350502280215 +883 884 2.803399773456486 +884 884 20.16248106593079 +885 884 2.803468898439266 +888 884 -1.009936055505113 +889 884 -5.48640499579204 +890 884 -1.010031653846058 +32 885 -1.086690593820617 +33 885 -5.926353196788956 +34 885 -1.038621812535899 +613 885 -0.2990691756673061 +621 885 -1.749654359153841 +629 885 -0.3004133590014457 +852 885 -0.2514332478251412 +853 885 -1.443750283152193 +854 885 -0.2650281733412008 +884 885 2.809419029207991 +885 885 20.03905382465889 +886 885 2.771549519771831 +889 885 -1.017350795037149 +890 885 -5.390039770697237 +891 885 -0.9679729382113413 +8 886 -0.9683403554768468 +33 886 -1.05983262044458 +34 886 -5.651980007610539 +93 886 -0.3017031497100488 +131 886 -0.2403538138646661 +163 886 2.72701135052918 +164 886 -0.8965433474691424 +621 886 -0.2997667168947932 +629 886 -1.756892830205282 +852 886 -1.385320813870513 +853 886 -0.2602181534257851 +885 886 2.787861764391149 +886 886 19.70753934880592 +890 886 -0.9897971410198448 +891 886 -5.113888885184442 +1404 886 -0.1977198562843989 +1405 886 -0.3115132951001691 +192 887 -0.9008337989037829 +193 887 2.731825175888399 +194 887 -0.7936714600537156 +882 887 -5.162164499954057 +883 887 -0.9937405446460754 +887 887 20.33721289861158 +888 887 2.771130480575342 +892 887 -4.393035051215428 +893 887 -0.8870250781220617 +1172 887 -0.3077636571164193 +1173 887 -0.3529614317528648 +1174 887 -0.3070647546460045 +882 888 -0.9718831216983979 +883 888 -5.439421529147726 +884 888 -1.021276628553007 +887 888 2.757898750239647 +888 888 20.64241731513999 +889 888 2.786835001345753 +892 888 -0.8649769459898898 +893 888 -4.666312288660516 +894 888 -0.914706072992521 +883 889 -1.013913267595204 +884 889 -5.536799134545715 +885 889 -1.014008392455791 +888 889 2.781956425761663 +889 889 20.75857872284001 +890 889 2.781999382860933 +893 889 -0.9073342277985871 +894 889 -4.76191106902448 +895 889 -0.907424705853711 +884 890 -1.021324313179692 +885 890 -5.440183361636554 +886 890 -0.9720981327408 +889 890 2.786850645602744 +890 890 20.64316578395661 +891 890 2.757995930732343 +894 890 -0.9147521609921985 +895 890 -4.66702684326968 +896 890 -0.8651823661761515 +163 891 -0.9011116265460549 +164 891 2.731953592056781 +165 891 -0.7939369503474855 +885 891 -0.9939189818301509 +886 891 -5.16349841344146 +890 891 2.771203121514628 +891 891 20.33855601694412 +895 891 -0.8871961355538823 +896 891 -4.394286544923501 +1404 891 -0.3078134454749551 +1405 891 -0.3525396654176467 +1406 891 -0.3070946518977344 +193 892 -0.7932219659334283 +194 892 2.67897870344427 +195 892 -0.6863880135757354 +887 892 -4.388846472947158 +888 892 -0.8863940621680483 +892 892 20.49783653993709 +893 892 2.688955923009663 +897 892 -3.62781146094566 +898 892 -0.7751503092051406 +1173 892 -0.3077700206684483 +1174 892 -0.4950563974667091 +1175 892 -0.3081977823722303 +887 893 -0.8644465346513283 +888 893 -4.660945269848461 +889 893 -0.9140331724183822 +892 893 2.682525961758154 +893 893 20.73124675083774 +894 893 2.69606892467595 +897 893 -0.7545456892625982 +898 893 -3.879770695301712 +899 893 -0.8009956119989488 +888 894 -0.9066990797838632 +889 894 -4.756052067886247 +890 894 -0.9067894305486818 +893 894 2.693607579294241 +894 894 20.82145406551508 +895 894 2.693616397249097 +898 894 -0.7941752925163975 +899 894 -3.96699350745356 +900 894 -0.7942599606155625 +889 895 -0.9140792215980883 +890 895 -4.661656846161337 +891 895 -0.8646516332358289 +894 895 2.696067104106621 +895 895 20.73174241942583 +896 895 2.682546884970664 +899 895 -0.801039325500944 +900 895 -3.880429554345926 +901 895 -0.7547387540301884 +164 896 -0.7934869584970224 +165 896 2.679008825980037 +166 896 -0.6866380949163804 +890 896 -0.8865648991860431 +891 896 -4.390092501329585 +895 896 2.688964296958812 +896 896 20.49874529562396 +900 896 -0.7753115119489478 +901 896 -3.628966755015647 +1405 896 -0.3078006730128542 +1406 896 -0.4946103652894798 +1407 896 -0.3082096489502931 +194 897 -0.6896139878966419 +195 897 2.680036694040548 +196 897 -0.5865102457396407 +892 897 -3.661821159372289 +893 897 -0.7777692906142106 +897 897 21.14697320457711 +898 897 2.651728427617146 +902 897 -2.869153980051363 +903 897 -0.674193504035146 +1174 897 -0.3054743639271897 +1175 897 -0.6677888967118935 +1176 897 -0.3227462283672181 +892 898 -0.75732575249819 +893 898 -3.912277372074961 +894 898 -0.8034460387082669 +897 898 2.65477528208265 +898 898 21.28316413376437 +899 898 2.647419974335654 +902 898 -0.6540940597370963 +903 898 -3.109945880172148 +904 898 -0.6993038302714036 +893 899 -0.796685317479857 +894 899 -3.998921465019139 +895 899 -0.7967694754189523 +898 899 2.648310307008191 +899 899 21.33789577764108 +900 899 2.648281232872409 +903 899 -0.6927166125504169 +904 899 -3.192476605335179 +905 899 -0.6927994002961348 +894 900 -0.8034894585623723 +895 900 -3.912932392550752 +896 900 -0.7575176509539888 +899 900 2.647398553647375 +900 900 21.28339594009088 +901 900 2.654711614499466 +904 900 -0.6993470216808517 +905 900 -3.110577459440449 +906 900 -0.6542835739897933 +165 901 -0.6898625411831966 +166 901 2.679958424618877 +167 901 -0.5867562287522743 +895 901 -0.7779294658693874 +896 901 -3.662970067005301 +900 901 2.651665113006911 +901 901 21.14743234901063 +905 901 -0.6743520484209902 +906 901 -2.870262725696288 +1406 901 -0.3054876269996292 +1407 901 -0.66730261985487 +1408 901 -0.3227398953514486 +195 902 -0.5913154317737623 +196 902 2.76684688388915 +197 902 -0.5020589151655879 +897 902 -2.919135003641165 +898 902 -0.6781251699076336 +902 902 22.52312844969471 +903 902 2.696440704765423 +907 902 -2.181829169665311 +908 902 -0.5912503787407528 +1175 902 -0.3185551645944165 +1176 902 -0.8742725621334261 +1177 902 -0.3476361699230064 +897 903 -0.6582603161386447 +898 903 -3.15771303219706 +899 903 -0.7029932899132301 +902 903 2.709790495377483 +903 903 22.55830850617897 +904 903 2.67981225135373 +907 903 -0.571019206853852 +908 903 -2.419006029559488 +909 903 -0.6163628315617158 +898 904 -0.6964935741913468 +899 904 -3.23938601826329 +900 904 -0.6965756269044638 +903 904 2.684384027880184 +904 904 22.57603612440799 +905 904 2.684315062315004 +908 904 -0.6097903913591159 +909 904 -2.499548736408548 +910 904 -0.6098741468974092 +899 905 -0.7030360804582712 +900 905 -3.158339593779787 +901 905 -0.6584481781458987 +904 905 2.679769761314402 +905 905 22.55827887628245 +906 905 2.709637895585759 +909 905 -0.6164068864785147 +910 905 -2.419632149991593 +911 905 -0.5712115664694606 +166 906 -0.5915592721919202 +167 906 2.766654847194452 +168 906 -0.5023090756325276 +900 906 -0.678282272401032 +901 906 -2.920235491917238 +905 906 2.69630122723677 +906 906 22.52314758669517 +910 906 -0.5914115598298135 +911 906 -2.182929267523398 +1407 906 -0.3185507248635788 +1408 906 -0.8737255156884773 +1409 906 -0.347611769926061 +196 907 -0.5092437944703918 +197 907 2.938838726521281 +198 907 -0.4104641408642947 +902 907 -2.256142077082761 +903 907 -0.5971552942773518 +907 907 24.6603659427836 +908 907 2.819018934576991 +912 907 -1.39163507628795 +913 907 -0.5039342198456489 +1176 907 -0.3412564856252698 +1177 907 -1.12597804271179 +1178 907 -0.3871376143501101 +902 908 -0.5772694046827531 +903 908 -2.490050080641602 +904 908 -0.6219140603787316 +907 908 2.844595537410994 +908 908 24.57894375495539 +909 908 2.788099831013596 +912 908 -0.4828910727974351 +913 908 -1.631894485800865 +914 908 -0.5298113023335445 +903 909 -0.6154703881019075 +904 909 -2.569327393564094 +905 909 -0.6155530630773376 +908 909 2.797071139592624 +909 909 24.55363566651232 +910 909 2.796956783078681 +913 909 -0.52301442438434 +914 909 -1.712876888186979 +915 909 -0.5231019093414564 +904 910 -0.6219575413469469 +905 910 -2.490669219567406 +906 910 -0.5774593530863257 +909 910 2.788033253886245 +910 910 24.5786282193591 +911 910 2.844341864431847 +914 910 -0.5298576378437916 +915 910 -1.632532995463873 +916 910 -0.4830924766612149 +167 911 -0.5094908442602328 +168 911 2.938517484753219 +169 911 -0.4107264800798982 +905 911 -0.597314382055614 +906 911 -2.257230742256729 +910 911 2.818792531194917 +911 911 24.65990779138297 +915 911 -0.5041032889351068 +916 911 -1.392756825542305 +1408 911 -0.3412347856826277 +1409 911 -1.125347434693316 +1410 911 -0.387091088223961 +197 912 -0.4216523655974803 +198 912 3.223901093879255 +199 912 -0.3191792469088076 +907 912 -1.507109437857801 +908 912 -0.5131658925275968 +912 912 27.86256973818751 +913 912 3.041920030152776 +917 912 -0.5313403528306478 +918 912 -0.4211573792464573 +1177 912 -0.3771155884657755 +1178 912 -1.452580250231207 +1179 912 -0.4461489536300994 +907 913 -0.4926465107420775 +908 913 -1.742425388974447 +909 913 -0.5385031827400915 +912 913 3.083009797920406 +913 913 27.63630517278617 +914 913 2.993229074011966 +917 913 -0.398258338901272 +918 913 -0.7856890840619056 +919 913 -0.4489667645389065 +908 914 -0.5319008693779066 +909 914 -1.821503758462966 +910 914 -0.5319866985075903 +913 914 3.007807774736625 +914 914 27.55724311447567 +915 914 3.007637479081711 +918 914 -0.4415818386963083 +919 914 -0.8710799322073326 +920 914 -0.4416769784922718 +909 915 -0.5385486432671603 +910 915 -1.743053596231787 +911 915 -0.4928442285730515 +914 915 2.993132700412637 +915 915 27.63564846655487 +916 915 3.082631652089256 +919 915 -0.449017421776514 +920 915 -0.7863668167542315 +921 915 -0.3984776816387866 +168 916 -0.4219099646837319 +169 916 3.223420799231285 +170 916 -0.3194652922482634 +910 916 -0.5133317631216814 +911 916 -1.508214379709952 +915 916 3.041586196296673 +916 916 27.86154626230273 +920 916 -0.4213418720845801 +921 916 -0.5325296558005141 +1409 916 -0.377073128853552 +1410 916 -1.451833074818975 +1411 916 -0.4460756898754946 +198 917 -0.3369627231705443 +199 917 3.673037619170654 +200 917 -0.2153756260491826 +912 917 -0.7147495711782492 +913 917 -0.4358690757457274 +917 917 32.61350789120031 +918 917 3.409988190381771 +922 917 0.5298333797443342 +923 917 -0.3320599864954638 +1178 917 -0.4301564324219279 +1179 917 -1.888843221687529 +1180 917 -0.5356222726503147 +912 918 -0.4137853563503315 +913 918 -0.9614305288915018 +914 918 -0.4628321378711735 +917 918 3.471521118479989 +918 918 32.19960522737671 +919 918 3.338330359846559 +922 918 -0.3057777466690152 +923 918 0.2460139514756705 +924 918 -0.3634917014402732 +913 919 -0.4557485913792913 +914 919 -1.043884667686939 +915 919 -0.4558411325536534 +918 919 3.360340426053344 +919 919 32.05040354958528 +920 919 3.360098461928488 +923 919 -0.3549847008706308 +924 919 0.1506581683513353 +925 919 -0.3550930601295954 +914 920 -0.4628814173763374 +915 920 -0.962092479598235 +916 920 -0.4139989104197961 +919 920 3.338195655147004 +920 920 32.19852341014792 +921 920 3.470983598299889 +924 920 -0.3635496383350686 +925 920 0.245260984979104 +926 920 -0.3060276543680058 +169 921 -0.3372413354077264 +170 921 3.672353761820558 +171 921 -0.2157017249372269 +915 921 -0.4360485431260101 +916 921 -0.7159131507984651 +920 921 3.40951630244394 +921 921 32.61178545684736 +925 921 -0.3322706943973822 +926 921 0.5285154585254492 +1410 921 -0.4300895098736962 +1411 921 -1.887931832780897 +1412 921 -0.5355132957120873 +199 922 -0.2446795765009696 +200 922 4.378291246042503 +201 922 -0.08065900987232821 +917 922 0.2276288719083837 +918 922 -0.35635771806821 +922 922 39.85414070827453 +923 922 4.000520411692391 +927 922 1.993617914711771 +928 922 -0.2219492215666001 +1179 922 -0.509240160435849 +1180 922 -2.515212815088169 +1181 922 -0.6750932782178581 +917 923 -0.3313895459664844 +918 923 -0.04388775206583961 +919 923 -0.3864096615033329 +922 923 4.091173204663856 +923 923 39.17554342458418 +924 923 3.896591765598957 +927 923 -0.1898388491196934 +928 923 1.656289962809036 +929 923 -0.2596933089438326 +918 924 -0.3783863847062024 +919 924 -0.1345557889639863 +920 924 -0.3784905251096063 +923 924 3.929227280631305 +924 924 38.92689780417938 +925 924 3.928885531219899 +928 924 -0.2492052081008267 +929 924 1.542248585508634 +930 924 -0.2493354744197628 +919 925 -0.3864653375277519 +920 925 -0.04461562698326893 +921 925 -0.3316300316215948 +924 925 3.896403327437412 +925 925 39.17388228409792 +926 925 4.090413532098028 +929 925 -0.2597632195988595 +930 925 1.655407401449622 +931 925 -0.1901390642122009 +170 926 -0.2449935849771347 +171 926 4.377323583122902 +172 926 -0.0810507017724848 +920 926 -0.3565602296738906 +921 926 0.2263518339733589 +925 926 3.999855458737423 +926 926 39.85147093414995 +930 926 -0.2222031153421968 +931 926 1.992079676354726 +1411 926 -0.5091414532991732 +1412 926 -2.51405900057283 +1413 926 -0.6749325120879718 +200 927 -0.130166540133738 +201 927 5.487061434194052 +202 927 0.09947597384463791 +922 927 1.482984774940229 +923 927 -0.2630598500356356 +927 927 51.03089595439982 +928 927 4.940330370398995 +932 927 4.07231979100096 +933 927 -0.08233313987559399 +1180 927 -0.6305474677604211 +1181 927 -3.444150461535672 +1182 927 -0.8939180955634813 +922 928 -0.2331335446496164 +923 928 1.166035122588764 +924 928 -0.2984877607428531 +927 928 5.074138719015036 +928 928 49.96204145243075 +929 928 4.78905412425539 +932 928 -0.04047931251812037 +933 928 3.642662118683625 +934 928 -0.1307026969566871 +923 929 -0.2888013654226904 +924 929 1.059730471100967 +925 929 -0.2889246066570932 +928 929 4.837508066111818 +929 929 49.56593637986749 +930 929 4.837021993171931 +933 929 -0.1168605860701282 +934 929 3.495871238939722 +935 929 -0.1170264721409048 +924 930 -0.2985538557832911 +925 930 1.165193665103033 +926 930 -0.2334180023000757 +929 930 4.788787198871489 +930 930 49.95955778532023 +931 930 5.073056927847039 +934 930 -0.130792111822878 +935 930 3.641564430889884 +936 930 -0.04086118805048622 +171 931 -0.1305380025971245 +172 931 5.48568200361565 +173 931 0.09897806318573804 +925 931 -0.2633000125914337 +926 931 1.481513655891634 +930 931 4.939384562238241 +931 931 51.02688612315033 +935 931 -0.08265723369265715 +936 931 4.070416491153388 +1412 931 -0.6304038520505402 +1413 931 -3.442631039854812 +1414 931 -0.893680622431249 +201 932 0.01299800144389812 +202 932 7.305765817629647 +203 932 0.4081505866694837 +927 932 3.180101696369935 +928 932 -0.1542453640487725 +932 932 69.24770232925177 +933 932 6.488531535100309 +937 932 7.623399762335824 +938 932 0.1563648141266424 +1181 932 -0.8162169353307022 +1182 932 -4.934215678508894 +1183 932 -1.266007939503925 +927 933 -0.1161429033351639 +928 933 2.785319786447188 +929 933 -0.1985895577120127 +932 933 6.691478322393737 +933 933 67.55423672352055 +934 933 6.261634252190015 +937 933 0.2152312018888046 +938 933 7.031957209687764 +939 933 0.08932049309137902 +928 934 -0.1861220835204267 +929 934 2.65173370302167 +930 934 -0.1862759149608347 +933 934 6.335489144113716 +934 934 66.92146929907422 +935 934 6.334776224256234 +938 934 0.1091003674342144 +939 934 6.826965526136869 +940 934 0.1088739736072818 +929 935 -0.1986723076226228 +930 935 2.784291351684767 +931 935 -0.1164975798910685 +934 935 6.261242142297473 +935 935 67.55048088059563 +936 935 6.689887557695855 +939 935 0.08919760598698739 +940 935 7.030497406211186 +941 935 0.2147107135176337 +172 936 0.01253504822443186 +173 936 7.303734663768157 +174 936 0.4074728159014329 +930 936 -0.1545457019090443 +931 936 3.178311856430609 +935 936 6.487140710713961 +936 936 69.24161918147522 +940 936 0.1559210865801666 +941 936 7.620884395938069 +1413 936 -0.8160090369005617 +1414 936 -4.932108965014733 +1415 936 -1.265641207785029 +202 937 0.2525043676296024 +203 937 10.34300150421177 +204 937 0.9065138908801135 +932 937 6.01690214005066 +933 937 0.0267620751896312 +937 937 99.58411252358928 +938 937 9.079610854409811 +942 937 13.45519517100112 +943 937 0.5352907889167999 +1182 937 -1.126447735994852 +1183 937 -7.393132840145999 +1184 937 -1.891512181640048 +932 938 0.07898966590163237 +933 938 5.486951319402461 +934 938 -0.03306511382626087 +937 938 9.396309511171044 +938 938 96.86357814760518 +939 938 8.727961642788475 +942 938 0.6232265285696466 +943 938 12.58537300468513 +944 938 0.4360202445599168 +933 939 -0.01571661275726499 +934 939 5.305201048912889 +935 939 -0.01592175015854697 +938 939 8.843721007660859 +939 939 95.84066822190405 +940 939 8.842641749920809 +943 939 0.4660140836189909 +944 939 12.27958736947244 +945 939 0.4656862336645147 +934 940 -0.03317599428905371 +935 940 5.485611207445324 +936 940 0.07851750880008995 +939 940 8.727363227654546 +940 940 96.85780735933756 +941 940 9.393890598051145 +944 940 0.4358402631563718 +945 940 12.58331133946675 +946 940 0.6224726215894156 +173 941 0.2518888388298268 +174 941 10.33990739419257 +175 941 0.9055332349674495 +935 941 0.02636066036106077 +936 941 6.014583941629251 +940 941 9.077493735279463 +941 941 99.57473566757386 +945 941 0.5346449654580232 +946 941 13.45166063132294 +1414 941 -1.126133568750601 +1415 941 -7.390061491114891 +1416 941 -1.89093371580719 +203 942 0.6177779248846491 +204 942 15.7294738761327 +205 942 1.913984187867655 +937 942 10.47331620845621 +938 942 0.294457306864682 +942 942 153.5414976063494 +943 942 13.67146900586584 +947 942 24.88879724286406 +948 942 1.321338970440679 +1183 942 -1.633181468340442 +1184 942 -11.77873399051243 +1185 942 -3.059261929063226 +937 943 0.3703368498603264 +938 943 9.714611117449946 +939 943 0.2085153734317556 +942 943 14.18889291671765 +943 943 149.0096163883811 +944 943 13.0973292595259 +947 943 1.463054994192697 +948 943 23.50936102896986 +949 943 1.161478671667526 +938 944 0.2340911137989015 +939 944 9.450772494990003 +940 944 0.2338016838342284 +943 944 13.28713378437679 +944 944 147.2985674862414 +945 944 13.28541625291913 +948 944 1.210584698692676 +949 944 23.01731887791191 +950 944 1.2100729874853 +939 945 0.2083576889127254 +940 945 9.712759976810299 +941 945 0.3696711633225342 +944 945 13.09636158273178 +945 945 149.0004189873697 +946 945 14.18501571001051 +949 945 1.161192458490512 +950 945 23.50624609729477 +951 945 1.461875859212176 +174 946 0.6169111912767833 +175 946 15.72450144542383 +176 946 1.912451958866345 +940 946 0.2938889499036245 +941 946 10.47013103454254 +945 946 13.66806899623548 +946 946 153.5264792373041 +950 946 1.320322795319244 +951 946 24.88347931373256 +1415 946 -1.632698940209387 +1416 946 -11.77396841902228 +1417 946 -3.058287279326251 +204 947 1.361857977593021 +205 947 25.42665023792201 +206 947 3.745013112077234 +942 947 19.18183343476965 +943 947 0.8595900192376212 +947 947 250.9791993805513 +948 947 21.94184842502498 +952 947 45.63405792480928 +953 947 2.756463899477623 +1184 947 -2.566409109003809 +1185 947 -19.71378326050846 +1186 947 -5.162881317554817 +942 948 0.9789882438324622 +943 948 18.00643666122954 +944 948 0.7250428074833634 +947 948 22.81369620128839 +948 948 243.2649291783359 +949 948 20.96634700279016 +952 948 2.992755309567499 +953 948 43.36454878676807 +954 948 2.486841589615315 +943 949 0.7659518837922349 +944 949 17.59135208136628 +945 949 0.7655111183940142 +948 949 21.28727874246244 +949 949 240.3446478958298 +950 949 21.28444462671334 +953 949 2.569791186976938 +954 949 42.54614224717935 +955 949 2.568958434305844 +944 950 0.7247992840278848 +945 950 18.00369485565083 +946 950 0.9779740845627416 +949 950 20.96470870927063 +950 950 243.2499752327774 +951 950 22.80723244295318 +954 950 2.486362683842787 +955 950 43.3596720987355 +956 950 2.990825345603595 +175 951 1.360539495943204 +176 951 25.41833258284207 +177 951 3.742505332785277 +945 951 0.8587193875330976 +946 951 19.17714031985951 +950 951 21.93616200794538 +951 951 250.9546148466993 +955 951 2.754789654529613 +956 951 45.62573812858447 +1416 951 -2.565613492069936 +1417 951 -19.70602255173554 +1418 951 -5.161215503448503 +205 952 2.669509338701038 +206 952 43.94334934008722 +207 952 7.690202498917518 +947 952 34.50243836444739 +948 952 1.853226306388974 +952 952 438.1865611598307 +953 952 37.74316436687583 +957 952 89.17153919400496 +958 952 5.934472248800765 +1185 952 -4.204447201294268 +1186 952 -35.07455532418694 +1187 952 -9.370877084587692 +947 953 2.048204194693434 +948 953 32.60543516149004 +949 953 1.632358651180257 +952 953 39.2696025907219 +953 953 424.6580522345927 +954 953 35.99751794811551 +957 953 6.348537500022011 +958 953 85.27002158069406 +959 953 5.447696203039711 +948 954 1.700054568422776 +949 954 31.92748637666856 +950 954 1.699353570188047 +953 954 36.5617117101725 +954 954 419.5307654913472 +955 954 36.55681271375422 +958 954 5.595155759570067 +959 954 83.84939967945695 +960 954 5.593719852537823 +949 955 1.631962996894368 +950 955 32.60120685015993 +951 955 2.046585687995595 +954 955 35.99457486628476 +955 955 424.6331322052255 +956 955 39.25826891383938 +959 955 5.446834327948112 +960 955 85.26212008934712 +961 955 6.345176586010137 +176 956 2.667406614373574 +177 956 43.92870432958865 +178 956 7.685833874739847 +950 956 1.851828815181056 +951 956 34.49521674651905 +955 956 37.733142000372 +956 956 438.1452073252819 +960 956 5.931529116465683 +961 956 89.1580437684235 +1417 956 -4.203117322371463 +1418 956 -35.06122570055679 +1419 956 -9.367875022584782 +206 957 5.56208368026723 +207 957 79.02426224770646 +208 957 15.09667994129576 +952 957 67.09686470067929 +953 957 4.133560785544386 +957 957 794.9278571356181 +958 957 67.81923902565379 +962 957 170.6160184066252 +963 957 11.99649338524446 +1186 957 -7.47537269947967 +1187 957 -64.49633290504232 +1188 957 -17.14118842859271 +952 958 4.47340382551223 +953 958 63.84539481099235 +954 958 3.741135334311234 +957 958 70.48662919314998 +958 958 771.5399897779292 +959 958 64.63100439969003 +962 958 12.7003534493355 +963 958 164.1560916072073 +964 958 11.11748395488666 +953 959 3.860895993538101 +954 959 62.66968693309398 +955 959 3.859701948318341 +958 959 65.62355823160152 +959 959 762.6745171124285 +960 959 65.61498988990547 +963 959 11.37189383104182 +964 959 161.7915981008898 +965 959 11.36943510573754 +954 960 3.740438224749958 +955 960 63.83853519504484 +956 960 4.470627844560596 +959 960 64.62555798790265 +960 960 771.4995869909084 +961 960 70.46642864789497 +964 960 11.11591396598178 +965 960 164.1438445986641 +966 960 12.69450895318868 +177 961 5.558478190733625 +178 961 78.99804947311948 +179 961 15.0890795093977 +955 961 4.131144831567784 +956 961 67.08515513414989 +960 961 67.80121137108011 +961 961 794.8601011285184 +965 961 11.99130704958843 +966 961 170.5950226635143 +1418 961 -7.472989654377946 +1419 961 -64.47305766738842 +1420 961 -17.13596848066456 +207 962 10.99894831469896 +208 962 146.013079960808 +209 962 29.93685284050683 +957 962 127.9603052067174 +958 962 8.484453355770565 +962 962 1481.418529073866 +963 962 125.7918866628337 +967 962 331.7396435017495 +968 962 24.50845695819447 +1187 962 -13.48272283415531 +1188 962 -121.5514436655828 +1189 962 -32.07209513138429 +957 963 9.069226841280356 +958 963 122.4756983363502 +959 963 7.779847266726341 +962 963 130.2990561574295 +963 963 1443.155600627068 +964 963 119.9285061240634 +967 963 25.64283263721374 +968 963 321.862192794379 +969 963 22.91657521523772 +958 964 7.98875882974413 +959 964 120.4777927460341 +960 964 7.986715042811836 +963 964 121.6270704522788 +964 964 1428.672677803166 +965 964 121.6121840700026 +968 964 23.33552946720676 +969 964 318.2463541952859 +970 964 23.33137905444425 +959 965 7.778594127488356 +960 965 122.4647760766428 +961 965 9.064419600629062 +964 965 119.9182168507124 +965 965 1443.095624866879 +966 965 130.2630478686271 +969 965 22.91366254509341 +970 965 321.8452895127324 +971 965 25.63273387060352 +178 966 10.99270340094531 +179 966 145.9661925595674 +180 966 29.92373102759212 +960 966 8.480225464853341 +961 966 127.9416166089309 +965 966 125.7592264718961 +966 966 1481.316814872155 +970 966 24.49929583079561 +971 966 331.7105623079094 +1419 966 -13.47855330594088 +1420 966 -121.5111904230318 +1421 966 -32.06335212985518 +208 967 22.46356306699897 +209 967 265.6250017880501 +210 967 54.63536382568576 +962 967 253.5105906775673 +963 967 17.96251934994149 +967 967 2717.948611405097 +968 967 231.1385756649458 +972 967 599.7660939316523 +973 967 46.01764044888064 +1188 967 -25.35010856417856 +1189 967 -225.2462924475143 +1190 967 -56.71692252338701 +962 968 18.95467604872524 +963 968 244.5441003415328 +964 968 16.66361266480614 +967 968 237.8836405236716 +968 968 2665.277174683028 +969 968 220.8210934248813 +972 968 47.53109922448266 +973 968 588.0958405328784 +974 968 43.36721510829809 +963 969 17.02485416316003 +964 969 241.2607569808916 +965 969 17.02131616736336 +968 969 223.4253842480754 +969 969 2645.512491234851 +970 969 223.4011719806236 +973 969 43.94478245387066 +974 969 583.9152345087203 +975 969 43.93846813188142 +964 970 16.66127345504825 +965 970 244.5276089203364 +966 970 18.94620106604325 +969 970 220.8021222447898 +970 970 2665.21048328941 +971 970 237.8229119707672 +974 970 43.36213266236095 +975 970 588.0799568401465 +976 970 47.51519211140364 +179 971 22.45255690891809 +180 971 265.5458298012672 +181 971 54.61477159524334 +965 971 17.95493804573492 +966 971 253.4822863900224 +970 971 231.0819082176656 +971 971 2717.834247847664 +975 971 46.00270420709224 +976 971 599.7386737914392 +1420 971 -25.34282344307997 +1421 971 -225.1820237345751 +1422 971 -56.70449709767296 +209 972 42.74330240304275 +210 972 458.6874779687737 +211 972 92.54584309279107 +967 972 474.3047425078601 +968 972 35.25995664355727 +972 972 4734.417997252976 +973 972 405.6558035685524 +977 972 1009.391037027648 +978 972 80.35091096741293 +1189 972 -45.86016628943552 +1190 972 -396.5506982594133 +1191 972 -93.9488865413508 +967 973 36.72879984625162 +968 973 461.9831781797654 +969 973 33.00821636993933 +972 973 413.5127066153579 +973 973 4687.452667881951 +974 973 389.0325720738115 +977 973 81.81694089418349 +978 973 1002.186298116552 +979 973 76.36734466729366 +968 974 33.5572589286492 +969 974 457.4953720775937 +970 974 33.55159391964463 +973 974 392.2218314007287 +974 974 4670.779869789161 +975 974 392.1869662867035 +978 974 76.96293950541121 +979 974 1000.053170858774 +980 974 76.95454558154655 +969 975 33.00402749115193 +970 975 461.9633427898984 +971 975 36.71485454161041 +974 975 388.9996969564095 +975 975 4687.439233029704 +976 975 413.4202951798705 +979 975 76.35914328801937 +980 975 1002.187967464764 +981 975 81.79460814136215 +180 976 42.72523548434555 +181 976 458.5672645688967 +182 976 92.51713411147219 +970 976 35.24713721882111 +971 976 474.2706270910571 +975 976 405.5655143669775 +976 976 4734.392926945052 +980 976 80.32885054845387 +981 976 1009.393527966468 +1421 976 -45.84894132360494 +1422 976 -396.4630503210244 +1423 976 -93.93483273380983 +210 977 76.93486755416301 +211 977 722.2750993159553 +212 977 138.0573673558368 +972 977 843.1893962217629 +973 977 65.63599509260831 +977 977 7515.578458958294 +978 977 651.3354828622811 +982 977 1500.738459733375 +983 977 123.1088529393322 +1190 977 -79.37660749567722 +1191 977 -636.6611200211598 +1192 977 -138.536134239064 +972 978 67.36176395814758 +973 978 831.4576437484059 +974 978 62.0422469993337 +977 978 656.5911123603649 +978 978 7524.021675722235 +979 978 627.7614918162385 +982 978 123.7474426446126 +983 978 1507.737648371523 +984 978 117.9050591259576 +973 979 62.71721421238991 +974 979 827.399389423494 +975 979 62.7090977692202 +978 979 630.2329154263423 +979 979 7531.38983054394 +980 979 630.1907942792262 +983 979 118.231267069585 +984 979 1511.79545483169 +985 979 118.2218957110512 +974 980 62.03516179646786 +975 980 831.4460335406901 +976 980 67.3408959220226 +979 980 627.7101643470538 +980 980 7524.18612952984 +981 980 656.4692932900887 +984 980 117.8933882593887 +985 980 1507.780253319219 +986 980 123.7204036125467 +181 981 76.90797532560543 +182 981 722.1175101814415 +183 981 138.0229254576554 +975 981 65.61597212223377 +976 981 843.1693413250415 +980 981 651.2083816912357 +981 981 7515.853489635 +985 981 123.0803941243127 +986 981 1500.810172122144 +1422 981 -79.36207886489815 +1423 981 -636.5681156764709 +1424 981 -138.5252512265502 +211 982 122.0344043038583 +212 982 1024.835643560733 +213 982 187.6439225584591 +977 982 1328.751468292247 +978 982 107.3721652841769 +982 982 10734.23305812211 +983 982 940.9813769817879 +987 982 2032.806833702631 +988 982 170.8026136464817 +1191 982 -123.2010694944031 +1192 982 -919.2368779492037 +1193 982 -186.3788034773673 +977 983 108.6204286100994 +978 983 1327.149857293955 +979 983 102.4056598417716 +982 983 938.9586602544179 +983 983 10855.89336237851 +984 983 911.358552741704 +987 983 170.0308780452035 +988 983 2061.044568448825 +989 983 164.6068001919741 +978 984 102.9464270624608 +979 984 1327.520015669532 +980 984 102.9366963718157 +983 984 911.338989736627 +984 984 10912.38792425423 +985 984 911.296369558941 +988 984 164.4345748627507 +989 984 2074.395112639238 +990 984 164.4253254218159 +979 985 102.3950408174547 +980 985 1327.169939177634 +981 985 108.593650665577 +984 985 911.2869615446999 +985 985 10856.37374223494 +986 985 938.817986841687 +989 985 164.5916991449365 +990 985 2061.14536209405 +991 985 170.001094628047 +182 986 122.000173505923 +183 986 1024.655041535722 +184 986 187.6063128030204 +980 986 107.3449206435995 +981 986 1328.785272929449 +985 986 940.8223449137633 +986 986 10735.03801774804 +990 986 170.7690502305588 +991 986 2032.976050775412 +1423 986 -123.1873731672527 +1424 986 -919.1672530081203 +1425 986 -186.3746487433852 +212 987 174.4789074278461 +213 987 1330.872139832921 +214 987 235.4952292678878 +982 987 1890.701490616915 +983 987 157.443888767367 +987 987 14005.30188261054 +988 987 1238.003952935212 +992 987 2543.242754976246 +993 987 217.2520003651373 +1192 987 -173.5019537708782 +1193 987 -1210.14303009557 +1194 987 -231.8433947439007 +982 988 157.4065700914819 +983 988 1909.18205146255 +984 988 151.3197272833295 +987 988 1226.256863102324 +988 988 14268.87522573195 +989 988 1203.432777502174 +992 988 214.9546930087553 +993 988 2593.784780696064 +994 988 210.2667139246089 +983 989 151.4189731435995 +984 989 1918.292395869151 +985 989 151.4089517123948 +988 989 1199.910665145899 +989 989 14387.61894837666 +990 989 1199.872130730123 +993 989 209.5406872470659 +994 989 2616.960082114213 +995 989 209.5320818253764 +984 990 151.3053998543797 +985 990 1909.257939739228 +986 990 157.3760872688526 +989 990 1203.341425124179 +990 990 14269.74062594373 +991 990 1226.105771262848 +994 990 210.2485314857313 +995 990 2593.94654530722 +996 990 214.9233219789299 +183 991 174.4402749301741 +184 991 1330.679652254011 +185 991 235.4558696365914 +985 991 157.4106451587429 +986 991 1890.829180204529 +990 991 1237.818972307712 +991 991 14006.74840536282 +995 991 217.2144295016785 +996 991 2543.513432863137 +1424 991 -173.4937780799514 +1425 991 -1210.11550757423 +1426 991 -231.8466429655556 +213 992 226.4358616636596 +214 992 1621.444763865537 +215 992 282.257807402139 +987 992 2445.15180419388 +988 992 207.866788067954 +992 992 17115.51953323647 +993 992 1520.118636193715 +997 992 3039.241471588025 +998 992 262.511041766692 +1193 992 -222.846988717157 +1194 992 -1488.453286320203 +1195 992 -275.5301392833964 +987 993 206.1795142615945 +988 993 2487.771871524301 +989 993 200.8709688373942 +992 993 1498.963744453888 +993 993 17516.01492186568 +994 993 1480.969826414734 +997 993 258.8411920611741 +998 993 3110.145743907109 +999 993 254.7598976250129 +988 994 200.3757954706757 +989 994 2507.471870501343 +990 994 200.3664232227674 +993 994 1474.00271166655 +994 994 17695.35491439392 +995 994 1473.968579905053 +998 994 253.5346638969383 +999 994 3142.330932006652 +1000 994 253.5266161134165 +989 995 200.8532661506004 +990 995 2487.913420486453 +991 995 206.1472186747318 +994 995 1480.859869121699 +995 995 17517.25470261144 +996 995 1498.803587419281 +999 995 254.7387906289918 +1000 995 3110.364316300934 +1001 995 258.8081456841247 +184 996 226.3952261742718 +185 996 1621.242011564041 +186 996 282.2164932748198 +990 996 207.8290934483338 +991 996 2445.389044470765 +995 996 1519.909852458005 +996 996 17117.58689301826 +1000 996 262.4695774410822 +1001 996 3039.606257666719 +1425 996 -222.8466436836867 +1426 996 -1488.469318234755 +1427 996 -275.5395067138978 +214 997 276.7208338774187 +215 997 1907.330127995686 +216 997 330.6271049334149 +992 997 2979.202771772015 +993 997 256.7110540407808 +997 997 20173.2576220278 +998 997 1795.310446699788 +1002 997 3550.516441058146 +1003 997 308.9693257272696 +1194 997 -269.9835285864731 +1195 997 -1762.071595761126 +1196 997 -320.2044516364516 +992 998 253.4485421720288 +993 998 3044.866685949629 +994 998 248.9328041379746 +997 998 1766.113944988168 +998 998 20694.58136332222 +999 998 1751.052426253573 +1002 998 304.0929687109291 +1003 998 3639.98567162979 +1004 998 300.3509217785993 +993 999 247.8633163083707 +994 999 3074.741915360075 +995 999 247.8547040859683 +998 999 1741.152516905882 +999 999 20927.70290795493 +1000 999 1741.12047955362 +1003 999 298.6919707825626 +1004 999 3680.406759597727 +1005 999 298.6841551547437 +994 1000 248.9119687448229 +995 1000 3045.071698754781 +996 1000 253.4147616208836 +999 1000 1750.923803943785 +1000 1000 20696.16030323321 +1001 1000 1765.940406377504 +1004 1000 300.3267745957438 +1005 1000 3640.257435423312 +1006 1000 304.0575267487598 +185 1001 276.6785285327693 +186 1001 1907.111343925665 +187 1001 330.5828488860301 +995 1001 256.6693764385036 +996 1001 2979.545307007412 +1000 1001 1795.075157942665 +1001 1001 20175.88593212156 +1005 1001 308.9234038804178 +1006 1001 3550.96919292364 +1426 1001 -269.9903975866484 +1427 1001 -1762.123521842045 +1428 1001 -320.2184272184292 +215 1002 327.5305058043434 +216 1002 2194.06259259096 +217 1002 378.9094430435801 +997 1002 3516.919399677959 +998 1002 305.7102845100813 +1002 1002 23235.7073503197 +1003 1002 2068.877073481455 +1007 1002 4060.445708376011 +1008 1002 355.0627590878503 +1195 1002 -317.0907749389356 +1196 1002 -2035.36459720632 +1197 1002 -364.6492271899178 +997 1003 301.0699558175506 +998 1003 3603.362956329538 +999 1003 297.0717876755623 +1002 1003 2032.915726747539 +1003 1003 23863.26048204103 +1004 1003 2018.836227461959 +1007 1003 349.1330528853681 +1008 1003 4166.698203775566 +1009 1003 345.5073527686175 +998 1004 295.5033018490365 +999 1004 3642.448592429328 +1000 1004 295.4951367622863 +1003 1004 2006.504704987568 +1004 1004 24143.80961319849 +1005 1004 2006.472250633492 +1008 1004 343.4748408841119 +1009 1004 4214.57678469723 +1010 1004 343.4669665287346 +999 1005 297.047785842109 +1000 1005 3603.626731276753 +1001 1005 301.0340493294921 +1004 1005 2018.688451880415 +1005 1005 23865.14595264646 +1006 1005 2032.723877165716 +1009 1005 345.4801231552314 +1010 1005 4167.019030577389 +1011 1005 349.0946548283656 +186 1006 327.4856328207754 +187 1006 2193.821259779165 +188 1006 378.8614922343227 +1000 1006 305.6641976819607 +1001 1006 3517.359135136572 +1005 1006 2068.611694596864 +1006 1006 23238.84244433874 +1010 1006 355.0119815468732 +1011 1006 4060.979601575275 +1427 1006 -317.10326759856 +1428 1006 -2035.443914583449 +1429 1006 -364.6666690695844 +216 1007 377.2879810620984 +217 1007 2505.214047865072 +218 1007 436.090972084663 +1002 1007 4042.851870189553 +1003 1007 353.3546886213554 +1007 1007 26554.23475627501 +1008 1007 2363.796970223883 +1012 1007 4664.426935959918 +1013 1007 409.3785594382996 +1196 1007 -363.0189120173777 +1197 1007 -2330.555251166175 +1198 1007 -417.2752666257151 +1002 1008 347.5494022001439 +1003 1008 4147.511122945671 +1004 1008 343.7884592428773 +1007 1008 2321.556514480776 +1008 1008 27284.80555704419 +1009 1008 2306.952187571448 +1012 1008 402.3390134003765 +1013 1008 4788.974684080137 +1014 1008 398.6385537573428 +1003 1009 341.8034856568592 +1004 1009 4194.687478558523 +1005 1009 341.7954154124607 +1008 1009 2292.403103159964 +1009 1009 27611.42432816732 +1010 1009 2292.368072739983 +1013 1009 396.2178051605338 +1014 1009 4844.995423794895 +1015 1009 396.2095584593263 +1004 1010 343.7613043047106 +1005 1010 4147.827621908291 +1006 1010 347.5107430508957 +1009 1010 2306.783275603705 +1010 1010 27286.9948633418 +1011 1010 2321.340766213038 +1014 1010 398.6076091160814 +1015 1010 4789.349769974049 +1016 1010 402.296531812324 +187 1011 377.2396900599608 +188 1011 2504.942936348559 +189 1011 436.0378834471881 +1005 1011 353.303809445646 +1006 1011 4043.378759481423 +1010 1011 2363.4960095918 +1011 1011 26557.87276306445 +1015 1011 409.321592409514 +1016 1011 4665.050686062304 +1428 1011 -363.0355571671964 +1429 1011 -2330.656783225022 +1430 1011 -417.2958308869925 +217 1012 435.2775662139957 +218 1012 2839.46578644074 +219 1012 492.2786428046542 +1007 1012 4655.60401891314 +1008 1012 408.5228693157435 +1012 1012 30115.61836132525 +1013 1012 2679.553659466851 +1017 1012 5258.465884158184 +1018 1012 462.6261748818509 +1197 1012 -416.4600938947225 +1198 1012 -2646.625265703052 +1199 1012 -469.1288258443653 +1007 1013 401.5451368875183 +1008 1013 4779.360464666294 +1009 1013 397.7780347867097 +1012 1013 2631.162719557282 +1013 1013 30949.96114150304 +1014 1013 2615.116073825465 +1017 1013 454.5490860181477 +1018 1013 5400.393720279088 +1019 1013 450.684350154216 +1008 1014 395.380716093732 +1009 1014 4835.03377615374 +1010 1014 395.372365207184 +1013 1014 2598.421363608795 +1014 1014 31323.0217592041 +1015 1014 2598.382357268896 +1018 1014 447.9029157200605 +1019 1014 5464.157709479998 +1020 1014 447.8941650932011 +1009 1015 397.7471275017809 +1010 1015 4779.733317348466 +1011 1015 401.5025168230048 +1014 1015 2614.92427784852 +1015 1015 30952.46009627319 +1016 1015 2630.919058583711 +1019 1015 450.6497117703775 +1020 1015 5400.82064757927 +1021 1015 454.5023190776948 +188 1016 435.2243017616755 +189 1016 2839.15973926585 +190 1016 492.2201567585643 +1010 1016 408.4658453206659 +1011 1016 4656.224178127994 +1015 1016 2679.212844808435 +1016 1016 30119.76957141585 +1020 1016 462.5629076752517 +1021 1016 5259.175563062507 +1429 1016 -416.4802542949182 +1430 1016 -2646.7462517239 +1431 1016 -469.1521445485977 +218 1017 491.8630125041063 +219 1017 3222.017673732247 +220 1017 565.5677961761147 +1012 1017 5253.961589629982 +1013 1017 462.1903268300931 +1017 1017 34188.63302934933 +1018 1017 3040.400290211502 +1022 1017 6034.010459090519 +1023 1017 531.9629589425267 +1198 1017 -468.715157639072 +1199 1017 -3007.503343352746 +1200 1017 -536.9524574907432 +1012 1018 454.1441065264713 +1013 1018 5395.494444660835 +1014 1018 450.246691308519 +1017 1018 2985.293514214915 +1018 1018 35137.96832737477 +1019 1018 2967.136112874357 +1022 1018 522.5795174520835 +1023 1018 6198.085635726546 +1024 1018 518.4167454361938 +1013 1019 447.4767878984973 +1014 1019 5459.086256996463 +1015 1019 447.4679820909341 +1018 1019 2948.114291593418 +1019 1019 35562.50683795946 +1020 1019 2948.070068811366 +1023 1019 515.1829968438188 +1024 1019 6271.7276939779 +1025 1019 515.1734504934363 +1014 1020 450.212072283828 +1015 1020 5395.920212792533 +1016 1020 454.0972662333767 +1019 1020 2966.918060703377 +1020 1020 35140.81198720966 +1021 1020 2985.016726254082 +1024 1020 518.3772431510874 +1025 1020 6198.578800316867 +1026 1020 522.5268890274903 +189 1021 491.8044358535955 +190 1021 3221.670098965568 +191 1021 565.5019298544737 +1015 1021 462.1270290689539 +1016 1021 5254.669409187287 +1020 1021 3040.013015492766 +1021 1021 34193.35617231188 +1025 1021 531.8912531126794 +1026 1021 6034.830029320414 +1430 1021 -468.7382704688374 +1431 1021 -3007.644009770679 +1432 1021 -536.9791117248079 +13 1022 638.9947547512044 +137 1022 -599.2710432269605 +158 1022 6790.577723342531 +159 1022 602.50343156223 +219 1022 565.3313002405566 +220 1022 3641.523589571776 +596 1022 -538.1233243457567 +1017 1022 6031.450793834161 +1018 1022 531.7159073924179 +1022 1022 38653.1300891042 +1023 1022 3435.901023605837 +1199 1022 -536.7191873789884 +1200 1022 -3402.687102565146 +158 1023 591.6315191465778 +159 1023 6978.429541962376 +160 1023 587.7768632242876 +1017 1023 522.3495445822321 +1018 1023 6195.307699892048 +1019 1023 518.1691208986314 +1022 1023 3373.566638417692 +1023 1023 39726.95283307957 +1024 1023 3352.911678325649 +159 1024 584.0247757151159 +160 1024 7062.51061840801 +161 1024 584.0155442704884 +1018 1024 514.941632956047 +1019 1024 6268.85550083391 +1020 1024 514.932054063092 +1023 1024 3331.392120526616 +1024 1024 40207.22457236378 +1025 1024 3331.341902289008 +160 1025 587.7332524103817 +161 1025 6978.992799428442 +162 1025 591.5755381074318 +1019 1025 518.1296298118267 +1020 1025 6195.800194438457 +1021 1025 522.2968725677367 +1024 1025 3352.664828536319 +1025 1025 39730.17015854643 +1026 1025 3373.253061413095 +16 1026 638.9245181080931 +150 1026 -599.2998097854567 +161 1026 602.4255934164836 +162 1026 6791.513302831045 +190 1026 565.2653819126775 +191 1026 3641.129871374567 +591 1026 -538.2091157283297 +1020 1026 531.6441833635578 +1021 1026 6032.269289469432 +1025 1026 3435.462483200681 +1026 1026 38658.47356345483 +1431 1026 -536.7457245793049 +1432 1026 -3402.84815290137 +5 1027 -2063.584370437866 +65 1027 -12344.42658296893 +66 1027 -2063.392381538134 +94 1027 -581.9231960189373 +250 1027 4232.842221707024 +251 1027 -2177.552322847083 +604 1027 -3475.565644242894 +612 1027 -581.8512750542933 +1027 1027 25656.17465896544 +1028 1027 4232.377581507028 +1032 1027 -13012.04743160874 +1033 1027 -2177.279087920173 +1375 1027 1146.933756290629 +1376 1027 -599.6689341833725 +65 1028 -2063.461949789945 +66 1028 -12343.45586862264 +67 1028 -2063.246132136814 +604 1028 -581.8791869310061 +612 1028 -3475.21774704073 +620 1028 -581.8022069936764 +1027 1028 4232.551087918906 +1028 1028 25653.85173548669 +1029 1028 4232.044913177038 +1032 1028 -2177.382601033873 +1033 1028 -13010.70834367761 +1034 1028 -2177.090086415242 +66 1029 -2063.293564560767 +67 1029 -12342.6711744135 +68 1029 -2063.175032072177 +612 1029 -581.8197190478853 +620 1029 -3474.962447978703 +628 1029 -581.7848081308751 +1028 1029 4232.154868961112 +1029 1029 25652.0983369788 +1030 1029 4231.918574453392 +1033 1029 -2177.153052529236 +1034 1029 -13009.74299386851 +1035 1029 -2177.032070788133 +67 1030 -2063.177745879278 +68 1030 -12342.59721728522 +69 1030 -2063.258167852718 +620 1030 -581.7834240243541 +628 1030 -3474.969591471242 +636 1030 -581.8203014509725 +1029 1030 4231.907088432425 +1030 1030 25652.13116657057 +1031 1030 4232.152316980246 +1034 1030 -2177.019301270275 +1035 1030 -13009.83628672197 +1036 1030 -2177.177759718629 +7 1031 -2063.302005547412 +68 1031 -2063.22381611719 +69 1031 -12343.0119859497 +86 1031 -581.8443357641892 +221 1031 4232.287346737046 +222 1031 -2177.268119686546 +628 1031 -581.803111438258 +636 1031 -3475.165764862893 +1030 1031 4232.046494363518 +1031 1031 25653.35544932057 +1035 1031 -2177.108190160393 +1036 1031 -13010.62411903685 +250 1032 -2177.438152979624 +251 1032 4357.478198517962 +252 1032 -2191.023607680245 +1027 1032 -13016.37988524083 +1028 1032 -2177.16490625047 +1032 1032 26495.07581571332 +1033 1032 4356.807580981031 +1037 1032 -13078.0388981649 +1038 1032 -2190.625784909773 +1375 1032 -599.2503080670344 +1376 1032 1133.478688673356 +1377 1032 -579.2207821616918 +1027 1033 -2177.268482183859 +1028 1033 -13015.03982371043 +1029 1033 -2176.975981231879 +1032 1033 4357.069339973219 +1033 1033 26491.80880450075 +1034 1033 4356.372132823272 +1037 1033 -2190.782470313149 +1038 1033 -13076.14235766503 +1039 1033 -2190.375164759507 +1028 1034 -2177.038962850472 +1029 1034 -13014.07408056368 +1030 1034 -2176.918032131428 +1033 1034 4356.52075929257 +1034 1034 26489.62278365459 +1035 1034 4356.290607265372 +1038 1034 -2190.46104174962 +1039 1034 -13074.93221928569 +1040 1034 -2190.347443421666 +1029 1035 -2176.905207247408 +1030 1035 -13014.16800555663 +1031 1035 -2177.063782777297 +1034 1035 4356.234537168721 +1035 1035 26490.14078979083 +1036 1035 4356.69127182464 +1039 1035 -2190.306681252829 +1040 1035 -13075.33105041838 +1041 1035 -2190.595943039084 +221 1036 -2177.154111854778 +222 1036 4356.949828221878 +223 1036 -2190.763766665414 +1030 1036 -2176.994117589929 +1031 1036 -13014.95702542616 +1035 1036 4356.489548994752 +1036 1036 26492.37995632334 +1040 1036 -2190.467544547062 +1041 1036 -13076.7378434254 +251 1037 -2190.978056339565 +252 1037 4219.042412343217 +253 1037 -2041.400811438177 +1032 1037 -13080.19872493617 +1033 1037 -2190.580207309968 +1037 1037 25744.69869741475 +1038 1037 4218.147758625549 +1042 1037 -12169.48607739584 +1043 1037 -2040.903929095362 +1376 1037 -579.0971843021116 +1377 1037 1042.689095326994 +1378 1037 -517.2159440883273 +1032 1038 -2190.736985803123 +1033 1038 -13078.30083880368 +1034 1038 -2190.329669075282 +1037 1038 4218.507805502029 +1038 1038 25740.41241886098 +1039 1038 4217.607449252693 +1042 1038 -2041.103933871918 +1043 1038 -12167.15490013416 +1044 1038 -2040.608105372875 +1033 1039 -2190.415577921049 +1034 1039 -13077.09012843177 +1035 1039 -2190.30200955882 +1038 1039 4217.79680810259 +1039 1039 25737.80817332598 +1040 1039 4217.591909128392 +1043 1039 -2040.711291115505 +1044 1039 -12165.78250019639 +1045 1039 -2040.614448352492 +1034 1040 -2190.261181081361 +1035 1040 -13077.48977046003 +1036 1040 -2190.550526804662 +1039 1040 4217.480028527179 +1040 1040 25738.93923284465 +1041 1040 4218.184919376873 +1044 1040 -2040.547340055213 +1045 1040 -12166.47153803981 +1046 1040 -2040.951293287156 +222 1041 -2190.718286001184 +223 1041 4218.587562778799 +224 1041 -2041.186780797561 +1035 1041 -2190.422006443369 +1036 1041 -13078.89812348712 +1040 1041 4217.870406518753 +1041 1041 25742.36643050771 +1045 1041 -2040.771516879743 +1046 1041 -12168.41479677579 +252 1042 -2041.406387210564 +253 1042 3799.590857096337 +254 1042 -1773.193198459188 +1037 1042 -12170.13717732363 +1038 1042 -2040.90946943023 +1042 1042 23292.68360944122 +1043 1042 3798.55255558504 +1047 1042 -10551.12398637184 +1048 1042 -1772.652324192471 +1377 1042 -517.2819382913876 +1378 1042 890.0087279723328 +1379 1042 -432.3623268172184 +1037 1043 -2041.109582066221 +1038 1043 -12167.80448157647 +1039 1043 -2040.613725520092 +1042 1043 3798.978583801397 +1043 1043 23287.74890157955 +1044 1043 3797.953840941875 +1047 1043 -1772.872746063982 +1048 1043 -10548.61206601506 +1049 1043 -1772.341175344879 +1038 1044 -2040.716952399381 +1039 1044 -12166.43142138933 +1040 1044 -2040.620123858504 +1043 1044 3798.16776436024 +1044 1044 23284.93706804259 +1045 1044 3798.001018653953 +1048 1044 -1772.450886281266 +1049 1044 -10547.20823135375 +1050 1044 -1772.374490104346 +1039 1045 -2040.552946468841 +1040 1045 -12167.12134048135 +1041 1045 -2040.956958231241 +1044 1045 3797.84475538142 +1045 1045 23286.56216337618 +1046 1045 3798.730017012198 +1049 1045 -1772.291020684974 +1050 1045 -10548.08074257194 +1051 1045 -1772.758161639197 +223 1046 -2041.192364492029 +224 1046 3799.236419698769 +225 1046 -1773.031187484343 +1040 1046 -2040.777050239701 +1041 1046 -12169.06631671509 +1045 1046 3798.332858534526 +1046 1046 23290.8543406488 +1050 1046 -1772.550142394711 +1051 1046 -10550.31374283745 +253 1047 -1773.252609564456 +254 1047 3243.955664550165 +255 1047 -1486.721213226995 +1042 1047 -10550.00751824338 +1043 1047 -1772.7116955321 +1047 1047 20006.10774962738 +1048 1047 3242.879769605553 +1052 1047 -8827.708672729765 +1053 1047 -1486.18746404504 +1378 1047 -432.6111228290996 +1379 1047 721.0690448781771 +1380 1047 -351.872079179 +1042 1048 -1772.93221520821 +1043 1048 -10547.49426375288 +1044 1048 -1772.400602260259 +1047 1048 3243.327139811387 +1048 1048 20001.00815330754 +1049 1048 3242.277907175488 +1052 1048 -1486.406492201445 +1053 1048 -8825.246174356504 +1054 1048 -1485.886529531873 +1043 1049 -1772.510354635345 +1044 1049 -10546.08983370701 +1045 1049 -1772.433952415572 +1048 1049 3242.496234002779 +1049 1049 19998.22173303506 +1050 1049 3242.368438882294 +1053 1049 -1485.993308244118 +1054 1049 -8823.913496962647 +1055 1049 -1485.934681463559 +1044 1050 -1772.350427954198 +1045 1050 -10546.9630842683 +1046 1050 -1772.817589148984 +1049 1050 3242.189314401034 +1050 1050 20000.10900664769 +1051 1050 3243.149462901723 +1054 1050 -1485.84634009089 +1055 1050 -8824.844486930659 +1056 1050 -1486.32302427459 +224 1051 -1773.09053882689 +225 1051 3243.697963222942 +226 1051 -1486.602117513962 +1045 1051 -1772.609459989423 +1046 1051 -10549.19754951587 +1050 1051 3242.716849038957 +1051 1051 20004.7660376588 +1055 1051 -1486.110789880833 +1056 1051 -8827.113791331705 +254 1052 -1486.826655613975 +255 1052 2664.372811934728 +256 1052 -1193.935419680885 +1047 1052 -8824.708941871024 +1048 1052 -1486.292872395849 +1052 1052 16554.84443113395 +1053 1052 2663.358881181069 +1057 1052 -7068.439921693509 +1058 1052 -1193.457235482404 +1379 1052 -352.2780094575166 +1380 1052 564.8618615498902 +1381 1052 -277.6196259390168 +1047 1053 -1486.51195719414 +1048 1053 -8822.245733570573 +1049 1053 -1485.991946678022 +1052 1053 2663.784661201978 +1053 1053 16550.03353899754 +1054 1053 2662.80289275931 +1057 1053 -1193.654114196084 +1058 1053 -7066.244515854562 +1059 1053 -1193.190500585254 +1048 1054 -1486.098755045908 +1049 1054 -8820.912716285344 +1050 1054 -1486.040099011127 +1053 1054 2663.007162612655 +1054 1054 16547.47256484972 +1055 1054 2662.912033519978 +1058 1054 -1193.28542875484 +1059 1054 -7065.078161265159 +1060 1054 -1193.241249477607 +1049 1055 -1485.951736316876 +1050 1055 -8821.844045963469 +1051 1055 -1486.428387947158 +1054 1055 2662.733082857979 +1055 1055 16549.37119991076 +1056 1055 2663.662248972468 +1059 1055 -1193.15924490862 +1060 1055 -7065.945677561924 +1061 1055 -1193.593835356354 +225 1056 -1486.707434488088 +226 1056 2664.191456104119 +227 1056 -1193.848799662409 +1050 1056 -1486.216102766499 +1051 1056 -8824.114064166339 +1055 1056 2663.24184460016 +1056 1056 16553.88949181639 +1060 1056 -1193.400452205571 +1061 1056 -7068.008283620599 +255 1057 -1194.062897827792 +256 1057 2121.092442713952 +257 1057 -943.4709813875926 +1052 1057 -7064.172415815403 +1053 1057 -1193.584692291893 +1057 1057 13307.83618940746 +1058 1057 2120.207438805092 +1062 1057 -5565.21648705834 +1063 1057 -943.0667643106606 +1380 1057 -278.1066379144158 +1381 1057 430.64148446748 +1382 1057 -218.0659349837963 +1052 1058 -1193.781579224843 +1053 1058 -7061.977008315979 +1054 1058 -1193.31792218344 +1057 1058 2120.582190138475 +1058 1058 13303.61951032227 +1059 1058 2119.728871704605 +1062 1058 -943.2333545629601 +1063 1058 -5563.367987167743 +1064 1058 -942.8423159824686 +1053 1059 -1193.412863822704 +1054 1059 -7060.810610339939 +1055 1059 -1193.368638503922 +1058 1059 2119.906860070891 +1059 1059 13301.40956625437 +1060 1059 2119.83671373538 +1063 1059 -942.9222617727003 +1064 1059 -5562.395056261003 +1065 1059 -942.8883773140479 +1054 1060 -1193.286648183309 +1055 1060 -7061.678026840509 +1056 1060 -1193.721160543115 +1059 1060 2119.674853413692 +1060 1060 13303.13414660648 +1061 1060 2120.498535160427 +1064 1060 -942.818003762501 +1065 1060 -5563.140706325452 +1066 1060 -943.1881670734322 +226 1061 -1193.976112439899 +227 1061 2120.965528672752 +228 1061 -943.4058749042545 +1055 1061 -1193.527790914336 +1056 1061 -7063.740513987601 +1060 1061 2120.124084285324 +1061 1061 13307.15774657491 +1065 1061 -943.0235740240983 +1066 1061 -5564.893206470399 +256 1062 -943.6044629919789 +257 1062 1667.391413781338 +258 1062 -740.1571336036645 +1057 1062 -5560.173494420188 +1058 1062 -943.2002412976975 +1062 1062 10588.92005805572 +1063 1062 1666.655817305698 +1067 1062 -4345.162446014921 +1068 1062 -739.8287677776964 +1381 1062 -218.5850279546643 +1382 1062 325.0583301988722 +1383 1062 -171.9328792092765 +1057 1063 -943.366793294507 +1058 1063 -5558.325657339718 +1059 1063 -942.9757223278161 +1062 1063 1666.969730830161 +1063 1063 10585.39139009518 +1064 1063 1666.262150960182 +1067 1063 -739.9639809222855 +1068 1063 -4343.666468566897 +1069 1063 -739.6464639683902 +1058 1064 -943.0556648291868 +1059 1064 -5557.352965489061 +1060 1064 -943.0217231617961 +1063 1064 1666.410430260101 +1064 1064 10583.55743333916 +1065 1064 1666.357802995675 +1068 1064 -739.711334777739 +1069 1064 -4342.881306873375 +1070 1064 -739.6845912297332 +1059 1065 -942.9513956407698 +1060 1065 -5558.09811385387 +1061 1065 -943.3214432533583 +1064 1065 1666.220264229168 +1065 1065 10585.02699160695 +1066 1065 1666.91079075353 +1069 1065 -739.6273740620246 +1070 1065 -4343.487688514904 +1071 1065 -739.9282643711882 +227 1066 -943.5391692182941 +228 1066 1667.299955794377 +229 1066 -740.1058336846384 +1060 1066 -943.1569225763313 +1061 1066 -5559.849726822536 +1065 1066 1666.595114982585 +1066 1066 10588.42160832254 +1070 1066 -739.7945929238384 +1071 1066 -4344.908991564012 +257 1067 -740.280752716433 +258 1067 1305.355273797253 +259 1067 -581.5352790877961 +1062 1067 -4340.05821020518 +1063 1067 -739.9523959074163 +1067 1067 8420.987264324223 +1068 1067 1304.763258975318 +1072 1067 -3392.305972737437 +1073 1067 -581.274886437098 +1382 1067 -172.4246453687308 +1383 1067 243.6853777223014 +1384 1067 -137.1316740668161 +1062 1068 -740.0875409597242 +1063 1068 -4338.563308483143 +1064 1068 -739.7700038587608 +1067 1068 1305.017986505446 +1068 1068 8418.119438457401 +1069 1068 1304.449245589739 +1072 1068 -581.3818350892396 +1073 1068 -3391.124601733163 +1074 1068 -581.1298354165356 +1063 1069 -739.8348596037168 +1064 1069 -4337.778563784812 +1065 1069 -739.8080562857606 +1068 1069 1304.569251801593 +1069 1069 8416.634083206076 +1070 1069 1304.528789164083 +1073 1069 -581.1813063271721 +1074 1069 -3390.50329073053 +1075 1069 -581.1595217967516 +1064 1070 -739.7509039416657 +1065 1070 -4338.38419793512 +1066 1070 -740.0516615521453 +1069 1070 1304.416481429033 +1070 1070 8417.836614399139 +1071 1070 1304.974698415681 +1074 1070 -581.1146093612493 +1075 1070 -3390.978903743302 +1076 1070 -581.3520982699878 +228 1071 -740.229268189934 +229 1071 1305.286778437986 +230 1071 -581.4928989699329 +1065 1071 -739.918097982081 +1066 1071 -4339.804144297373 +1070 1071 1304.717740450831 +1071 1071 8420.604257385739 +1075 1071 -581.2467167146305 +1076 1071 -3392.097989807071 +258 1072 -581.6445752837501 +259 1072 1031.844453022402 +260 1072 -466.9901441336522 +1067 1072 -3387.450687161393 +1068 1072 -581.3842017877304 +1072 1072 6788.21429472305 +1073 1072 1031.374218950697 +1077 1072 -2702.900476102357 +1078 1072 -466.7836637333087 +1383 1072 -137.5757204928101 +1384 1072 183.1731180956032 +1385 1072 -112.6834138776095 +1067 1073 -581.4910632395955 +1068 1073 -3386.270647534122 +1069 1073 -581.2390541780177 +1072 1073 1031.57838409326 +1073 1073 6785.907225340407 +1074 1073 1031.126920020132 +1077 1073 -466.8681248138099 +1078 1073 -2701.96800063003 +1079 1073 -466.6679322862844 +1068 1074 -581.2905017045812 +1069 1074 -3385.649867573179 +1070 1074 -581.2686589772021 +1073 1074 1031.223031858526 +1074 1074 6784.71216245189 +1075 1074 1031.190878323937 +1078 1074 -466.7088215192741 +1079 1074 -2701.474603961004 +1080 1074 -466.6902917879004 +1069 1075 -581.2238217348371 +1070 1075 -3386.124591239069 +1071 1075 -581.4611725098014 +1074 1075 1031.100796039739 +1075 1075 6785.678410638483 +1076 1075 1031.545015796364 +1079 1075 -466.6553804863265 +1080 1075 -2701.843747078367 +1081 1075 -466.8419605984811 +229 1076 -581.6020227563979 +230 1076 1031.790801789381 +231 1076 -466.9532282231166 +1070 1076 -581.3559196265948 +1071 1076 -3387.242041740228 +1075 1076 1031.338841804677 +1076 1076 6787.904275691032 +1080 1076 -466.7592747244632 +1081 1076 -2702.720769135543 +259 1077 -467.0759192428064 +260 1077 828.8296218606195 +261 1077 -379.3312763374513 +1072 1077 -2698.795129764625 +1073 1077 -466.8694632212121 +1077 1077 5591.561375277408 +1078 1077 828.4575214995266 +1082 1077 -2171.201869688012 +1083 1077 -379.1690515975647 +1384 1077 -113.0384057568221 +1385 1077 137.592134053333 +1386 1077 -94.5857100557558 +1072 1078 -466.9538314125971 +1073 1078 -2697.864042878249 +1074 1078 -466.7536384867419 +1077 1078 828.6208079323823 +1078 1078 5589.705247292287 +1079 1078 828.2637071377535 +1082 1078 -379.2349879845094 +1083 1078 -2170.473812505486 +1084 1078 -379.0772514414455 +1073 1079 -466.7945003197369 +1074 1079 -2697.371207737048 +1075 1079 -466.7759200132163 +1078 1079 828.3405875278808 +1079 1079 5588.741134403597 +1080 1079 828.3142959625542 +1083 1079 -379.1094564265221 +1084 1079 -2170.084689255491 +1085 1079 -379.0932841680643 +1074 1080 -466.7410844771414 +1075 1080 -2697.739439108835 +1076 1080 -466.927538106179 +1079 1080 828.2424433367448 +1080 1080 5589.513088569136 +1081 1080 828.5942730019972 +1084 1080 -379.0666985394676 +1085 1080 -2170.365119995143 +1086 1080 -379.2112157149429 +230 1081 -467.0388605936001 +231 1081 828.7862397683709 +232 1081 -379.2981055262081 +1075 1081 -466.8449835652964 +1076 1081 -2698.614779016739 +1080 1081 828.4293539283259 +1081 1081 5591.299249082697 +1085 1081 -379.1472965394948 +1086 1081 -2171.042147262334 +260 1082 -379.3917129217722 +261 1082 682.6772295586749 +262 1082 -322.1717737378636 +1077 1082 -2167.997098211811 +1078 1082 -379.2295161052866 +1082 1082 4751.437779446371 +1083 1082 682.3811216695635 +1087 1082 -1820.293380134444 +1088 1082 -322.0412621208213 +1385 1082 -94.84007630034412 +1386 1082 103.2807167021617 +1387 1082 -83.46448629032112 +1077 1083 -379.2953571268849 +1078 1083 -2167.270438632875 +1079 1083 -379.137628462259 +1082 1083 682.512671406879 +1083 1083 4749.929928417757 +1084 1083 682.2286227185537 +1087 1083 -322.0938843354833 +1088 1083 -1819.711609921512 +1089 1083 -321.9664906435559 +1078 1084 -379.1698028642174 +1079 1084 -2166.881890158206 +1080 1084 -379.1535897208572 +1083 1084 682.2906026931655 +1084 1084 4749.142738699702 +1085 1084 682.2684529732192 +1088 1084 -321.9924962072838 +1089 1084 -1819.396276005815 +1090 1084 -321.9776674607241 +1079 1085 -379.127077135989 +1080 1085 -2167.161426649569 +1081 1085 -379.2714851979188 +1084 1085 682.2108644554935 +1085 1085 4749.762302289264 +1086 1085 682.49110250732 +1089 1085 -321.9571685899264 +1090 1085 -1819.611817785425 +1091 1085 -322.0712187081426 +231 1086 -379.3584338690818 +232 1086 682.6412212527866 +233 1086 -322.1404641992706 +1080 1086 -379.2076948868133 +1081 1086 -2167.836791305134 +1085 1086 682.3582524530379 +1086 1086 4751.20692199629 +1090 1086 -322.0208676031153 +1091 1086 -1820.144442441142 +261 1087 -322.1939689324124 +262 1087 579.4645297340423 +263 1087 -278.3259950811683 +1082 1087 -1818.538238437752 +1083 1087 -322.0634869925721 +1087 1087 4196.509200117596 +1088 1087 579.2263305058455 +1092 1087 -1541.784418493934 +1093 1087 -278.2216233406309 +1386 1087 -83.5634930026082 +1387 1087 75.96041922457653 +1388 1087 -75.85957242433278 +1082 1088 -322.1160180970819 +1083 1088 -1817.957766857566 +1084 1088 -321.9886419327972 +1087 1088 579.3337273775887 +1088 1088 4195.264239431872 +1089 1088 579.1054370522613 +1092 1088 -278.2632052770503 +1093 1088 -1541.323913817443 +1094 1088 -278.160767498066 +1083 1089 -322.0146153631997 +1084 1089 -1817.642975841715 +1085 1089 -321.9997615638625 +1088 1089 579.1560560674283 +1089 1089 4194.609739850981 +1090 1089 579.136981670526 +1093 1089 -278.181655024422 +1094 1089 -1541.069394990391 +1095 1089 -278.1677692158145 +1084 1090 -321.9793272495316 +1085 1090 -1817.857706761385 +1086 1090 -322.0933003078887 +1089 1090 579.0902376713823 +1090 1090 4195.113150951034 +1091 1090 579.3163721827419 +1094 1090 -278.152357712371 +1095 1090 -1541.230690467072 +1096 1090 -278.241120047796 +232 1091 -322.1626064068863 +233 1091 579.4345025100317 +234 1091 -278.2957983290708 +1085 1091 -322.0430650930307 +1086 1091 -1818.388819188694 +1090 1091 579.2078250516159 +1091 1091 4196.299397092614 +1095 1091 -278.2020511732341 +1096 1091 -1541.643231676936 +262 1092 -278.2997986684391 +263 1092 510.4098005282046 +264 1092 -256.4107064866404 +1087 1092 -1541.862496062898 +1088 1092 -278.1954601184582 +1092 1092 3880.412425351528 +1093 1092 510.2153542923665 +1097 1092 -1389.732247335413 +1098 1092 -256.3238223391414 +1387 1092 -75.75969908792766 +1388 1092 53.19755389919554 +1389 1092 -73.70516557575873 +1087 1093 -278.236952821546 +1088 1093 -1541.403212591791 +1089 1093 -278.1345459938896 +1092 1093 510.3045171710605 +1093 1093 3879.363359480914 +1094 1093 510.1184739158165 +1097 1093 -256.35796050163 +1098 1093 -1389.352804864808 +1099 1093 -256.272068646315 +1088 1094 -278.1553979147656 +1089 1094 -1541.149220057369 +1090 1094 -278.141507226854 +1093 1094 510.1604922899842 +1094 1094 3878.806681897023 +1095 1094 510.1436837682798 +1098 1094 -256.289583222448 +1099 1094 -1389.137688397537 +1100 1094 -256.2757968887778 +1089 1095 -278.1261507581394 +1090 1095 -1541.309794151283 +1091 1095 -278.214875632024 +1094 1095 510.1050968593685 +1095 1095 3879.222280467986 +1096 1095 510.29099264608 +1099 1095 -256.2639780672625 +1100 1095 -1389.260655573529 +1101 1095 -256.335275215607 +233 1096 -278.2696189009353 +234 1096 510.3848793575162 +235 1096 -256.3799478650568 +1090 1096 -278.1759095531656 +1091 1096 -1541.720970639908 +1095 1096 510.20064429256 +1096 1096 3880.215466171943 +1100 1096 -256.3039475452502 +1101 1096 -1389.591011173801 +263 1097 -256.3067728195671 +264 1097 468.2275907597959 +265 1097 -241.3390708164303 +1092 1097 -1392.735640101498 +1093 1097 -256.2199271033173 +1097 1097 3785.231140928086 +1098 1097 468.0658815927516 +1102 1097 -1262.040614335443 +1103 1097 -241.2672013224475 +1388 1097 -73.28602439565047 +1389 1097 31.15187002081265 +1390 1097 -74.54499491586142 +1092 1098 -256.2539805099184 +1093 1098 -1392.357274571954 +1094 1098 -256.1681406198846 +1097 1098 468.141498034882 +1098 1098 3784.323803697128 +1099 1098 467.9873131215973 +1102 1098 -241.2948581380356 +1103 1098 -1261.731978830181 +1104 1098 -241.2230454878276 +1093 1099 -256.1856150763026 +1094 1099 -1392.142643429568 +1095 1099 -256.1718557875902 +1098 1099 468.0228731129969 +1099 1099 3783.836824634025 +1100 1099 468.007926506392 +1103 1099 -241.2376782985243 +1104 1099 -1261.55070575948 +1105 1099 -241.2236684397849 +1094 1100 -256.1600769287165 +1095 1100 -1392.265031834417 +1096 1100 -256.2313998751611 +1099 1100 467.9752692587327 +1100 1100 3784.187943979207 +1101 1100 468.1323275404922 +1104 1100 -241.2150682564885 +1105 1100 -1261.639364241837 +1106 1100 -241.2709508623005 +234 1101 -256.2761437100281 +235 1101 468.2080320171962 +236 1101 -241.3069625810886 +1095 1101 -256.2001530666871 +1096 1101 -1392.59427182236 +1100 1101 468.0551936903832 +1101 1101 3785.041610185645 +1105 1101 -241.2464536704669 +1106 1101 -1261.8971265441 +264 1102 -241.1123039753635 +265 1102 449.7210871775825 +266 1102 -245.8882566586024 +1097 1102 -1269.5967761338 +1098 1102 -241.0404841204937 +1102 1102 3918.690140033722 +1103 1102 449.5840718543113 +1107 1102 -1236.276317231851 +1108 1102 -245.82560871801 +1389 1102 -73.62084814113233 +1390 1102 6.894893991586557 +1391 1102 -81.5693827650539 +1097 1103 -241.0680559707061 +1098 1103 -1269.289091673132 +1099 1103 -240.9963308013372 +1102 1103 449.6495349882118 +1103 1103 3917.88373358716 +1104 1103 449.5197316504497 +1107 1103 -245.8491672677604 +1108 1103 -1236.011457804168 +1109 1103 -245.7856532091287 +1098 1104 -241.0109135616618 +1099 1104 -1269.108285609023 +1100 1104 -240.9969803119657 +1103 1104 449.5503610567698 +1104 1104 3917.444700831453 +1105 1104 449.5370564866673 +1108 1104 -245.798636593188 +1109 1104 -1235.848626884896 +1110 1104 -245.7833950646716 +1099 1105 -240.9884002087201 +1100 1105 -1269.196541283399 +1101 1105 -241.0444041642397 +1104 1105 449.5086511179436 +1105 1105 3917.748493891671 +1106 1105 449.6458179064856 +1109 1105 -245.777168780262 +1110 1105 -1235.911990819799 +1111 1105 -245.8223608746823 +235 1106 -241.0805011413284 +236 1106 449.7078108160266 +237 1106 -245.8525345887193 +1100 1106 -241.0199612495248 +1101 1106 -1269.453477099544 +1105 1106 449.5781398601562 +1106 1106 3918.503059610696 +1110 1106 -245.8024832627253 +1111 1106 -1236.120982248467 +265 1107 -245.4535236151721 +266 1107 455.5903778866929 +267 1107 -260.065102460119 +1102 1107 -1251.484660558341 +1103 1107 -245.3909455835902 +1107 1107 4348.208295990279 +1108 1107 455.4711182174826 +1112 1107 -1226.742402312292 +1113 1107 -260.0100823629034 +1390 1107 -79.79026452584088 +1391 1107 -24.9419211388332 +1392 1107 -94.77670423303204 +1102 1108 -245.414415814469 +1103 1108 -1251.220582855014 +1104 1108 -245.3510500942818 +1107 1108 455.5293247612568 +1108 1108 4347.465641601352 +1109 1108 455.4176960532379 +1112 1108 -260.0301121851697 +1113 1108 -1226.515375854413 +1114 1108 -259.9730765053495 +1103 1109 -245.3639658964938 +1104 1109 -1251.058205581594 +1105 1109 -245.3488841940776 +1108 1109 455.4446303538693 +1109 1109 4347.054310330521 +1110 1109 455.4331124976106 +1113 1109 -259.9848069414756 +1114 1109 -1226.366667052951 +1115 1109 -259.9675593895329 +1104 1110 -245.3426457780125 +1105 1110 -1251.121447198593 +1106 1110 -245.3881186653458 +1109 1110 455.4073515843436 +1110 1110 4347.326585991385 +1111 1110 455.5335879506138 +1114 1110 -259.9636759600957 +1115 1110 -1226.405219954034 +1116 1110 -259.9986990378663 +236 1111 -245.418402868233 +237 1111 455.5859062298678 +238 1111 -260.023644521536 +1105 1111 -245.368253603725 +1106 1111 -1251.330060051112 +1110 1111 455.471850828653 +1111 1111 4348.019840699767 +1115 1111 -259.9831042829188 +1116 1111 -1226.569058966555 +266 1112 -259.2473879399118 +267 1112 487.3482197027336 +268 1112 -299.0166811699736 +1107 1112 -1255.927445774477 +1108 1112 -259.1924782754963 +1112 1112 5193.511723264479 +1113 1112 487.2421261838191 +1117 1112 -1306.69698323421 +1118 1112 -298.9654440633915 +1391 1112 -91.42074123562715 +1392 1112 -73.71911593609644 +1393 1112 -119.8179771829909 +1107 1113 -259.2124041521629 +1108 1113 -1255.701023057166 +1109 1113 -259.1556310615143 +1112 1113 487.2949065669065 +1113 1113 5192.804065146925 +1114 1113 487.1978753361768 +1117 1113 -298.9834580754646 +1118 1113 -1306.490184230136 +1119 1113 -298.9286551425067 +1108 1114 -259.1672584656723 +1109 1114 -1255.55279804396 +1110 1114 -259.1503218464723 +1113 1114 487.2217434415982 +1114 1114 5192.40384711349 +1115 1114 487.2128023796433 +1118 1114 -298.9401100541577 +1119 1114 -1306.343269621234 +1120 1114 -298.9190678324027 +1109 1115 -259.1463738606885 +1110 1115 -1255.591661819179 +1111 1115 -259.1819647392129 +1114 1115 487.1882917886393 +1115 1115 5192.65712957572 +1116 1115 487.3122199998342 +1119 1115 -298.9173657412768 +1120 1115 -1306.358948658772 +1121 1115 -298.9439077190444 +237 1116 -259.2070734264036 +238 1116 487.3579399082806 +239 1116 -298.9649579641477 +1110 1116 -259.1663169294114 +1111 1116 -1255.755800837605 +1115 1116 487.2535093288045 +1116 1116 5193.320431914195 +1120 1116 -298.9315578517234 +1121 1116 -1306.48922665601 +267 1117 -297.4878750755441 +268 1117 553.6942570776662 +269 1117 -363.8673746250387 +1112 1117 -1361.750294501524 +1113 1117 -297.4368276848189 +1117 1117 6733.383420767012 +1118 1117 553.5972837035315 +1122 1117 -1407.557935907844 +1123 1117 -363.817959640548 +1392 1117 -113.5286718648627 +1393 1117 -157.6892416109011 +1394 1117 -164.0970072127322 +1112 1118 -297.4546980553399 +1113 1118 -1361.543921025856 +1114 1118 -297.4003728846164 +1117 1118 553.6459787734922 +1118 1118 6732.681370256054 +1119 1118 553.5612918356082 +1122 1118 -363.834638957988 +1123 1118 -1407.364170482539 +1124 1118 -363.7792299252763 +1113 1119 -297.4116548898554 +1114 1119 -1361.397622095426 +1115 1119 -297.3912035215578 +1118 1119 553.5822528181811 +1119 1119 6732.274528003633 +1120 1119 553.5779364280306 +1123 1119 -363.7911485812068 +1124 1119 -1407.211030653124 +1125 1119 -363.7638371789902 +1114 1120 -297.3893427815131 +1115 1120 -1361.414379328507 +1116 1120 -297.416980921435 +1119 1120 553.5528954076751 +1120 1120 6732.523312363327 +1121 1120 553.6865851944497 +1124 1120 -363.7648039547809 +1125 1120 -1407.199324392152 +1126 1120 -363.7813076615705 +238 1121 -297.4382971303921 +239 1121 553.7293232417866 +240 1121 -363.7984073890916 +1115 1121 -297.4044652835459 +1116 1121 -1361.546102954256 +1120 1121 553.6274799746815 +1121 1121 6733.193011860329 +1125 1121 -363.7723628516079 +1126 1121 -1407.294987379611 +268 1122 -360.8856325063777 +269 1122 668.7443803971147 +270 1122 -483.229015748751 +1117 1122 -1515.312450205795 +1118 1122 -360.8365755264876 +1122 1122 9520.437407075024 +1123 1122 668.6540054324879 +1127 1122 -1585.043678002374 +1128 1122 -483.1772484420418 +1393 1122 -151.7987164508737 +1394 1122 -315.7029256910028 +1395 1122 -246.1101113353827 +1117 1123 -360.853013607446 +1118 1123 -1515.118987370407 +1119 1123 -360.7985263615533 +1122 1123 668.6988941965694 +1123 1123 9519.711496564572 +1124 1123 668.6274571512403 +1127 1123 -483.1941773033791 +1128 1123 -1584.84504747552 +1129 1123 -483.1322731524605 +1118 1124 -360.8101231884682 +1119 1124 -1514.966842362224 +1120 1124 -360.7839713854316 +1123 1124 668.6445673997837 +1124 1124 9519.279911057676 +1125 1124 668.6499606398095 +1128 1124 -483.1462015557639 +1129 1124 -1584.667668113012 +1130 1124 -483.1077472625117 +1119 1125 -360.7845974462362 +1120 1125 -1514.957658548738 +1121 1125 -360.8032658631503 +1124 1125 668.6216744805943 +1125 1125 9519.544120936769 +1126 1125 668.7841599740564 +1129 1125 -483.1122581425388 +1130 1125 -1584.620368950326 +1131 1125 -483.1159530806785 +239 1126 -360.8208532630941 +240 1126 668.8284440892905 +241 1126 -483.1288605438722 +1120 1126 -360.7939456835221 +1121 1126 -1515.056848126605 +1125 1126 668.7203606035746 +1126 1126 9520.265407347717 +1130 1126 -483.1105666276688 +1131 1126 -1584.681536497346 +269 1127 -477.2158008199263 +270 1127 860.4083958520032 +271 1127 -691.4497712155571 +1122 1127 -1802.620826916883 +1123 1127 -477.1647428068254 +1127 1127 14759.84489644701 +1128 1127 860.3227530448869 +1132 1127 -1720.786604195475 +1133 1127 -691.390171164042 +1394 1127 -221.2466198337808 +1395 1127 -635.4651376326915 +1396 1127 -405.3010490673644 +1122 1128 -477.1812415779509 +1123 1128 -1802.422190505075 +1124 1128 -477.1211833837065 +1127 1128 860.3632107248766 +1128 1128 14759.05195657939 +1129 1128 860.3103872781255 +1132 1128 -691.4094896459585 +1133 1128 -1720.562329287367 +1134 1128 -691.3319519120755 +1123 1129 -477.1344668637087 +1124 1129 -1802.246820695867 +1125 1129 -477.0983701856696 +1128 1129 860.3205771552524 +1129 1129 14758.57448916413 +1130 1129 860.3482287820216 +1133 1129 -691.3504112006242 +1134 1129 -1720.335000453483 +1135 1129 -691.291913718203 +1124 1130 -477.1021238705853 +1125 1130 -1802.205450585189 +1126 1130 -477.1102139502208 +1129 1130 860.3107278254353 +1130 1130 14758.89843251132 +1131 1130 860.5393719397968 +1134 1130 -691.3020794301725 +1135 1130 -1720.232303048 +1136 1130 -691.2841004959811 +240 1131 -477.1240846969832 +241 1131 860.5933887885606 +242 1131 -691.2906537170738 +1125 1131 -477.1040389102476 +1126 1131 -1802.274306909568 +1130 1131 860.4637280589207 +1131 1131 14759.7465854285 +1135 1131 -691.283875418998 +1136 1131 -1720.245318811632 +270 1132 -678.5837956115421 +271 1132 1171.987152691302 +272 1132 -1079.853518263631 +1127 1132 -2186.349540970553 +1128 1132 -678.5257044757273 +1132 1132 25148.97143202727 +1133 1132 1171.90754238403 +1137 1132 -1651.884623843252 +1138 1132 -1079.775243644142 +1395 1132 -351.9687324542189 +1396 1132 -1329.57398677363 +1397 1132 -732.4413787088374 +1127 1133 -678.5441708460997 +1128 1133 -2186.124678104063 +1129 1133 -678.4705654091836 +1132 1133 1171.940178679567 +1133 1133 25148.04515633506 +1134 1133 1171.92384214881 +1137 1133 -1079.80140920355 +1138 1133 -1651.592552292637 +1139 1133 -1079.689574090598 +1128 1134 -678.4876391617688 +1129 1134 -2185.901880559407 +1130 1134 -678.4342130124146 +1133 1134 1171.918711533582 +1134 1134 25147.5002301808 +1135 1134 1171.999385814345 +1138 1134 -1079.717985213655 +1139 1134 -1651.26166508541 +1140 1134 -1079.620172159679 +1129 1135 -678.4426577258947 +1130 1135 -2185.812995831471 +1131 1135 -678.4341011234495 +1134 1135 1171.939229096388 +1135 1135 25147.98440504473 +1136 1135 1172.313478975873 +1139 1135 -1079.640780835249 +1140 1135 -1651.059407555309 +1141 1135 -1079.58030941636 +241 1136 -678.4427251246091 +242 1136 1172.393953590778 +243 1136 -1079.575103632562 +1130 1136 -678.4322126900588 +1131 1136 -2185.842496238515 +1135 1136 1172.212501146658 +1136 1136 25149.10058563624 +1140 1136 -1079.588854877224 +1141 1136 -1650.993447923179 +271 1137 -1051.030892703651 +272 1137 1675.266817900452 +273 1137 -1826.653961418233 +1132 1137 -2694.670793961349 +1133 1137 -1050.956046859684 +1137 1137 46946.48481858482 +1138 1137 1675.203274156129 +1142 1137 -648.5642150758608 +1143 1137 -1826.535961049945 +1396 1137 -612.7391931426196 +1397 1137 -2915.823265231824 +1398 1137 -1442.230480984031 +1132 1138 -1050.980162592842 +1133 1138 -2694.379345647179 +1134 1138 -1050.877193564292 +1137 1138 1675.215111926722 +1138 1138 46945.3388301563 +1139 1138 1675.285704722798 +1142 1138 -1826.57790679548 +1143 1138 -648.1286914784314 +1144 1138 -1826.39348700397 +1133 1139 -1050.902417374079 +1134 1139 -2694.059947549941 +1135 1139 -1050.815972027888 +1138 1139 1675.243140741667 +1139 1139 46944.71903878689 +1140 1139 1675.450849137666 +1143 1139 -1826.443685918669 +1144 1139 -647.5874693426672 +1145 1139 -1826.263059633022 +1134 1140 -1050.832759588512 +1135 1140 -2693.888296852331 +1136 1140 -1050.793342378698 +1139 1140 1675.339277404393 +1140 1140 46945.57328767442 +1141 1140 1676.037738482129 +1144 1140 -1826.305714336867 +1145 1140 -647.1823760986622 +1146 1140 -1826.149774448574 +242 1141 -1050.792845211408 +243 1141 1676.182978814859 +244 1141 -1826.118565683784 +1135 1141 -1050.798299264101 +1136 1141 -2693.857590198572 +1140 1141 1675.883229437959 +1141 1141 46947.24193664743 +1145 1141 -1826.176013753105 +1146 1141 -646.9599187872127 +272 1142 -1759.332452551642 +273 1142 2405.652229730475 +274 1142 -3275.60126568646 +1137 1142 -3084.401116400924 +1138 1142 -1759.222534003161 +1142 1142 94897.49110405133 +1143 1142 2405.640832907418 +1147 1142 3430.651818983376 +1148 1142 -3275.399550548221 +1397 1142 -1162.484146141784 +1398 1142 -6721.528897277938 +1399 1142 -3012.256635208932 +1137 1143 -1759.259443421443 +1138 1143 -3083.970195773896 +1139 1143 -1759.095835833546 +1142 1143 2405.596171352101 +1143 1143 94895.98756162025 +1144 1143 2405.888612058413 +1147 1143 -3275.476462579632 +1148 1143 3431.368508842408 +1149 1143 -3275.134801125295 +1138 1144 -1759.138440434878 +1139 1144 -3083.457295086931 +1140 1144 -1758.98431446175 +1143 1144 2405.752969255124 +1144 1144 94895.31596745315 +1145 1144 2406.271951152911 +1148 1144 -3275.232501154342 +1149 1144 3432.321065183697 +1150 1144 -3274.870271997066 +1139 1145 -1759.018361787532 +1140 1145 -3083.119456524539 +1141 1145 -1758.911375930221 +1144 1145 2406.045020963286 +1145 1145 94896.97821151855 +1146 1145 2407.488037505713 +1149 1145 -3274.960957094415 +1150 1145 3433.143755171541 +1151 1145 -3274.58004564389 +243 1146 -1758.891422664298 +244 1146 2407.790159647763 +245 1146 -3274.486058526056 +1140 1146 -1758.929730077689 +1141 1146 -3082.972297659409 +1145 1146 2407.219032051033 +1146 1146 94899.77710139329 +1150 1146 -3274.644443509686 +1151 1146 3433.693140479581 +273 1147 -3119.909500222974 +274 1147 3220.319807380353 +275 1147 -5940.499399959441 +1142 1147 -2208.842954783405 +1143 1147 -3119.726530052763 +1147 1147 199096.9622128227 +1148 1147 3220.454307441527 +1152 1147 14716.05544011557 +1153 1147 -5940.130643642024 +1398 1147 -2366.974497819489 +1399 1147 -15602.73500716711 +1400 1147 -6218.31884431752 +1142 1148 -3119.792454548866 +1143 1148 -2208.127321641532 +1144 1148 -3119.498453406554 +1147 1148 3220.287863931101 +1148 1148 199094.6318817433 +1149 1148 3221.097594819797 +1152 1148 -5940.27698161604 +1153 1148 14717.23637826632 +1154 1148 -5939.604262023369 +1143 1149 -3119.579844588901 +1144 1149 -2207.218975918914 +1145 1149 -3119.278190085752 +1148 1149 3220.768568766798 +1149 1149 199093.6281810325 +1150 1149 3222.000514465828 +1153 1149 -5939.795352343079 +1154 1149 14718.86706307451 +1155 1149 -5939.048788897065 +1144 1150 -3119.350612382919 +1145 1150 -2206.524468503345 +1146 1150 -3119.082112128283 +1149 1150 3221.538575457647 +1150 1150 199096.6903454442 +1151 1150 3224.641328251749 +1154 1150 -5939.234651874933 +1155 1150 14720.42673318555 +1156 1150 -5938.359618175799 +244 1151 -3119.015072260691 +245 1151 3225.308478275928 +246 1151 -5938.11840427608 +1145 1151 -3119.130047162872 +1146 1151 -2206.120618376828 +1150 1151 3224.144817081119 +1151 1151 199101.5199861131 +1155 1151 -5938.499487566249 +1156 1151 14721.56359961864 +274 1152 -5621.367382129676 +275 1152 3112.650584961881 +276 1152 -9748.828381562878 +1147 1152 3113.767026673257 +1148 1152 -5621.036624355439 +1152 1152 402506.4340052734 +1153 1152 3113.131801300495 +1157 1152 39445.06413393348 +1158 1152 -9748.19160183565 +1399 1152 -4907.113245345357 +1400 1152 -34140.07978834921 +1401 1152 -11486.26284459694 +1147 1153 -5621.165389886604 +1148 1153 3115.02124184139 +1149 1153 -5620.587200936586 +1152 1153 3112.78631826269 +1153 1153 402501.5387529428 +1154 1153 3114.635982712096 +1157 1153 -9748.439660204631 +1158 1153 39446.64210687738 +1159 1153 -9747.195700679387 +1148 1154 -5620.752879616094 +1149 1154 3116.690170266262 +1150 1154 -5620.127006558552 +1153 1154 3114.031150992083 +1154 1154 402498.16805867 +1155 1154 3116.692216275957 +1158 1154 -9747.523868149618 +1159 1154 39448.87983710552 +1160 1154 -9746.10861977065 +1149 1155 -5620.282147938181 +1150 1155 3118.108038111397 +1151 1155 -5619.634977449585 +1154 1155 3115.850942938472 +1155 1155 402502.3146029178 +1156 1155 3122.262286431176 +1159 1155 -9746.440620413465 +1160 1155 39451.29492616143 +1161 1155 -9744.672360000768 +245 1156 -5619.452069970316 +246 1156 3123.701239983257 +247 1156 -9744.1426937169 +1150 1156 -5619.747052485197 +1151 1156 3119.052270337841 +1155 1156 3121.39600665855 +1156 1156 402509.5970447306 +1160 1156 -9744.930333606964 +1161 1156 39453.16764471247 +275 1157 -9271.846609111351 +276 1157 774.8998765049837 +277 1157 -13348.71988543407 +1152 1157 21955.2057055881 +1153 1157 -9271.264901890187 +1157 1157 701349.6768579495 +1158 1157 775.9536645037369 +1162 1157 72997.40713520611 +1163 1157 -13347.79450315354 +1400 1157 -9557.153605494257 +1401 1157 -62628.91459379845 +1402 1157 -17239.36760546351 +1152 1158 -9271.500475291996 +1153 1158 21957.1061878181 +1154 1158 -9270.389445390838 +1157 1158 775.5069798297118 +1158 1158 701338.4552847729 +1159 1158 778.8740893984432 +1162 1158 -13348.13336734552 +1163 1158 72998.91204117067 +1164 1158 -13346.23749459094 +1153 1159 -9270.700457437137 +1154 1159 21959.73918924568 +1155 1159 -9269.457231376613 +1158 1159 778.1164626723257 +1159 1159 701327.4336050402 +1160 1159 782.8821563525962 +1163 1159 -13346.68824289954 +1164 1159 73001.10562327984 +1165 1159 -13344.50450544389 +1154 1160 -9269.759254572829 +1155 1160 21962.23858100119 +1156 1160 -9268.326691401835 +1159 1160 781.6660799515194 +1160 1160 701329.4934617318 +1161 1160 793.0028716493362 +1164 1160 -13344.9794398902 +1165 1160 73003.94913017185 +1166 1160 -13342.15013603876 +246 1161 -9267.890869398831 +247 1161 795.6825005428145 +248 1161 -13341.25528294282 +1155 1161 -9268.55604677719 +1156 1161 21964.066900586 +1160 1161 791.7441691471104 +1161 1161 701337.2741317414 +1165 1161 -13342.52713360094 +1166 1161 73006.28843574694 +276 1162 -12913.455955446 +277 1162 -4290.975975296453 +278 1162 -15164.26778321953 +1157 1162 56817.0861577317 +1158 1162 -12912.57886264255 +1162 1162 1014203.108834901 +1163 1162 -4289.219039695548 +1167 1162 113979.6356866627 +1168 1162 -15163.1502589263 +1401 1162 -15509.74995014674 +1402 1162 -93971.28294509929 +1403 1162 -22177.67952116644 +1157 1163 -12912.92057425559 +1158 1163 56819.10968794673 +1159 1163 -12911.13772235629 +1162 1163 -4289.634563555453 +1163 1163 1014182.908352431 +1164 1163 -4284.566307018162 +1167 1163 -15163.5316030958 +1168 1163 113980.3710566856 +1169 1163 -15161.16493007646 +1158 1164 -12911.59339168024 +1159 1164 56822.00515990396 +1160 1164 -12909.55905549551 +1163 1164 -4285.278996527828 +1164 1164 1014160.182239487 +1165 1164 -4278.163285627394 +1168 1164 -15161.67604489053 +1169 1164 113981.6219888599 +1170 1164 -15158.91305406653 +1159 1165 -12910.02130165774 +1160 1165 56825.21028272065 +1161 1165 -12907.49545870666 +1164 1165 -4279.641867081016 +1165 1165 1014156.955097577 +1166 1165 -4262.952417452703 +1169 1165 -15159.48228159052 +1170 1165 113984.2834883927 +1171 1165 -15155.70710376518 +247 1166 -12906.69201415097 +248 1166 -4258.82580198779 +249 1166 -15154.50483981023 +1160 1166 -12907.85741985871 +1161 1166 56827.73385917413 +1165 1166 -4264.523207153288 +1166 1166 1014162.724416729 +1170 1166 -15156.17192186293 +1171 1166 113986.7436615346 +14 1167 -5493.681033293491 +144 1167 -22832.22648884629 +145 1167 208701.544762364 +146 1167 -5493.044058695887 +277 1167 -14903.40742311545 +278 1167 -10750.26998410251 +1162 1167 104142.2315550394 +1163 1167 -14902.31796819232 +1167 1167 1264185.984615152 +1168 1167 -10747.81359158124 +1402 1167 -21155.00027625572 +1403 1167 -120685.7585740813 +145 1168 -5493.185556412547 +146 1168 208697.6040399325 +147 1168 -5491.630532720443 +1162 1168 -14902.7068546647 +1163 1168 104143.3733331599 +1164 1168 -14900.40489670381 +1167 1168 -10748.20779317916 +1168 1168 1264158.288190572 +1169 1168 -10741.51257411936 +146 1169 -5491.841280764755 +147 1169 208693.0062689229 +148 1169 -5489.813334311875 +1163 1169 -14900.92665665566 +1164 1169 104145.1793479845 +1165 1169 -14898.25099248732 +1168 1169 -10742.19785975779 +1169 1169 1264125.760435712 +1170 1169 -10732.89711703463 +147 1170 -5490.192014455977 +148 1170 208692.3463842241 +149 1170 -5486.200357911213 +1164 1170 -14898.81726303633 +1165 1170 104148.158853622 +1166 1170 -14895.22446378829 +1169 1170 -10734.61973922055 +1170 1170 1264118.063389589 +1171 1170 -10713.33850704242 +15 1171 -5485.117185221552 +148 1171 -5486.574317289596 +149 1171 208693.3468583092 +157 1171 -22829.53093347305 +248 1171 -14894.07842529197 +249 1171 -10707.9241240809 +1165 1171 -14895.68299341642 +1166 1171 104150.8011296602 +1170 1171 -10715.19404844831 +1171 1171 1264122.061593973 +6 1172 -1.585603532918249 +30 1172 -0.2810584735842984 +39 1172 -0.2810674513654184 +100 1172 -3.222448860084847 +101 1172 -8.990661653350488 +192 1172 -1.086138790669526 +193 1172 -1.648033869293271 +597 1172 -1.595323400054827 +598 1172 -0.5519735833416464 +749 1172 -1.595375675349862 +750 1172 -0.5519907250405622 +882 1172 -0.2954358987798407 +887 1172 -0.2957990741044684 +1172 1172 27.62963403815071 +1173 1172 -8.003943380723666 +1201 1172 1.64160555094713 +1202 1172 -2.987468593078113 +192 1173 -1.62780680258203 +193 1173 -1.879344095850701 +194 1173 -1.652937877415824 +882 1173 -0.2915468145562002 +887 1173 -0.4520866842997686 +892 1173 -0.3003973420159636 +1172 1173 -8.017872757009615 +1173 1173 26.80555815650694 +1174 1173 -6.552630618003043 +1201 1173 -2.994858237339849 +1202 1173 0.531555644314411 +1203 1173 -2.617291364062261 +193 1174 -1.656454038803876 +194 1174 -2.604918173303977 +195 1174 -1.667707684893432 +887 1174 -0.3010819550984262 +892 1174 -0.5931395483016551 +897 1174 -0.3066089692108776 +1173 1174 -6.527719801841267 +1174 1174 25.66298669490973 +1175 1174 -5.417902158666028 +1202 1174 -2.634145548011568 +1203 1174 -0.5050532804890518 +1204 1174 -2.42404955425942 +194 1175 -1.652987349941827 +195 1175 -3.516277625605296 +196 1175 -1.750197465831109 +892 1175 -0.3035972937617705 +897 1175 -0.7723762863708774 +902 1175 -0.3258893579510992 +1174 1175 -5.439755348942457 +1175 1175 25.63444020890147 +1176 1175 -4.395069808056629 +1203 1175 -2.420083228714361 +1204 1175 -1.546515241672327 +1205 1175 -2.357178536186902 +195 1176 -1.72768487501157 +196 1176 -4.613844870662261 +197 1176 -1.885560189738018 +897 1176 -0.321318448622702 +902 1176 -0.9906466338826259 +907 1176 -0.3550261293623356 +1175 1176 -4.437702952673952 +1176 1176 26.60245356928851 +1177 1176 -3.536800887660196 +1204 1176 -2.343688022449208 +1205 1176 -2.660596603415616 +1206 1176 -2.387448107772356 +196 1177 -1.85137696594118 +197 1177 -5.956509863394928 +198 1177 -2.097703919741805 +902 1177 -0.3481093596889772 +907 1177 -1.25944504312907 +912 1177 -0.3994033175930629 +1176 1177 -3.607163263824046 +1177 1177 28.51703185189713 +1178 1177 -2.608010723326738 +1205 1177 -2.362420794031583 +1206 1177 -3.929580381859773 +1207 1177 -2.505556092059526 +197 1178 -2.044064747222519 +198 1178 -7.700720952761687 +199 1178 -2.414084133464703 +907 1178 -0.388564485134256 +912 1178 -1.610272731407393 +917 1178 -0.4641727016880144 +1177 1178 -2.722440848739684 +1178 1178 31.63432598838348 +1179 1178 -1.65101764595204 +1206 1178 -2.463033136041137 +1207 1178 -5.506262757227416 +1208 1178 -2.737335965062282 +198 1179 -2.328533212063568 +199 1179 -10.03075025502917 +200 1179 -2.893732496577035 +912 1179 -0.4468942031625455 +917 1179 -2.080729886487308 +922 1179 -0.5612866031153942 +1178 1179 -1.836323252716275 +1179 1179 36.43956213972247 +1180 1179 -0.5229772420368852 +1207 1179 -2.667254375723795 +1208 1179 -7.541231968248957 +1209 1179 -3.127572130943371 +199 1180 -2.752636174326212 +200 1180 -13.37582311199343 +201 1180 -3.641591524358519 +917 1180 -0.5327914155761132 +922 1180 -2.757662821884229 +927 1180 -0.7118554980180588 +1179 1180 -0.8306288086806068 +1180 1180 43.88116100793722 +1181 1180 0.9815993340182645 +1208 1180 -3.01034918678965 +1209 1180 -10.39821397879844 +1210 1180 -3.763181643758376 +200 1181 -3.403370798493359 +201 1181 -18.33589968977842 +202 1181 -4.815731601999819 +922 1181 -0.663739387343485 +927 1181 -3.762975706437309 +932 1181 -0.9472666151229312 +1180 1181 0.46146795213471 +1181 1181 55.4365111360934 +1182 1181 3.052338876420041 +1209 1181 -3.564716434367971 +1210 1181 -14.55868005806419 +1211 1181 -4.785021427960947 +201 1182 -4.400209577777829 +202 1182 -26.2923137213625 +203 1182 -6.811752729767301 +927 1182 -0.8633191557207383 +932 1182 -5.376489601528291 +937 1182 -1.34754931602734 +1181 1182 2.145659359898374 +1182 1182 74.25075912720034 +1183 1182 6.561444153098634 +1210 1182 -4.439344302065359 +1211 1182 -21.15580883169131 +1212 1182 -6.516044443347542 +202 1183 -6.065405078493944 +203 1183 -39.4227600790866 +204 1183 -10.16810342244037 +932 1183 -1.196717043872811 +937 1183 -8.0402046974777 +942 1183 -2.020070321522548 +1182 1183 4.936551647971257 +1183 1183 105.44735952871 +1184 1183 12.23514249057706 +1211 1183 -5.898196170351547 +1212 1183 -31.93063886207228 +1213 1183 -9.424600215617374 +203 1184 -8.786540338720599 +204 1184 -62.84649540058485 +205 1184 -16.43026284807211 +937 1184 -1.740755219860731 +942 1184 -12.79165946912971 +947 1184 -3.277543864601988 +1183 1184 9.234819246519956 +1184 1184 160.5522534707176 +1185 1184 23.39399505379937 +1212 1184 -8.287146996823775 +1213 1184 -51.02503515772764 +1214 1184 -14.77236903486767 +204 1185 -13.79440499064058 +205 1185 -105.2350839845731 +206 1185 -27.71013185888332 +942 1185 -2.744368016701043 +947 1185 -21.39111845592539 +952 1185 -5.544139756574312 +1184 1185 17.68318046138063 +1185 1185 259.3670112919587 +1186 1185 43.50437663303539 +1213 1185 -12.61344950361103 +1214 1185 -85.3786761530925 +1215 1185 -24.35296347082464 +205 1186 -22.58440000351185 +206 1186 -187.3094482439191 +207 1186 -50.25538796860888 +947 1186 -4.506637510605203 +952 1186 -38.04244255699413 +957 1186 -10.08621922008368 +1185 1186 32.41108042153204 +1186 1186 447.9941103727567 +1187 1186 86.00062098741144 +1214 1186 -20.1650408773851 +1215 1186 -151.8189258654455 +1216 1186 -43.35395894919004 +206 1187 -40.11960795242703 +207 1187 -344.5254994938482 +208 1187 -91.86224445791922 +952 1187 -8.032791778578403 +957 1187 -69.95254238423915 +962 1187 -18.48170370204178 +1186 1187 64.01195277045585 +1187 1187 806.6071113514315 +1188 1187 165.8576403120489 +1215 1187 -35.03085434176353 +1216 1187 -279.7742491093359 +1217 1187 -78.77226903988776 +207 1188 -72.30619962205591 +208 1188 -649.3767729107739 +209 1188 -171.710893644488 +957 1188 -14.51503657859852 +962 1188 -131.8714432349964 +967 1188 -34.63689127826645 +1187 1188 123.0723203233757 +1188 1188 1500.173888326177 +1189 1188 327.1451097037527 +1216 1188 -62.42187526457202 +1217 1188 -532.6380607888429 +1218 1188 -148.5773627189487 +208 1189 -135.8058799047291 +209 1189 -1203.18782797759 +210 1189 -303.2952869532493 +962 1189 -27.34223617994035 +967 1189 -244.4841807672204 +972 1189 -61.32390640735466 +1188 1189 246.8734697791367 +1189 1189 2774.331377122153 +1190 1189 605.5745197612076 +1217 1189 -117.1578894797632 +1218 1189 -1012.292955442516 +1219 1189 -271.2758313142016 +209 1190 -245.3812066451376 +210 1190 -2117.241393656378 +211 1190 -501.6609975866695 +967 1190 -49.53369146008969 +972 1190 -430.6214636498185 +977 1190 -101.6681713718502 +1189 1190 470.6353531380822 +1190 1190 4938.100859529084 +1191 1190 1057.355672803274 +1218 1190 -216.1304594798713 +1219 1190 -1866.971622766143 +1220 1190 -474.8146048314723 +210 1191 -424.0821653285699 +211 1191 -3396.639937340905 +212 1191 -738.684876546728 +972 1191 -85.83867517731439 +977 1191 -691.5570421541697 +982 1191 -149.9884554813125 +1190 1191 863.8570788514327 +1191 1191 8114.480680003784 +1192 1191 1642.378929870603 +1219 1191 -390.4944250519919 +1220 1191 -3200.274301705363 +1221 1191 -749.5566799972498 +211 1192 -657.2394450711313 +212 1192 -4899.970307848107 +213 1192 -992.6704157477491 +977 1192 -133.3352439637808 +982 1192 -998.5330447877848 +987 1192 -201.8518457106049 +1191 1192 1420.510330831556 +1192 1192 12062.30606240476 +1193 1192 2317.37886215459 +1220 1192 -645.6431249978959 +1221 1192 -4962.171835243375 +1222 1192 -1072.798267687512 +212 1193 -924.4339241637119 +213 1193 -6445.889270830578 +214 1193 -1233.958372423976 +982 1193 -187.8782586742106 +987 1193 -1314.352071656748 +992 1193 -251.1578237115117 +1192 1193 2113.929544876581 +1193 1193 16297.53703648118 +1194 1193 2987.663186937969 +1221 1193 -971.2977592526464 +1222 1193 -6938.477708966177 +1223 1193 -1394.370790770983 +213 1194 -1186.363448290866 +214 1194 -7924.288914731762 +215 1194 -1465.956929372139 +987 1194 -241.4025109712884 +992 1194 -1616.328019598825 +997 1194 -298.565302278594 +1193 1194 2835.348161575889 +1194 1194 20406.64264832914 +1195 1194 3637.390612469371 +1222 1194 -1315.031610155381 +1223 1194 -8894.213002581751 +1224 1194 -1699.79453366903 +214 1195 -1436.641754610425 +215 1195 -9378.14033686865 +216 1195 -1703.403001422195 +992 1195 -292.5540436171955 +997 1195 -1913.13300250746 +1002 1195 -347.0686892171335 +1194 1195 3539.339474547149 +1195 1195 24394.17736259958 +1196 1195 4292.98526746624 +1223 1195 -1647.460206264855 +1224 1195 -10786.4920172353 +1225 1195 -2000.048630338824 +215 1196 -1686.953909293951 +216 1196 -10830.8974007738 +217 1196 -1939.757177044054 +997 1196 -343.6950220211211 +1002 1196 -2209.577061077775 +1007 1196 -395.3315794321112 +1195 1196 4236.803569966682 +1196 1196 28297.31797031385 +1197 1196 4935.066330712309 +1224 1196 -1969.733673584312 +1225 1196 -12615.91876772718 +1226 1196 -2289.56687089114 +216 1197 -1931.145227402551 +217 1197 -12400.66642519326 +218 1197 -2219.719419092961 +1002 1197 -393.5651861773785 +1007 1197 -2529.797760221345 +1012 1197 -452.4801638703598 +1196 1197 4905.511195001788 +1197 1197 32441.60461950751 +1198 1197 5684.22943684005 +1225 1197 -2273.581654638478 +1226 1197 -14532.63966671449 +1227 1197 -2624.118784929959 +217 1198 -2215.412714918694 +218 1198 -14081.84365011241 +219 1198 -2495.600511494376 +1007 1198 -451.5968769752951 +1012 1198 -2872.694639712224 +1017 1198 -508.7842899935949 +1197 1198 5669.528036606803 +1198 1198 36838.91959076669 +1199 1198 6416.721052526414 +1226 1198 -2616.189830951114 +1227 1198 -16548.984977908 +1228 1198 -2951.036800357123 +218 1199 -2493.414249316431 +219 1199 -16001.58281633804 +220 1199 -2856.466981456697 +1012 1199 -508.3360027047559 +1017 1199 -3264.229286028702 +1022 1199 -582.4213812581781 +1198 1199 6409.356355317505 +1199 1199 41840.06774250378 +1200 1199 7369.349234688375 +1227 1199 -2947.092398794584 +1228 1199 -18830.32033789823 +1229 1199 -3376.556638999678 +13 1200 -3188.306091466472 +137 1200 8308.044822899694 +138 1200 -3758.378628557428 +158 1200 -650.3120480092302 +219 1200 -2855.233588531053 +220 1200 -18103.9245332703 +440 1200 -650.3225784289334 +1017 1200 -582.168573713668 +1022 1200 -3693.00259688202 +1199 1200 7365.260530118832 +1200 1200 47310.10142199756 +1228 1200 -3374.385496482967 +1229 1200 -21319.11907903539 +99 1201 -7.549361932673492 +100 1201 -21.62936888035977 +101 1201 -2.65097722060643 +597 1201 -0.4673903628682368 +598 1201 -3.786106011500855 +599 1201 -1.292789205042407 +749 1201 -0.4674024070711807 +750 1201 -3.786194387494141 +751 1201 -1.292814163795519 +1172 1201 0.755473932621439 +1173 1201 -2.530148120286142 +1201 1201 52.8251144959828 +1202 1201 -18.19280285991726 +1230 1201 8.203833539351885 +1231 1201 -6.161478055590603 +1172 1202 -2.538037140415646 +1173 1202 -0.08086257874956493 +1174 1202 -2.292707502956099 +1201 1202 -18.12118718341447 +1202 1202 45.92171064965906 +1203 1202 -14.08429623612304 +1230 1202 -6.20662158537216 +1231 1202 5.470768546407845 +1232 1202 -4.854469109289242 +1173 1203 -2.309548944273331 +1174 1203 -0.8885953572845809 +1175 1203 -2.170631004599648 +1202 1203 -14.0092276284027 +1203 1203 39.9863142305717 +1204 1203 -11.50456380670571 +1231 1203 -4.894008174594305 +1232 1203 3.30267764629397 +1233 1203 -4.140766261520698 +1174 1204 -2.167224252216812 +1175 1204 -1.783335545783434 +1176 1204 -2.144993313532979 +1203 1204 -11.49019679537525 +1204 1204 37.086928392857 +1205 1204 -9.558336997504973 +1232 1204 -4.154269757231221 +1233 1204 1.656299870352396 +1234 1204 -3.723840243195498 +1175 1205 -2.13230222468326 +1176 1205 -2.790432934323555 +1177 1205 -2.196726238392435 +1204 1205 -9.574273178579551 +1205 1205 36.15910978724752 +1206 1205 -8.157175487343542 +1233 1205 -3.723620195743936 +1234 1205 0.2082593475353871 +1235 1205 -3.529319294664921 +1176 1206 -2.172877661975771 +1177 1206 -3.97029589961166 +1178 1206 -2.325787130269832 +1205 1206 -8.204523139687423 +1206 1206 36.72433170330781 +1207 1206 -6.851188805800877 +1234 1206 -3.516236017275657 +1235 1206 -1.20707693685942 +1236 1206 -3.472494191746643 +1177 1207 -2.285085486535571 +1178 1207 -5.458772799625484 +1179 1207 -2.558730714631523 +1206 1207 -6.9421202685821 +1207 1207 38.76753159657435 +1208 1207 -5.697546117950908 +1235 1207 -3.442787272956095 +1236 1207 -2.787917773337565 +1237 1207 -3.569361371187476 +1178 1208 -2.491532839453356 +1179 1208 -7.39639187491203 +1180 1208 -2.94059094287968 +1207 1208 -5.854149032880787 +1208 1208 42.67249390635885 +1209 1208 -4.528952544582824 +1236 1208 -3.515603694234028 +1237 1208 -4.666859487618949 +1238 1208 -3.840587444236872 +1179 1209 -2.82810460505643 +1180 1209 -10.12922683728861 +1181 1209 -3.555860249378036 +1208 1209 -4.795729695500555 +1209 1209 49.22381773641732 +1210 1209 -3.159355106869306 +1237 1209 -3.747245796461938 +1238 1209 -7.161015451816171 +1239 1209 -4.350129024929458 +1180 1210 -3.365376520251737 +1181 1210 -14.11814599352608 +1182 1210 -4.539554791713486 +1209 1210 -3.613001376564805 +1210 1210 59.75166756284044 +1211 1210 -1.505571203509788 +1238 1210 -4.19075289516019 +1239 1210 -10.63524247603191 +1240 1210 -5.222374223016097 +1181 1211 -4.207782815493491 +1182 1211 -20.44912155501189 +1183 1211 -6.203023457164824 +1210 1211 -2.295052788392818 +1211 1211 77.01110240006082 +1212 1211 1.21566969122643 +1239 1211 -4.945383878323688 +1240 1211 -15.98228924047256 +1241 1211 -6.700225803417726 +1182 1212 -5.61013466756878 +1183 1212 -30.79136357463207 +1184 1212 -8.994067712131908 +1211 1212 -0.1885334717127547 +1212 1212 105.5117067407399 +1213 1212 5.36142267759234 +1240 1212 -6.210346719336475 +1241 1212 -24.48915493793471 +1242 1212 -9.18314036453879 +1183 1213 -7.902797632607529 +1184 1213 -49.11599671390362 +1185 1213 -14.12500246459665 +1212 1213 2.791705153182666 +1213 1213 155.1734743345399 +1214 1213 13.76909771006295 +1241 1213 -8.292839070481964 +1242 1213 -39.28592809133396 +1243 1213 -13.62421437966711 +1184 1214 -12.05417750117632 +1185 1214 -82.07680361789333 +1186 1214 -23.31259037106091 +1213 1214 8.923844474306652 +1214 1214 242.9964839022985 +1215 1214 28.68659711528434 +1242 1214 -11.95857140776548 +1243 1214 -65.43516539096957 +1244 1214 -21.45794261913603 +1185 1215 -19.29603206514015 +1186 1215 -145.8148679413342 +1187 1215 -41.5340435736515 +1214 1215 19.33971310920229 +1215 1215 408.1964901396453 +1216 1215 61.44441156315597 +1243 1215 -18.26667018121797 +1244 1215 -115.4305272337922 +1245 1215 -36.62530079744042 +1186 1216 -33.55019403667451 +1187 1216 -268.5963851114359 +1188 1216 -75.49497588361359 +1215 1216 42.90420787720207 +1216 1216 720.5206349563107 +1217 1216 123.8277345094273 +1244 1216 -30.31497253667312 +1245 1216 -211.2327139272177 +1246 1216 -64.81567527359815 +1187 1217 -59.80103244140746 +1188 1217 -511.4462206814969 +1189 1217 -142.4602522744186 +1216 1217 87.24456060689614 +1217 1217 1329.204781782928 +1218 1217 256.8177968102942 +1245 1217 -52.32004527985129 +1246 1217 -402.4096372417256 +1247 1217 -121.1724663584732 +1188 1218 -112.2509338062591 +1189 1218 -973.0258568619126 +1190 1218 -260.3067274707765 +1217 1218 185.1177729348742 +1218 1218 2488.549557401141 +1219 1218 504.3889989548999 +1246 1218 -96.20273083956226 +1247 1218 -779.2256719348344 +1248 1218 -226.5377313582295 +1189 1219 -207.1126178772834 +1190 1219 -1798.329683034288 +1191 1219 -456.319361921315 +1218 1219 372.8281927962438 +1219 1219 4612.791699822214 +1220 1219 959.2705186867402 +1247 1219 -178.7185463745097 +1248 1219 -1508.925827136188 +1249 1219 -422.5678901509779 +1190 1220 -374.5436156912554 +1191 1220 -3092.174934244409 +1192 1220 -721.9720301284784 +1219 1220 740.13332965444 +1220 1220 8141.455887193397 +1221 1220 1653.802679611349 +1248 1220 -336.6877112949102 +1249 1220 -2820.752200223864 +1250 1220 -739.8247732881557 +1191 1221 -620.4811889230456 +1192 1221 -4811.397380804269 +1193 1221 -1036.095604545627 +1220 1221 1345.219132205704 +1221 1221 13273.85691079959 +1222 1221 2600.545159499074 +1249 1221 -606.1924167735604 +1250 1221 -4918.310007166669 +1251 1221 -1193.764443248434 +1192 1222 -936.2250837370045 +1193 1222 -6748.23637750643 +1194 1222 -1350.045860245502 +1221 1222 2243.517214983547 +1222 1222 19666.81260725241 +1223 1222 3669.354993456046 +1250 1222 -1022.532530692394 +1251 1222 -7769.60346458522 +1252 1222 -1723.06392636249 +1193 1223 -1271.50892789603 +1194 1223 -8668.404429748307 +1195 1223 -1649.112596457064 +1222 1223 3340.309016323265 +1223 1223 26489.49141073035 +1224 1223 4753.646259587314 +1251 1223 -1552.328154053134 +1252 1223 -10997.01611221586 +1253 1223 -2255.517549756054 +1194 1224 -1597.103843084482 +1195 1224 -10524.41992738922 +1196 1224 -1943.363854649041 +1223 1224 4508.115329241955 +1224 1224 33182.57294423509 +1225 1224 5819.468746996381 +1252 1224 -2121.830781258794 +1253 1224 -14231.38905174976 +1254 1224 -2759.526508588922 +1195 1225 -1913.177231664466 +1196 1225 -12315.12723219919 +1197 1225 -2226.975877243252 +1224 1225 5666.884288805367 +1225 1225 39464.42204823566 +1226 1225 6819.567984878205 +1253 1225 -2674.446033391492 +1254 1225 -17248.60065663574 +1255 1225 -3216.460140743017 +1196 1226 -2211.047967936794 +1197 1226 -14187.73851289779 +1198 1226 -2554.381500142634 +1225 1226 6736.908072605876 +1226 1226 45765.31428577215 +1227 1226 7934.086962488473 +1254 1226 -3169.983721275349 +1255 1226 -20216.59654083348 +1256 1226 -3711.307928053151 +1197 1227 -2546.482320754979 +1198 1227 -16155.64819058362 +1199 1227 -2874.086716078334 +1226 1227 7893.164864816202 +1227 1227 52204.2543088802 +1228 1227 9002.200411278056 +1255 1227 -3688.320425837266 +1256 1227 -23199.69300323728 +1257 1227 -4182.491829546382 +1198 1228 -2870.160133014268 +1199 1228 -18381.20912124888 +1200 1228 -3289.962948474337 +1227 1228 8982.330097010819 +1228 1228 59383.7662453036 +1229 1228 10372.54261418702 +1256 1228 -4171.421016078006 +1257 1228 -26489.06473576314 +1258 1228 -4786.084541994732 +137 1229 -3666.97236401088 +138 1229 11776.75035421096 +139 1229 -5304.989621072971 +1199 1229 -3287.803763872506 +1200 1229 -20808.86038563415 +1228 1229 10361.98863736304 +1229 1229 67175.1087892814 +1257 1229 -4780.277174831441 +1258 1229 -30038.82217713131 +98 1230 -20.38105772767436 +99 1230 -59.17162602490077 +100 1230 -5.690061144596775 +598 1230 -0.9961558690445661 +599 1230 -10.24555425606914 +600 1230 -3.474000930399052 +750 1230 -0.9961735983268097 +751 1230 -10.2456900982575 +752 1230 -3.474028606294895 +1201 1230 5.235529512889713 +1202 1230 -4.869720894601017 +1230 1230 123.1629780084403 +1231 1230 -45.2847890789148 +1259 1230 28.38068666945123 +1260 1230 -15.45399218934607 +1201 1231 -4.914616413653559 +1202 1231 3.494592604385906 +1203 1231 -3.964348417464945 +1230 1231 -45.07971653555235 +1231 1231 96.33880124146363 +1232 1231 -33.14700864007139 +1259 1231 -15.54733290736223 +1260 1231 19.8743524397631 +1261 1231 -11.3470483047113 +1202 1232 -4.003038005255746 +1203 1232 1.961795765924819 +1204 1232 -3.466680401723602 +1231 1232 -32.99006921558616 +1232 1232 77.11887010305163 +1233 1232 -26.15176120839006 +1260 1232 -11.4149903543946 +1261 1232 13.58555193379526 +1262 1232 -8.9942033110566 +1203 1233 -3.480450975176132 +1204 1233 0.7067668738019051 +1205 1233 -3.192055847132723 +1232 1233 -26.07207605097856 +1233 1233 66.24046170453909 +1234 1233 -21.2568855466044 +1261 1233 -9.033703839630906 +1262 1233 9.487385912084104 +1263 1233 -7.482326698215481 +1204 1234 -3.192546960714884 +1205 1234 -0.4684061642749315 +1206 1234 -3.081864603530555 +1233 1234 -21.22477187642065 +1234 1234 60.14443929362545 +1235 1234 -18.06327126249241 +1262 1234 -7.502627884782364 +1263 1234 6.496785309718267 +1264 1234 -6.60360959207847 +1205 1235 -3.069977989526163 +1206 1235 -1.683609782154617 +1207 1235 -3.080073275443609 +1234 1235 -18.07284018260101 +1235 1235 57.32280030273743 +1236 1235 -15.48690088604067 +1263 1235 -6.607758234954591 +1264 1235 4.126942720371562 +1265 1235 -6.057812145774715 +1206 1236 -3.05229742633683 +1207 1236 -3.096147581803472 +1208 1236 -3.207858441632751 +1235 1236 -15.5454150510127 +1236 1236 57.0061767932707 +1237 1236 -13.52350352561912 +1264 1236 -6.044183305832326 +1265 1236 1.950951793093658 +1266 1236 -5.817503456039447 +1207 1237 -3.157202493407737 +1208 1237 -4.818137429365398 +1209 1237 -3.491615761747598 +1236 1237 -13.64793937998269 +1237 1237 59.29051598281186 +1238 1237 -11.8691649861959 +1265 1237 -5.781237494880736 +1266 1237 -0.2216423309344822 +1267 1237 -5.84130705382533 +1208 1238 -3.403393022021574 +1209 1238 -7.139062194503005 +1210 1238 -3.995913513535442 +1237 1238 -12.09805375480688 +1238 1238 64.66560723283162 +1239 1238 -10.29516278868718 +1266 1238 -5.770337084299079 +1267 1238 -2.738223037550516 +1268 1238 -6.151689801495935 +1209 1239 -3.845152119581565 +1210 1239 -10.39790908691523 +1211 1239 -4.839658113726669 +1238 1239 -10.69296145241788 +1239 1239 74.29241995593583 +1240 1239 -8.834403408970791 +1267 1239 -6.02622168308922 +1268 1239 -5.884728185433532 +1269 1239 -6.859780126365854 +1210 1240 -4.57763372770361 +1211 1240 -15.43200752485062 +1212 1240 -6.257694609907407 +1239 1240 -9.52819242462289 +1240 1240 90.54614105790712 +1241 1240 -6.693933030666082 +1268 1240 -6.640357052481832 +1269 1240 -10.38303535187667 +1270 1240 -8.116275635587261 +1211 1241 -5.794553787444643 +1212 1241 -23.44842584293164 +1213 1241 -8.627585156511099 +1240 1241 -7.91332488578918 +1241 1241 117.3807022975056 +1242 1241 -3.972106688210075 +1269 1241 -7.733318371838582 +1270 1241 -17.12876990269432 +1271 1241 -10.28311639272454 +1212 1242 -7.786533541312874 +1213 1242 -37.38935723215214 +1214 1242 -12.85758474539682 +1241 1242 -6.167152768263486 +1242 1242 163.2094782957006 +1243 1242 1.848287158766416 +1270 1242 -9.600941680951042 +1271 1242 -28.39925764158052 +1272 1242 -14.01253770289257 +1213 1243 -11.28557068520298 +1214 1243 -62.00360739845446 +1215 1243 -20.30490857223358 +1242 1243 -2.207860680410842 +1243 1243 242.2462320615924 +1244 1243 11.58825070745569 +1271 1243 -12.76917776495295 +1272 1243 -47.57851390385476 +1273 1243 -20.44622621720347 +1214 1244 -17.29577224225525 +1215 1244 -109.0307117531621 +1216 1244 -34.69879956909585 +1243 1244 3.912467517130302 +1244 1244 386.5155384071102 +1245 1244 34.53683490996982 +1272 1244 -18.12630968749266 +1273 1244 -83.24450226522852 +1274 1244 -32.30125519717568 +1215 1245 -28.75271672829036 +1216 1245 -199.0996223295616 +1217 1245 -61.41631906370002 +1244 1245 19.52210235703119 +1245 1245 653.063815255521 +1246 1245 78.02128052740196 +1273 1245 -27.82161664924262 +1274 1245 -149.9202905441012 +1275 1245 -53.75827990527378 +1216 1246 -49.6448476352362 +1217 1246 -378.8952004877447 +1218 1246 -114.7494907663828 +1245 1246 48.49817447258392 +1246 1246 1165.829288499157 +1247 1246 176.2877064741374 +1274 1246 -45.03122933199764 +1275 1246 -281.093156980229 +1276 1246 -95.64813159017567 +1217 1247 -91.20552722551417 +1218 1247 -733.873404490439 +1219 1247 -214.434178035622 +1246 1247 117.1356191530202 +1247 1247 2155.224195970154 +1248 1247 370.1369977942015 +1275 1247 -78.14660594373802 +1276 1247 -540.8808813910102 +1277 1247 -175.0488651564304 +1218 1248 -169.221650188174 +1219 1248 -1423.874563897105 +1220 1248 -400.1116334990712 +1247 1248 254.7287864720925 +1248 1248 4063.752574248645 +1249 1248 769.8097498014509 +1276 1248 -140.2993702838586 +1277 1248 -1063.069981079116 +1278 1248 -331.2579659375906 +1219 1249 -318.4359293741778 +1220 1249 -2672.530090969657 +1221 1249 -701.7912942990589 +1248 1249 552.2858613102832 +1249 1249 7589.277305380103 +1250 1249 1487.941285824692 +1277 1249 -262.6722107024018 +1278 1249 -2090.086193189368 +1279 1249 -619.1209146289921 +1220 1250 -573.4750936205742 +1221 1250 -4687.83325186375 +1222 1250 -1136.339537911786 +1249 1250 1116.565644377861 +1250 1250 13617.0741254334 +1251 1250 2685.88289293355 +1278 1250 -492.1190551630829 +1279 1250 -4012.748963171392 +1280 1250 -1120.508950151288 +1221 1251 -969.7889873772981 +1222 1251 -7456.277400865412 +1223 1251 -1647.328639669339 +1250 1251 2132.772372632756 +1251 1251 22741.49987327488 +1252 1251 4350.89002009477 +1279 1251 -908.9931947847662 +1280 1251 -7262.006783809422 +1281 1251 -1862.175655881935 +1222 1252 -1478.998963054228 +1223 1252 -10617.34067241137 +1224 1252 -2165.4162638496 +1251 1252 3680.016310563326 +1252 1252 34455.42626079934 +1253 1252 6317.175351395776 +1280 1252 -1574.175461982776 +1281 1252 -11893.73001601877 +1282 1252 -2765.650258627236 +1223 1253 -2032.144970807681 +1224 1253 -13796.38945957114 +1225 1253 -2658.199960930427 +1252 1253 5677.781374522658 +1253 1253 47300.23259839847 +1254 1253 8348.566713372737 +1281 1253 -2465.458655791257 +1282 1253 -17351.34639288679 +1283 1253 -3680.71064496324 +1224 1254 -2572.791721061101 +1225 1254 -16757.35896783556 +1226 1254 -3105.54069673307 +1253 1254 7877.671437784335 +1254 1254 59520.87385969972 +1255 1254 10209.90495302178 +1282 1254 -3447.723440387398 +1283 1254 -22697.79559587802 +1284 1254 -4481.629718745938 +1225 1255 -3058.739175883059 +1226 1255 -19657.45606954286 +1227 1255 -3589.349495458924 +1254 1255 9931.985578451566 +1255 1255 71009.09227361089 +1256 1255 12141.75793385557 +1283 1255 -4340.879637822996 +1284 1255 -27690.01237400989 +1285 1255 -5262.476844004203 +1226 1256 -3566.191817587009 +1227 1256 -22562.41234292954 +1228 1256 -4049.372450580418 +1255 1256 12001.37631072866 +1256 1256 81961.18212304921 +1257 1256 13921.93050826133 +1284 1256 -5190.991700691899 +1285 1256 -32354.8081854892 +1286 1256 -5964.650433041632 +1227 1257 -4038.238775582638 +1228 1257 -25759.74960534341 +1229 1257 -4637.851185754071 +1256 1257 13855.86911516452 +1257 1257 93628.83567948273 +1258 1257 16139.89329319011 +1285 1257 -5931.253082631821 +1286 1257 -37231.10782253114 +1287 1257 -6829.654587093923 +138 1258 -5154.311814650809 +139 1258 18542.99785709699 +140 1258 -7508.232172190553 +1228 1258 -4632.028466924516 +1229 1258 -29207.89686482243 +1257 1258 16107.01786479465 +1258 1258 106044.598608996 +1286 1258 -6813.30831405418 +1287 1258 -42364.70421227146 +97 1259 -64.07945074817889 +98 1259 -174.5496140470276 +99 1259 -14.6000348604532 +599 1259 -2.532170493450496 +600 1259 -29.89681289130425 +601 1259 -10.85970825885223 +751 1259 -2.532193858322214 +752 1259 -29.8969103866391 +753 1259 -10.85967718230192 +1230 1259 18.55193969803375 +1231 1259 -11.16321318199736 +1259 1259 336.2588882135159 +1260 1259 -130.6026800740361 +1288 1259 100.6066280754343 +1289 1259 -47.9612953959882 +1230 1260 -11.25424451439821 +1231 1260 12.87144321093031 +1232 1260 -8.396235037878062 +1259 1260 -130.1877179007314 +1260 1260 251.159003858709 +1261 1260 -92.10942356763908 +1288 1260 -48.11848712244641 +1289 1260 71.25043146345662 +1290 1260 -33.66225210312238 +1231 1261 -8.463160682590186 +1232 1261 8.743618149738007 +1233 1261 -6.848621037280597 +1260 1261 -91.77778477717814 +1261 1261 188.3883518658079 +1262 1261 -69.39667359970991 +1289 1261 -33.7926323957253 +1290 1261 49.09917692071548 +1291 1261 -25.08468687893702 +1232 1262 -6.88805240539098 +1233 1262 6.009621794826779 +1234 1262 -5.86302639612992 +1261 1262 -69.18136945161456 +1262 1262 150.3049297998464 +1263 1262 -54.07557325050491 +1290 1262 -25.17261498581297 +1291 1262 35.09898558819391 +1292 1262 -19.46482630964729 +1233 1263 -5.883914279169624 +1234 1263 3.918056418926474 +1235 1263 -5.308724512765632 +1262 1263 -53.9391933606329 +1263 1263 126.6652572656628 +1264 1263 -44.42796756052515 +1291 1263 -19.52388825585443 +1292 1263 25.74558121637333 +1293 1263 -16.01540385121636 +1234 1264 -5.314082808049606 +1235 1264 2.160135248916246 +1236 1264 -4.985164208061442 +1263 1264 -44.35596525394011 +1264 1264 112.4686967076277 +1265 1264 -37.32430750220265 +1292 1264 -16.05129394349132 +1293 1264 19.26362898433997 +1294 1264 -13.68067056012678 +1235 1265 -4.973578287066941 +1236 1265 0.4389625791045784 +1237 1265 -4.888321981361146 +1264 1265 -37.31772625944254 +1265 1265 104.4574299289476 +1266 1265 -32.35721050316175 +1293 1265 -13.69402170996308 +1294 1265 14.2974553597952 +1295 1265 -12.23955278260668 +1236 1266 -4.855356036406751 +1237 1266 -1.376373109938266 +1238 1266 -5.003389818007991 +1265 1266 -32.42663084872322 +1266 1266 101.6738573770068 +1267 1266 -28.67308826805676 +1294 1266 -12.22818239978062 +1295 1266 10.28807757924435 +1296 1266 -11.42988640120877 +1237 1267 -4.937835919518497 +1238 1267 -3.572329205359468 +1239 1267 -5.365285158565361 +1266 1267 -28.85200488757929 +1267 1267 103.7241354181085 +1268 1267 -25.76870434888227 +1295 1267 -11.38443671983855 +1296 1267 6.58523880909252 +1297 1267 -11.14620045076916 +1238 1268 -5.248827678172714 +1239 1268 -6.394475493092367 +1240 1268 -6.082242601651091 +1267 1268 -26.11039101079145 +1268 1268 111.3769312830185 +1269 1268 -23.76706821001298 +1296 1268 -11.0522440225573 +1297 1268 2.850376749899937 +1298 1268 -11.47207187490332 +1239 1269 -5.878272994096921 +1240 1269 -10.49383481483344 +1241 1269 -7.309439364840564 +1268 1269 -24.381814014202 +1269 1269 126.4823040781733 +1270 1269 -21.59538536445899 +1297 1269 -11.29863190782105 +1298 1269 -1.637153900999478 +1299 1269 -12.40317964595502 +1240 1270 -6.953669579119124 +1241 1270 -16.68041248103374 +1242 1270 -9.38290368018599 +1269 1270 -22.67064397943513 +1270 1270 152.4850317384457 +1271 1270 -19.97035776847118 +1298 1270 -12.09951277139793 +1299 1270 -7.517974300479326 +1300 1270 -14.33415989354711 +1241 1271 -8.750013755837482 +1242 1271 -27.0365298265038 +1243 1271 -12.92845879398893 +1270 1271 -21.87248092167513 +1271 1271 196.4808516647012 +1272 1271 -16.27866381467718 +1299 1271 -13.80091908903294 +1300 1271 -16.52714770879948 +1301 1271 -17.6036592139907 +1242 1272 -11.77724612029603 +1243 1272 -44.63703122365615 +1244 1272 -19.01080759246777 +1271 1272 -19.69623605078302 +1272 1272 270.2930250013862 +1273 1272 -11.38974475197816 +1300 1272 -16.65941420378618 +1301 1272 -30.83493998961323 +1302 1272 -23.26540485951434 +1243 1273 -16.86738529821259 +1244 1273 -77.32225910993742 +1245 1273 -30.17344080746399 +1272 1273 -17.66548602258169 +1273 1273 399.5382722905898 +1274 1273 2.661544071549734 +1301 1273 -21.5599311118028 +1302 1273 -56.29242224506759 +1303 1273 -33.03825771423278 +1244 1274 -26.04325927892737 +1245 1274 -138.3136418027214 +1246 1274 -50.31334117704215 +1273 1274 -9.257236926832979 +1274 1274 628.9366893128735 +1275 1274 28.11434348343706 +1302 1274 -29.85655596739255 +1303 1274 -102.0099932009646 +1304 1274 -50.14979351578505 +1245 1275 -42.28097470387508 +1246 1275 -258.2183267231183 +1247 1275 -89.45872992373467 +1274 1275 5.229128454045942 +1275 1275 1054.312206807082 +1276 1275 91.28653625225893 +1303 1275 -44.13972478236816 +1304 1275 -189.3403288667179 +1305 1275 -81.82098648068239 +1246 1276 -73.36186174895543 +1247 1276 -495.8199972405403 +1248 1276 -163.4533492679416 +1275 1276 45.79313973852022 +1276 1276 1859.137420925021 +1277 1276 219.5866864429713 +1304 1276 -70.00519017802998 +1305 1276 -359.3211756435779 +1306 1276 -140.584498514137 +1247 1277 -131.4626711941255 +1248 1277 -974.7727592282711 +1249 1277 -308.6686582116288 +1276 1277 129.2154275783677 +1277 1277 3422.319279654149 +1278 1277 509.3955515948466 +1305 1277 -117.1573872325209 +1306 1277 -701.7535708866329 +1307 1277 -255.94489096973 +1248 1278 -245.2745143043152 +1249 1278 -1922.537982601803 +1250 1278 -576.5272582219709 +1277 1278 327.8118742684844 +1278 1278 6463.607871996447 +1279 1278 1095.588375737727 +1306 1278 -208.1473679314193 +1307 1278 -1399.528022981902 +1308 1278 -480.088947301315 +1249 1279 -458.1289983437404 +1250 1279 -3715.615001019413 +1251 1279 -1045.301162970612 +1278 1279 743.4731517636217 +1279 1279 12272.93584651895 +1280 1279 2266.578797879915 +1307 1279 -383.4943809654238 +1308 1279 -2824.763474161281 +1309 1279 -919.6085431157289 +1250 1280 -845.1941238662912 +1251 1280 -6792.316153214869 +1252 1280 -1745.538427739463 +1279 1280 1623.322755383565 +1280 1280 22734.17639160918 +1281 1280 4307.243358138145 +1308 1280 -728.9281840970226 +1309 1280 -5648.055569200681 +1310 1280 -1718.288262995993 +1251 1281 -1467.44636374832 +1252 1281 -11257.5256008702 +1253 1281 -2609.707833440514 +1280 1281 3283.6506441277 +1281 1281 39437.62664121869 +1282 1281 7358.031546091358 +1309 1281 -1378.748995817404 +1310 1281 -10725.02808380559 +1311 1281 -2979.901168908627 +1252 1282 -2313.237666439835 +1253 1282 -16600.44254938341 +1254 1282 -3496.044775663888 +1281 1282 6035.406076722292 +1282 1282 62041.31802218803 +1283 1282 11121.0582573059 +1310 1282 -2483.468811328537 +1311 1282 -18462.2056322276 +1312 1282 -4572.889288012744 +1253 1283 -3261.571587218346 +1254 1283 -21873.19513620666 +1255 1283 -4278.23666197256 +1282 1283 9838.326241687768 +1283 1283 86711.64094037667 +1284 1283 14836.12273678414 +1311 1283 -4042.238767095067 +1312 1283 -27657.84566890905 +1313 1283 -6108.714143876424 +1254 1284 -4134.956590333402 +1255 1284 -26780.83357907423 +1256 1284 -5042.026524240174 +1283 1284 13924.29127153573 +1284 1284 110071.5768774368 +1285 1284 18498.40396176968 +1312 1284 -5710.493586116311 +1313 1284 -36689.53636246119 +1314 1284 -7487.179766666872 +1255 1285 -4968.931531678569 +1256 1285 -31332.9912414889 +1257 1285 -5727.841685702422 +1284 1285 17997.62136539412 +1285 1285 130709.805843116 +1286 1285 21691.29798850606 +1313 1285 -7263.831051306084 +1314 1285 -44652.293506684 +1315 1285 -8615.898721242818 +1256 1286 -5693.728277202832 +1257 1286 -36063.26236984766 +1258 1286 -6570.333033848137 +1285 1286 21456.18182375533 +1286 1286 150918.5724373558 +1287 1286 25453.14366040089 +1314 1286 -8511.006438895312 +1315 1286 -52294.98258066546 +1316 1286 -9889.392731024553 +139 1287 -7260.908587231163 +140 1287 29860.34576149341 +141 1287 -10699.53949726143 +1257 1287 -6553.719518491662 +1258 1287 -41029.83737101441 +1286 1287 25343.50567143912 +1287 1287 171481.4428983173 +1315 1287 -9841.164310855504 +1316 1287 -59943.82020686209 +96 1288 -226.4920830809149 +97 1288 -601.77778563497 +98 1288 -41.62297522163142 +600 1288 -7.139497746100221 +601 1288 -102.1754572015696 +602 1288 -38.18393510524352 +752 1288 -7.139499930102959 +753 1288 -102.1746605970994 +754 1288 -38.18339448659749 +1259 1288 61.81819433228424 +1260 1288 -31.38116652202555 +1288 1288 1111.55482552382 +1289 1288 -448.9680663879074 +1317 1288 379.4304681069964 +1318 1288 -173.3180908923713 +1259 1289 -31.53624802943995 +1260 1289 43.7137191499901 +1261 1289 -22.45770538204861 +1288 1289 -448.1212188756629 +1289 1289 812.6831579743738 +1290 1289 -308.8051873294525 +1317 1289 -173.6033999330093 +1318 1289 275.875015665291 +1319 1289 -120.925976985647 +1260 1290 -22.58720467235514 +1261 1290 30.23860014302592 +1262 1290 -17.16115059219304 +1289 1290 -308.0470854087483 +1290 1290 582.0459401877378 +1291 1290 -223.281826954222 +1318 1290 -121.1883921924684 +1319 1290 191.5810277773766 +1320 1290 -87.22406057171261 +1261 1291 -17.24912855062088 +1262 1291 21.71051075276562 +1263 1291 -13.69537065611671 +1290 1291 -222.7388582839288 +1291 1291 436.9848614409629 +1292 1291 -166.2618187801378 +1319 1291 -87.41557126010946 +1320 1291 136.1743297964329 +1321 1291 -64.48923638030729 +1262 1292 -13.75522273267085 +1263 1292 15.91180515309054 +1264 1292 -11.5920305913584 +1291 1292 -165.8656066806668 +1292 1292 343.9247038236697 +1293 1292 -130.4755444131706 +1320 1292 -64.63228568917903 +1321 1292 99.36111019184986 +1322 1292 -50.10416813243108 +1263 1293 -11.62944456522116 +1264 1293 11.77975985561153 +1265 1293 -10.18721816504767 +1292 1293 -130.194944852793 +1293 1293 284.4271766170211 +1294 1293 -105.1839818032187 +1321 1293 -50.20931944573155 +1322 1293 74.75226527098764 +1323 1293 -40.14429899948072 +1264 1294 -10.20302878179541 +1265 1294 8.464161802836756 +1266 1294 -9.366282484293086 +1293 1294 -105.0099301924395 +1294 1294 245.6551414137633 +1295 1294 -88.02760791857766 +1322 1294 -40.2153189960458 +1323 1294 57.30865136929567 +1324 1294 -33.56279334241633 +1265 1295 -9.358721549178426 +1266 1295 5.635848314206341 +1267 1295 -8.980740750059505 +1294 1295 -87.96042992112193 +1295 1295 222.3003021926275 +1296 1295 -75.90726721942711 +1323 1295 -33.60100312924114 +1324 1295 44.79256300137752 +1325 1295 -29.18756556963775 +1266 1296 -8.941308708636653 +1267 1296 2.842749224995643 +1268 1296 -8.987233679666854 +1295 1296 -75.97620458907387 +1296 1296 210.5060392539139 +1297 1296 -67.07634207390815 +1324 1296 -29.18574445624341 +1325 1296 35.13198203398261 +1326 1296 -26.38586753021853 +1267 1297 -8.902952145505694 +1268 1297 -0.1491891152130371 +1269 1297 -9.48142777959278 +1296 1297 -67.32317294142611 +1297 1297 209.4401100449209 +1298 1297 -61.48446547850924 +1325 1297 -26.33441248441179 +1326 1297 27.3839520891026 +1327 1297 -25.0806019580913 +1268 1298 -9.324079274601054 +1269 1298 -3.932959677801902 +1270 1298 -10.506498408562 +1297 1298 -62.01060260407601 +1298 1298 219.5189279505115 +1299 1298 -56.89932228895027 +1326 1298 -24.95348698911724 +1327 1298 20.30163239827424 +1328 1298 -24.81154209266822 +1269 1299 -10.23029880393093 +1270 1299 -9.041946857846625 +1271 1299 -12.41681496714851 +1298 1299 -57.86043410469786 +1299 1299 243.4158415749005 +1300 1299 -55.03473862422268 +1327 1299 -24.57100876860896 +1328 1299 13.19915984826303 +1329 1299 -26.13394600409338 +1270 1300 -11.9319265947298 +1271 1300 -16.9990795497284 +1272 1300 -15.57360376060635 +1299 1300 -56.74441360742649 +1300 1300 286.9928010424286 +1301 1300 -52.11029556294352 +1328 1300 -25.7020351363891 +1329 1300 4.429371599999682 +1330 1300 -28.84698614387671 +1271 1301 -14.71707361921739 +1272 1301 -29.68582564769399 +1273 1301 -20.93192896773895 +1300 1301 -55.11731685439768 +1301 1301 360.4617937983876 +1302 1301 -51.36900524840794 +1329 1301 -28.09253895041095 +1330 1301 -7.445919339575722 +1331 1301 -34.27664142628376 +1272 1302 -19.38960364543164 +1273 1302 -52.27644638361285 +1274 1302 -30.11650180554538 +1301 1302 -56.73140680073006 +1302 1302 485.0553401039515 +1303 1302 -44.37899313711009 +1330 1302 -32.94726502145552 +1331 1302 -26.74907362537435 +1332 1302 -43.16415053297392 +1273 1303 -27.24934630732022 +1274 1303 -92.74103726815039 +1275 1303 -46.08746461141037 +1302 1303 -54.21111819618305 +1303 1303 697.0600145821099 +1304 1303 -34.43033471099277 +1331 1303 -40.76626418501411 +1332 1303 -59.22406363230502 +1333 1303 -58.66316554155564 +1274 1304 -40.68975312893035 +1275 1304 -169.9190750079529 +1276 1304 -75.43899433996785 +1303 1304 -52.68405898393388 +1304 1304 1071.96271168021 +1305 1304 -0.1342527751300011 +1332 1304 -54.28603026079774 +1333 1304 -118.7467708242251 +1334 1304 -85.46792589143152 +1275 1305 -64.85503321799521 +1276 1305 -320.0151833310334 +1277 1305 -129.6053259768459 +1304 1305 -35.49969564513226 +1305 1305 1753.572613553554 +1306 1305 70.83217804658912 +1333 1305 -77.11487606398622 +1334 1305 -231.4417712322885 +1335 1305 -133.5607700006184 +1276 1306 -108.6490286303615 +1277 1306 -622.827393503339 +1278 1306 -235.2313283649407 +1305 1306 1.379504861049121 +1306 1306 3043.591577859559 +1307 1306 251.4879000280114 +1334 1306 -117.3351017078192 +1335 1306 -455.2631869706872 +1336 1306 -224.2058043343835 +1277 1307 -192.4309005273383 +1278 1307 -1242.522211913313 +1279 1307 -439.730401981227 +1306 1307 109.7886576864702 +1307 1307 5558.712200683248 +1308 1307 647.5747530580575 +1335 1307 -191.1856666525987 +1336 1307 -913.3412425692932 +1337 1307 -399.801745518727 +1278 1308 -352.8168702265061 +1279 1308 -2519.332494850453 +1280 1308 -840.3434804551107 +1307 1308 356.8018505264182 +1308 1308 10580.11289112193 +1309 1308 1556.372700231261 +1336 1308 -331.2933100994628 +1337 1308 -1880.583756486554 +1338 1308 -755.7886657979777 +1279 1309 -666.8718027406378 +1280 1309 -5086.653717798636 +1281 1309 -1572.240885112711 +1308 1309 957.5539199412113 +1309 1309 20617.65574467916 +1310 1309 3464.783981885371 +1337 1309 -609.8778101254242 +1338 1309 -3958.989274272616 +1339 1309 -1475.284643170325 +1280 1310 -1257.135393011992 +1281 1310 -9807.590657533221 +1282 1310 -2742.861860390566 +1309 1310 2299.917268040028 +1310 1310 39716.46830933131 +1311 1310 7100.743076249939 +1338 1310 -1171.706409672582 +1339 1310 -8316.052701315213 +1340 1310 -2859.59862064768 +1281 1311 -2268.30706513558 +1282 1311 -17201.84654398197 +1283 1311 -4247.814652671803 +1310 1311 5105.988944271689 +1311 1311 72230.99532349381 +1312 1311 12903.36157372313 +1339 1311 -2281.858410036929 +1340 1311 -16722.74261735995 +1341 1311 -5143.315312375664 +1282 1312 -3722.855937201127 +1283 1312 -26213.0696490747 +1284 1312 -5725.853678113423 +1311 1312 10225.59015906247 +1312 1312 117022.8616514822 +1313 1312 19940.20415211002 +1340 1312 -4266.770911097059 +1341 1312 -29860.13757259147 +1342 1312 -7963.034597158656 +1283 1313 -5320.39374106529 +1284 1313 -35162.62663585179 +1285 1313 -7069.201158204225 +1312 1313 17393.28092907743 +1313 1313 165925.5227755716 +1314 1313 27273.18090922149 +1341 1313 -7045.434174251572 +1342 1313 -45619.11257344288 +1343 1313 -10654.77829375069 +1284 1314 -6837.998413613976 +1285 1314 -43012.1891533711 +1286 1314 -8173.585985106605 +1313 1314 25590.98675032555 +1314 1314 209194.0531943234 +1315 1314 33493.96508448624 +1342 1314 -10018.15256453164 +1343 1314 -60187.62514262785 +1344 1314 -12710.65922332492 +1285 1315 -8064.517859951073 +1286 1315 -50450.62733545103 +1287 1315 -9416.085008179158 +1314 1315 32652.91880336015 +1315 1315 247567.6593696116 +1316 1315 40262.34296973307 +1343 1315 -12387.70164592838 +1344 1315 -73165.31407321199 +1345 1315 -14698.86819747794 +140 1316 -10293.22800871807 +141 1316 49042.07885001791 +142 1316 -15421.71528904931 +1286 1316 -9366.162704627222 +1287 1316 -57833.55726520369 +1315 1316 39882.55633836811 +1316 1316 283500.3961315877 +1344 1316 -14553.87872710553 +1345 1316 -85169.06841792312 +95 1317 -749.0314268945947 +96 1317 -2147.883769853843 +97 1317 -143.2962571237501 +601 1317 -24.35572635323518 +602 1317 -362.3085464334218 +603 1317 -125.7583304159634 +753 1317 -24.35547423205645 +754 1317 -362.3023773582299 +755 1317 -125.7555283515307 +1288 1317 230.8121839067775 +1289 1317 -107.5718396219885 +1317 1317 3959.033095118881 +1318 1317 -1685.135094237678 +1346 1317 1342.881054355312 +1347 1317 -630.7416283104465 +1288 1318 -107.8469956044457 +1289 1318 164.0328601198761 +1290 1318 -74.6232188747735 +1317 1318 -1683.736618213292 +1318 1318 2994.180016095745 +1319 1318 -1189.903251341514 +1346 1318 -631.1136928964986 +1347 1318 1069.147070489895 +1348 1318 -473.8555829147944 +1289 1319 -74.88298132122497 +1290 1319 112.5595403247436 +1291 1319 -54.31675627670562 +1318 1319 -1188.287781252418 +1319 1319 2152.339160845451 +1320 1319 -853.4050183038185 +1347 1319 -474.3296916580634 +1348 1319 791.3560581650565 +1349 1319 -350.0665667577761 +1290 1320 -54.5087946242361 +1291 1320 79.87525902973402 +1292 1320 -40.87451275848149 +1319 1320 -852.0976138009348 +1320 1320 1573.964892237477 +1321 1320 -619.1116936914408 +1348 1320 -350.4629439544951 +1349 1320 576.8819548325704 +1350 1320 -257.017790035181 +1291 1321 -41.01960508759687 +1292 1321 58.41176064463835 +1293 1321 -32.48146610571931 +1320 1321 -618.0537659032751 +1321 1321 1184.466501556952 +1322 1321 -468.019388209418 +1349 1321 -257.3452323002476 +1350 1321 422.5084002602126 +1351 1321 -194.2569656224564 +1292 1322 -32.58969689276068 +1293 1322 44.08159482963397 +1294 1322 -26.71706263586759 +1321 1322 -467.1737496158584 +1322 1322 925.5652930697745 +1323 1322 -361.4777347898073 +1350 1322 -194.5237346582514 +1351 1322 315.2983158841723 +1352 1322 -149.1471310201154 +1293 1323 -26.79221155442673 +1294 1323 33.79547759435449 +1295 1323 -22.97583728712706 +1322 1323 -360.829361337811 +1323 1323 748.8067359068057 +1324 1323 -289.1982330975595 +1351 1323 -149.3570352946727 +1352 1323 239.0257719495105 +1353 1323 -118.245214438373 +1294 1324 -23.01959304026235 +1295 1324 26.260274172656 +1296 1324 -20.57939556580178 +1323 1324 -288.7320657355991 +1324 1324 631.2275907806929 +1325 1324 -238.5976597461279 +1352 1324 -118.4034673732768 +1353 1324 185.4734393422734 +1354 1324 -96.72863896167026 +1295 1325 -20.58536037263671 +1296 1325 20.20602338457412 +1297 1325 -19.18109189848716 +1324 1325 -238.3416763870019 +1325 1325 554.1436307378835 +1326 1325 -202.3650898235873 +1353 1325 -96.82876045437149 +1354 1325 146.5979115692798 +1355 1325 -81.68685481434613 +1296 1326 -19.14109324992922 +1297 1326 15.10160382691799 +1298 1326 -18.7995386977796 +1325 1326 -202.344686276994 +1326 1326 509.1601859656946 +1327 1326 -178.6731635512617 +1354 1326 -81.72475892844588 +1355 1326 118.3711334752102 +1356 1326 -72.15210286780939 +1297 1327 -18.69018711496926 +1298 1327 10.08515076339018 +1299 1327 -19.19735428588683 +1326 1327 -178.9921114021487 +1327 1327 490.534742445419 +1328 1327 -160.6533604322004 +1355 1327 -72.10300089994442 +1356 1327 96.78098861223806 +1357 1327 -65.80524588864591 +1298 1328 -18.98550289069257 +1299 1328 4.704046117848397 +1300 1328 -20.8477236262357 +1327 1328 -161.4421328925119 +1328 1328 497.8088490423673 +1329 1328 -151.9280324390326 +1356 1328 -65.64099928134254 +1357 1328 79.86113868109474 +1358 1328 -63.61641079309584 +1299 1329 -20.46397295822781 +1300 1329 -2.374505233846584 +1301 1329 -23.73544958024838 +1328 1329 -153.4856488747983 +1329 1329 534.1582114243553 +1330 1329 -144.2018305296536 +1357 1329 -63.26738508318603 +1358 1329 64.84376838439641 +1359 1329 -63.70403558429702 +1300 1330 -23.06469408823411 +1301 1330 -12.28818719665409 +1302 1330 -28.98693982963133 +1329 1330 -146.9954352083442 +1330 1330 608.3005939179322 +1331 1330 -145.3410031182896 +1358 1330 -63.06721570571544 +1359 1330 50.26492420797156 +1360 1330 -68.50591998635942 +1301 1331 -27.80721369931481 +1302 1331 -28.71979069586963 +1303 1331 -37.43666359257001 +1330 1331 -150.2913057914979 +1331 1331 738.8762661405701 +1332 1331 -142.3755285168386 +1359 1331 -67.37475399138461 +1360 1331 32.06073933228785 +1361 1331 -76.9244809716223 +1302 1332 -35.31691592796579 +1303 1332 -56.46232579365285 +1304 1332 -51.86763848650025 +1331 1332 -151.226178614582 +1332 1332 958.3828795100746 +1333 1332 -146.8096591475858 +1360 1332 -74.91767196509907 +1361 1332 6.30915715691108 +1362 1332 -93.54689098729099 +1303 1333 -48.01492368072843 +1304 1333 -107.3518986387957 +1305 1333 -76.61339075590155 +1332 1333 -162.7504434148586 +1333 1333 1332.91397038337 +1334 1333 -136.5433992418336 +1361 1333 -89.97255518025696 +1362 1333 -36.71545227069365 +1363 1333 -120.8100868323208 +1304 1334 -69.29176507136538 +1305 1334 -203.5666720970849 +1306 1334 -120.6373882302909 +1333 1334 -166.5198139855518 +1334 1334 1985.697053071185 +1335 1334 -114.8922685172963 +1362 1334 -114.1716372624291 +1363 1334 -114.784938205185 +1364 1334 -169.1203998087539 +1305 1335 -106.4638355884268 +1306 1335 -394.7128135309238 +1307 1335 -202.8808034163913 +1334 1335 -172.3592176461114 +1335 1335 3172.736736509979 +1336 1335 -25.58377594240524 +1363 1335 -156.5411678780667 +1364 1335 -267.0531129020699 +1365 1335 -255.1576296785147 +1306 1336 -174.0894368700475 +1307 1336 -786.7862969949122 +1308 1336 -361.1016855558461 +1335 1336 -141.5273105120561 +1336 1336 5425.095322260178 +1337 1336 193.8592220124293 +1364 1336 -229.9935906184086 +1365 1336 -578.076634336029 +1366 1336 -417.1695091959722 +1307 1337 -301.3228034207219 +1308 1337 -1619.461893222096 +1309 1337 -679.798469978371 +1336 1337 -46.46799846446208 +1337 1337 9900.46150063707 +1338 1337 784.3104296668881 +1365 1337 -365.160235965321 +1366 1337 -1243.319348800889 +1367 1337 -738.4784538653058 +1308 1338 -551.8148468540669 +1309 1338 -3428.983639186124 +1310 1338 -1322.672598001252 +1337 1338 265.8037755297134 +1338 1338 19148.35400147499 +1339 1338 2221.005250161562 +1366 1338 -625.4469975698415 +1367 1338 -2727.435461440176 +1368 1338 -1402.08761271123 +1309 1339 -1052.944376091352 +1310 1339 -7297.39078186929 +1311 1339 -2565.433484323088 +1338 1339 1099.952023723869 +1339 1339 38449.01851566038 +1340 1339 5567.201172544497 +1367 1339 -1151.434630824182 +1368 1339 -6093.606642711897 +1369 1339 -2793.701507858308 +1310 1340 -2039.05989743919 +1311 1340 -14991.02839838073 +1312 1340 -4644.64047815557 +1339 1340 3242.782040301398 +1340 1340 77293.29858424451 +1341 1340 12461.86115761684 +1368 1340 -2244.42796809022 +1369 1340 -13638.914133939 +1370 1340 -5543.074864962335 +1311 1341 -3813.726325160059 +1312 1341 -27485.37307236128 +1313 1341 -7268.257746123762 +1340 1341 8322.606612414684 +1341 1341 144789.4759969369 +1342 1341 23427.55072907406 +1369 1341 -4470.398034828577 +1370 1341 -28527.19514230952 +1371 1341 -9962.710910336558 +1312 1342 -6356.708910703322 +1313 1342 -42987.92718584406 +1314 1342 -9834.293752357727 +1341 1342 17964.90751110853 +1342 1342 237386.4458431721 +1343 1342 37218.48586371104 +1370 1342 -8384.996859072438 +1371 1342 -51819.82614740165 +1372 1342 -15151.35769390666 +1313 1343 -9177.457137936024 +1314 1343 -57515.27775329772 +1315 1343 -11831.33934746751 +1342 1343 32461.984768774 +1343 1343 330525.1861438418 +1344 1343 49751.48205453605 +1371 1343 -13662.86440471769 +1372 1343 -77584.27727600696 +1373 1343 -19338.45996429462 +1314 1344 -11491.79424613828 +1315 1344 -70296.62689571459 +1316 1344 -13776.85837072718 +1343 1344 46987.02929363437 +1344 1344 410250.2731256629 +1345 1344 62637.49323172301 +1372 1344 -18441.74275879193 +1373 1344 -100899.2733121082 +1374 1344 -22759.78183218283 +141 1345 -14749.69897014445 +142 1345 81752.33625962248 +143 1345 -22537.76119253916 +1315 1345 -13624.14467934402 +1316 1345 -81913.48396268592 +1344 1345 61352.80225205881 +1345 1345 477549.0955014098 +1373 1345 -22340.24076731114 +1374 1345 -120976.3881243907 +94 1346 -1990.656108628114 +95 1346 -6681.872579288047 +96 1346 -501.8607457980524 +602 1346 -84.7006671446473 +603 1346 -1121.97743225229 +604 1346 -333.2656879394099 +754 1346 -84.69910241691942 +755 1346 -1121.948486267328 +756 1346 -333.2551870853366 +1317 1346 866.1500082213581 +1318 1346 -399.9877387093022 +1346 1346 12822.62536960979 +1347 1346 -5906.319469362597 +1375 1346 3864.728963812736 +1376 1346 -1931.941636072875 +1317 1347 -400.3008847497531 +1318 1347 651.4238508525879 +1319 1347 -286.4550267113266 +1346 1347 -5905.676576289844 +1347 1347 10826.98869274594 +1348 1347 -4669.052114978546 +1375 1347 -1931.92859504452 +1376 1347 3575.489855146236 +1377 1347 -1708.267064258579 +1318 1348 -286.90044965168 +1319 1348 461.0016428489421 +1320 1348 -207.1043458608089 +1347 1348 -4666.793325386111 +1348 1348 8468.477473139548 +1349 1348 -3549.939315408667 +1376 1348 -1708.756911193066 +1377 1348 3050.962079797006 +1378 1348 -1408.377391854732 +1319 1349 -207.4916188644551 +1320 1349 328.0863569610622 +1321 1349 -151.3286921982173 +1348 1349 -3547.49222223638 +1349 1349 6424.430350120656 +1350 1349 -2633.282601538374 +1377 1349 -1408.984767052281 +1378 1349 2447.736924930605 +1379 1349 -1103.483611760472 +1320 1350 -151.6569950545519 +1321 1350 237.5230294103995 +1322 1350 -115.1076116932197 +1349 1350 -2630.881089591066 +1350 1350 4849.857872640216 +1351 1350 -1983.4017155086 +1378 1350 -1104.115867690356 +1379 1350 1899.702709652007 +1380 1350 -858.3075932015273 +1321 1351 -115.3805756059774 +1322 1351 176.6261966038183 +1323 1351 -89.68459385246939 +1350 1351 -1981.175221945181 +1351 1351 3709.603461424883 +1352 1351 -1499.541599469376 +1379 1351 -858.9119197392179 +1380 1351 1457.404501327813 +1381 1351 -659.2561146632088 +1322 1352 -89.90358518797488 +1323 1352 133.9801699134816 +1324 1352 -72.57495999636853 +1351 1352 -1497.595025481186 +1352 1352 2884.012570342459 +1353 1352 -1160.077401759187 +1380 1352 -659.79459132635 +1381 1352 1112.089896262784 +1382 1352 -512.0200915196012 +1323 1353 -72.74451220044135 +1324 1353 104.2358156586971 +1325 1353 -60.86961543822311 +1352 1353 -1158.428437392009 +1353 1353 2304.975052244719 +1354 1353 -918.3015497141251 +1381 1353 -512.4845048694392 +1382 1353 856.6076398158999 +1383 1353 -403.8545849975029 +1324 1354 -60.98341145543318 +1325 1354 82.50952662909285 +1326 1354 -52.89166496466919 +1353 1354 -917.0227956629514 +1354 1354 1898.040317999608 +1355 1354 -744.0565908147469 +1382 1354 -404.22518588753 +1383 1354 667.6532928744891 +1384 1354 -324.8261215639768 +1325 1355 -52.94686682084102 +1326 1355 66.54054661411409 +1327 1355 -48.17909966487801 +1354 1355 -743.1576595445256 +1355 1355 1622.360905218057 +1356 1355 -626.1013872773987 +1383 1355 -325.1025291585297 +1384 1355 531.0143462513535 +1385 1355 -270.7521320027947 +1326 1356 -48.15323535302312 +1327 1356 53.90972985492046 +1328 1356 -45.43851912187137 +1355 1356 -625.7205246171882 +1356 1356 1443.573620261301 +1357 1356 -537.2529997465473 +1384 1356 -270.9021550227479 +1385 1356 430.900633349269 +1386 1356 -230.9801751543717 +1327 1357 -45.30779461032793 +1328 1357 43.57024200372487 +1329 1357 -45.44747661813987 +1356 1357 -537.4955565218761 +1357 1357 1344.721085849701 +1358 1357 -485.195080236533 +1385 1357 -230.984070579011 +1386 1357 358.3141644336702 +1387 1357 -207.6776727824227 +1328 1358 -45.14986713878237 +1329 1358 33.6185839264871 +1330 1358 -47.18892575439997 +1357 1358 -486.4048896140264 +1358 1358 1316.471609012457 +1359 1358 -443.5831437166804 +1386 1358 -207.4586281864262 +1387 1358 304.167818364152 +1388 1358 -191.695201185284 +1329 1359 -46.63545484813638 +1330 1359 23.15180753065301 +1331 1359 -52.52510283253092 +1358 1359 -446.2004050694204 +1359 1359 1361.228273674553 +1360 1359 -432.405989548056 +1387 1359 -191.1620920958163 +1388 1359 263.861553327704 +1389 1359 -189.4121740567054 +1330 1360 -51.53486067006278 +1331 1360 8.903852024359807 +1332 1360 -61.09035568075056 +1359 1360 -437.3859643205416 +1360 1360 1493.806774565062 +1361 1360 -420.9863336256725 +1388 1360 -188.3582707666835 +1389 1360 230.5794139066033 +1390 1360 -193.2158017828289 +1331 1361 -59.33348890530771 +1332 1361 -12.20025884749532 +1333 1361 -76.58434731195152 +1360 1361 -430.0082057488285 +1361 1361 1746.533136374099 +1362 1361 -439.6498661819522 +1389 1361 -191.2874396443026 +1390 1361 200.216070339598 +1391 1361 -213.5004979713339 +1332 1362 -73.46321494154083 +1333 1362 -48.32622926816579 +1334 1362 -101.6473247280942 +1361 1362 -455.7714808190777 +1362 1362 2189.090270463375 +1363 1362 -453.2386706594614 +1390 1362 -210.0528398882291 +1391 1362 165.0366868290075 +1392 1362 -247.9183344895338 +1333 1363 -95.87332108916831 +1334 1363 -114.219749791139 +1335 1363 -145.2658874033023 +1362 1363 -482.996839588268 +1363 1363 2947.991650038305 +1364 1363 -489.3203122155397 +1391 1363 -241.5827886822688 +1392 1363 111.2978247767987 +1393 1363 -313.1982780707871 +1334 1364 -134.3706995399108 +1335 1364 -242.8244292078491 +1336 1364 -222.3982153427025 +1363 1364 -545.1586072900355 +1364 1364 4285.374088182785 +1365 1364 -495.3408809089081 +1392 1364 -301.3864654737075 +1393 1364 11.10012981366245 +1394 1364 -424.5204595792578 +1335 1365 -200.6830450694412 +1336 1365 -505.3157476477547 +1337 1365 -366.569422226497 +1364 1365 -605.9163296983961 +1365 1365 6737.332335534669 +1366 1365 -458.0057818606791 +1393 1365 -401.2863254107546 +1394 1365 -197.8699609137888 +1395 1365 -629.3237070104816 +1336 1366 -321.793960904776 +1337 1366 -1067.585938347474 +1338 1366 -650.6303909255136 +1365 1366 -684.834263523369 +1366 1366 11476.09751061378 +1367 1366 -194.1030400840921 +1394 1366 -581.9161333537793 +1395 1366 -662.4262186368542 +1396 1366 -1017.174985083148 +1337 1367 -553.3045324085433 +1338 1367 -2328.925979789558 +1339 1367 -1234.247708211357 +1366 1367 -686.2657814927111 +1367 1367 21159.26117518476 +1368 1367 657.3149465215855 +1395 1367 -914.5363327245484 +1396 1367 -1751.438765907015 +1397 1367 -1798.07334352628 +1338 1368 -1017.353689547175 +1339 1368 -5225.242214046803 +1340 1368 -2455.244468724049 +1367 1368 -445.7539178079845 +1368 1368 41815.13527874109 +1369 1368 3145.417523927224 +1396 1368 -1566.980807074379 +1397 1368 -4372.813027313789 +1398 1368 -3438.568647229883 +1339 1369 -1973.224948621116 +1340 1369 -11871.18352208897 +1341 1369 -4877.470497917333 +1368 1369 641.0013326457115 +1369 1369 86667.46334345563 +1370 1369 9627.740430483598 +1397 1369 -2904.487327794648 +1398 1369 -10831.32114778798 +1399 1369 -6879.638735859784 +1340 1370 -3907.903071499402 +1341 1370 -25485.30924701419 +1342 1370 -8823.893221394685 +1369 1370 4313.060791652819 +1370 1370 177337.0949508619 +1371 1370 22976.84493488722 +1398 1370 -5698.774215957848 +1399 1370 -25648.87028477646 +1400 1370 -13318.96601477135 +1341 1371 -7327.725620964072 +1342 1371 -47776.57595666069 +1343 1371 -13563.76164432557 +1370 1371 13850.59778114735 +1371 1371 330120.3949380334 +1372 1371 44566.29679146867 +1399 1371 -11146.14896121821 +1400 1371 -54518.9107779492 +1401 1371 -22501.35980677321 +1342 1372 -12073.24238801932 +1343 1372 -73353.40951988641 +1344 1372 -17497.75306682293 +1371 1372 33990.45869192605 +1372 1372 515298.1569196967 +1373 1372 67723.05037429056 +1400 1372 -19783.37890286419 +1401 1372 -94290.73925749456 +1402 1372 -31067.63472625048 +1343 1373 -16563.95226703407 +1344 1373 -96594.67017381605 +1345 1373 -20816.84764230215 +1372 1373 60152.58658612134 +1373 1373 683835.7180196156 +1374 1373 92418.81091437419 +1401 1373 -29019.40357164005 +1402 1373 -134781.7807628399 +1403 1373 -37468.90009116774 +142 1374 -21411.73910977483 +143 1374 137383.8897054782 +144 1374 -33348.80063864123 +1344 1374 -20372.97264352024 +1345 1374 -116188.2142619436 +1373 1374 88552.58432299508 +1374 1374 816891.6788603902 +1402 1374 -36399.79340046404 +1403 1374 -169459.079503912 +5 1375 -4120.792153306132 +59 1375 -688.6101347232924 +65 1375 -688.6362454045002 +94 1375 -16322.83169310347 +95 1375 -1498.016584247949 +250 1375 8511.476760988062 +251 1375 -4345.309062258626 +603 1375 -251.5869015669408 +604 1375 -2732.717004973548 +755 1375 -251.5799498519606 +756 1375 -2732.625010197122 +1027 1375 1405.508261340064 +1032 1375 -726.8583005361488 +1346 1375 2804.710905512184 +1347 1375 -1359.816087620918 +1375 1375 33093.07732053601 +1376 1375 -16424.70961522983 +250 1376 -4346.305604184966 +251 1376 8781.148766219152 +252 1376 -4368.591856719406 +1027 1376 -726.7694115798888 +1032 1376 1445.801749464744 +1037 1376 -731.4683290599222 +1346 1376 -1359.668109967757 +1347 1376 2403.017825618639 +1348 1376 -1104.748307475056 +1375 1376 -16427.60870310593 +1376 1376 32210.87174954408 +1377 1376 -15354.23053611968 +251 1377 -4369.462713149031 +252 1377 8525.878013441468 +253 1377 -4066.050086047124 +1032 1377 -731.4866712680256 +1037 1377 1399.11805757673 +1042 1377 -681.5789363844501 +1347 1377 -1105.093968929068 +1348 1377 1895.065773856175 +1349 1377 -854.742340200597 +1376 1377 -15354.08176970959 +1377 1377 29164.97058384685 +1378 1377 -13321.2652341101 +252 1378 -4066.786160634473 +253 1378 7707.801276691598 +254 1378 -3526.454293504113 +1037 1378 -681.6654678944977 +1042 1378 1259.413359157027 +1047 1378 -592.1062932621886 +1348 1378 -855.2492755135031 +1349 1378 1432.089923274729 +1350 1378 -641.7106877898293 +1377 1378 -13319.55105488715 +1378 1378 24711.69465557738 +1379 1378 -10866.26047031501 +253 1379 -3526.854376083664 +254 1379 6614.426611054776 +255 1379 -2951.392572221988 +1042 1379 -592.2426588311168 +1047 1379 1074.723823576113 +1052 1379 -496.5024421540464 +1349 1379 -642.2876308300415 +1350 1379 1065.600839528983 +1351 1379 -487.1509207966811 +1378 1379 -10863.26041552241 +1379 1379 20087.3650901771 +1380 1379 -8678.419389158644 +254 1380 -2951.246475781573 +255 1380 5467.523045114248 +256 1380 -2364.420306958871 +1047 1380 -496.6584613086884 +1052 1380 882.2045122816519 +1057 1380 -398.8180593329176 +1350 1380 -487.7370790415486 +1351 1380 796.1019292351548 +1352 1380 -370.7347686850104 +1379 1380 -8674.452864643221 +1380 1380 15968.99628900063 +1381 1380 -6743.158541282328 +255 1381 -2363.779202084364 +256 1381 4388.150160691643 +257 1381 -1862.932031996895 +1052 1381 -398.9642415419555 +1057 1381 701.6566564298201 +1062 1381 -315.2749533347197 +1351 1381 -371.2787392902186 +1352 1381 598.34894988691 +1353 1381 -288.5408125156016 +1380 1381 -6738.819380621813 +1381 1381 12520.88513227455 +1382 1381 -5230.226146489327 +256 1382 -1861.895022721767 +257 1382 3483.551746320762 +258 1382 -1456.115487189091 +1057 1382 -315.3979329652096 +1062 1382 550.7348130789799 +1067 1382 -247.4954325742364 +1352 1382 -289.0255790790807 +1353 1382 457.7153569936049 +1354 1382 -230.0646302437353 +1381 1382 -5225.853139364167 +1382 1382 9851.258677974358 +1383 1382 -4074.370020017584 +257 1383 -1454.895783215429 +258 1383 2760.731717206253 +259 1383 -1138.694251349701 +1062 1383 -247.5892533297549 +1067 1383 430.0714877413742 +1072 1383 -194.6605815131335 +1353 1383 -230.4640187587095 +1354 1383 356.0297661246567 +1355 1383 -188.3409555478536 +1382 1383 -4070.385628523898 +1383 1383 7833.148269735885 +1384 1383 -3205.716540096666 +258 1384 -1137.413456562828 +259 1384 2214.521932650406 +260 1384 -909.3826015810522 +1067 1384 -194.7280458408574 +1072 1384 338.6463223670866 +1077 1384 -156.5579626388208 +1354 1384 -188.6525177210098 +1355 1384 283.4423311574373 +1356 1384 -160.5949427206762 +1383 1384 -3202.247640350529 +1384 1384 6368.60484152664 +1385 1384 -2594.238106172269 +259 1385 -908.1970868102508 +260 1385 1811.404249992987 +261 1385 -733.1267899454067 +1072 1385 -156.5966240472053 +1077 1385 270.4065231100856 +1082 1385 -127.4783394712711 +1355 1385 -160.7860618062914 +1356 1385 230.2310256007119 +1357 1385 -140.8166094976293 +1384 1385 -2591.615350285415 +1385 1385 5325.137205155815 +1386 1385 -2129.38581003185 +260 1386 -732.0897903307221 +261 1386 1524.747432501586 +262 1386 -617.5207046349894 +1077 1386 -127.4887643599103 +1082 1386 220.8011153876626 +1087 1386 -108.615262103148 +1356 1386 -140.8706672435357 +1357 1386 191.4093254223983 +1358 1386 -130.4742900180997 +1385 1386 -2127.720406567661 +1386 1386 4615.968266193118 +1387 1386 -1832.087571235452 +261 1387 -616.7571830779347 +262 1387 1329.46363823456 +263 1387 -526.974612416285 +1082 1387 -108.5865122464971 +1087 1387 185.0319851173442 +1092 1387 -94.3056754444965 +1357 1387 -130.3200219328657 +1358 1387 161.4988538961829 +1359 1387 -124.5762934123503 +1386 1387 -1831.891098918607 +1387 1387 4171.484420293683 +1388 1387 -1598.106195030637 +262 1388 -526.5472813691057 +263 1388 1209.145668864332 +264 1388 -479.3884630478284 +1087 1388 -94.22585812305556 +1092 1388 160.0474419972883 +1097 1388 -87.41192515543958 +1358 1388 -124.1343277151533 +1359 1388 138.1440460676056 +1360 1388 -127.3617585246664 +1387 1388 -1599.844064874104 +1388 1388 3955.78134741846 +1389 1388 -1486.200348244769 +263 1389 -479.4887095834753 +264 1389 1154.324861901228 +265 1389 -442.1259254420592 +1092 1389 -87.24904305796005 +1097 1389 142.9699557727883 +1102 1389 -83.08050435399471 +1359 1389 -126.4458822296889 +1360 1389 116.5287409443181 +1361 1389 -134.8372398649144 +1388 1389 -1491.075247687274 +1389 1389 3959.612322835394 +1390 1389 -1395.403365500609 +264 1390 -443.0094742573204 +265 1390 1163.563535609058 +266 1390 -441.2233216524156 +1097 1390 -82.78177732696632 +1102 1390 132.2077351478441 +1107 1390 -85.60211444688574 +1360 1390 -133.1347517045303 +1361 1390 93.82257232301473 +1362 1390 -154.2614611847297 +1389 1390 -1405.336807019787 +1390 1390 4207.056055111008 +1391 1390 -1413.051982650384 +265 1391 -443.3946519029274 +266 1391 1250.004145213544 +267 1391 -451.6284305974141 +1102 1391 -85.07002445516454 +1107 1391 126.7719446227296 +1112 1391 -92.09900943069377 +1361 1391 -151.2003230130477 +1362 1391 63.22142164994532 +1363 1391 -185.5932306228543 +1390 1391 -1431.621322959518 +1391 1391 4785.410552239122 +1392 1391 -1451.559736657479 +266 1392 -456.0819728752894 +267 1392 1437.090908929384 +268 1392 -500.706761518029 +1107 1392 -91.12862504724815 +1112 1392 125.0068099196988 +1117 1392 -108.0151244590297 +1362 1392 -179.965841636248 +1363 1392 12.85041054666503 +1364 1392 -241.8579727556067 +1391 1392 -1486.216710992526 +1392 1392 5850.346259534384 +1393 1392 -1599.891232652482 +267 1393 -509.3188600624144 +268 1393 1783.535207255097 +269 1393 -576.7422138192468 +1112 1393 -106.2224910346149 +1117 1393 125.3091080824956 +1122 1393 -135.186293737847 +1363 1393 -231.3874109847976 +1364 1393 -82.60790236429472 +1365 1393 -337.3430536682374 +1392 1393 -1664.661627484752 +1393 1393 7745.555845412705 +1394 1393 -1788.87924628838 +268 1394 -593.6838517924315 +269 1394 2402.387284110608 +270 1394 -716.2992218119796 +1117 1394 -131.6946372771886 +1122 1394 123.0071091219878 +1127 1394 -185.5300052342794 +1364 1394 -316.8132656754182 +1365 1394 -278.8254038942522 +1366 1394 -511.7115480931993 +1393 1394 -1915.707435756406 +1394 1394 11154.52533571035 +1395 1394 -2099.155628079732 +269 1395 -750.4180261415206 +270 1395 3536.266588871 +271 1395 -929.6149039687566 +1122 1395 -178.4681546339367 +1127 1395 106.4025730127986 +1132 1395 -277.0538025787598 +1365 1395 -469.9572899681873 +1366 1395 -707.0549211759596 +1367 1395 -842.5013692212184 +1394 1395 -2356.26604200585 +1395 1395 17559.90010524484 +1396 1395 -2416.054835623295 +270 1396 -1002.122125216566 +271 1396 5708.550307489706 +272 1396 -1272.303726148354 +1127 1396 -261.8650551631525 +1132 1396 40.28030588127251 +1137 1396 -454.7311075012437 +1366 1396 -752.3425018748204 +1367 1396 -1695.606440805789 +1368 1396 -1509.107923673791 +1395 1396 -2969.206520991328 +1396 1396 30275.91708873699 +1397 1396 -2597.122136759472 +271 1397 -1433.740595311698 +272 1397 10105.77665376112 +273 1397 -1777.587995359392 +1132 1397 -420.5570665834023 +1137 1397 -170.3435154503527 +1142 1397 -814.477203679184 +1367 1397 -1306.247518933615 +1368 1397 -4057.671267482731 +1369 1397 -2911.994987664672 +1396 1397 -3840.102102193381 +1397 1397 56938.13974380976 +1398 1397 -1876.212138695439 +272 1398 -2154.190982650086 +273 1398 19418.74319625039 +274 1398 -2364.347374521262 +1137 1398 -734.5741024604386 +1142 1398 -807.1571509193441 +1147 1398 -1554.085226050537 +1368 1398 -2441.489847949545 +1369 1398 -9888.978482969886 +1370 1398 -5863.273526904715 +1397 1398 -4771.79493024427 +1398 1398 115158.9122370838 +1399 1398 2040.462642549348 +273 1399 -3246.171330132939 +274 1399 39096.1302834539 +275 1399 -2662.109579391326 +1142 1399 -1370.708174311476 +1147 1399 -2518.521038340963 +1152 1399 -2975.087605493083 +1369 1399 -4810.09505269757 +1370 1399 -23481.33901275746 +1371 1399 -11414.36733309485 +1398 1399 -4554.205786510249 +1399 1399 239051.8365156389 +1400 1399 13295.65739680634 +274 1400 -4544.036684415638 +275 1400 76924.74768335422 +276 1400 -1159.068815354429 +1147 1400 -2608.868653835838 +1152 1400 -6477.174567033355 +1157 1400 -5119.878323655421 +1370 1400 -9422.841724746067 +1371 1400 -50723.15158959618 +1372 1400 -19430.27479728065 +1399 1400 283.6260371219978 +1400 1400 470636.3000060149 +1401 1400 37964.56620468217 +275 1401 -4195.448845745272 +276 1401 133058.6149634433 +277 1401 2717.226131548818 +1152 1401 -4600.574083562555 +1157 1401 -12879.83466587442 +1162 1401 -7254.764815524186 +1371 1401 -16831.99260391614 +1372 1401 -89499.92796999638 +1373 1401 -27063.26711333493 +1400 1401 19678.42756093273 +1401 1401 790753.8684987611 +1402 1401 70853.73964139295 +276 1402 -328.2812526142479 +277 1402 192412.4025792032 +278 1402 9755.985293510283 +1157 1402 -6813.56519212948 +1162 1402 -20299.94289097679 +1167 1402 -8699.513588224623 +1372 1402 -25020.41614168039 +1373 1402 -129541.3458568312 +1374 1402 -33058.90989937773 +1401 1402 55195.87007814816 +1402 1402 1107301.554460272 +1403 1402 112330.8079777891 +14 1403 36619.04007032765 +143 1403 -31436.26991093335 +144 1403 219557.850237446 +145 1403 -6074.043364409892 +277 1403 7777.772933750122 +278 1403 239044.6305750009 +435 1403 -6074.825118514786 +1162 1403 -8452.458165050999 +1167 1403 -27100.28778276543 +1373 1403 -31961.44009223453 +1374 1403 -163364.093916067 +1402 1403 103357.8452660344 +1403 1403 1353577.932192015 +8 1404 -1.585876263230993 +34 1404 -0.2810948285437945 +40 1404 -0.2811122642553494 +92 1404 -3.223550116574585 +93 1404 -8.995252370351832 +163 1404 -1.084024645045635 +164 1404 -1.648261184576958 +629 1404 -1.596065345331649 +630 1404 -0.5521583798194681 +637 1404 -1.596184323797532 +638 1404 -0.5521983842389542 +886 1404 -0.2950640094586102 +891 1404 -0.2958269493958285 +1404 1404 27.63666632195449 +1405 1404 -8.008324920365943 +1433 1404 1.644780964697193 +1434 1404 -2.988424601601805 +163 1405 -1.628039824665728 +164 1405 -1.877056970644993 +165 1405 -1.653080391120862 +886 1405 -0.2915758419498903 +891 1405 -0.4516792737485222 +896 1405 -0.3004106204857611 +1404 1405 -8.022246989136644 +1405 1405 26.811395506841 +1406 1405 -6.556402241771629 +1433 1405 -2.995815063317618 +1434 1405 0.5344734754320687 +1435 1405 -2.617970159260632 +164 1406 -1.65660053310073 +165 1406 -2.602466850880969 +166 1406 -1.667760541101852 +891 1406 -0.3010959150370179 +896 1406 -0.5926982813315202 +901 1406 -0.3066067525376234 +1405 1406 -6.531476418007687 +1406 1406 25.66723620743169 +1407 1406 -5.421237053252596 +1434 1406 -2.634829767863859 +1435 1406 -0.5023519282303837 +1436 1406 -2.424536828283046 +165 1407 -1.653047881765118 +166 1407 -3.513586816904841 +167 1407 -1.750154859299948 +896 1407 -0.3035965237244485 +901 1407 -0.7718870176135449 +906 1407 -0.3258700570323642 +1406 1407 -5.443076097750768 +1407 1407 25.63738763499607 +1408 1407 -4.398158791854516 +1435 1407 -2.420576475143121 +1436 1407 -1.54384707857427 +1437 1407 -2.35751965234443 +166 1408 -1.727652714495022 +167 1408 -4.610807278616516 +168 1408 -1.885420667191193 +901 1408 -0.3213011282930673 +906 1408 -0.9900896224878126 +911 1408 -0.3549890869900563 +1407 1408 -4.440774621661476 +1408 1408 26.60427891161391 +1409 1408 -3.539776553520272 +1436 1408 -2.344037214953847 +1437 1408 -2.657809050348646 +1438 1408 -2.387670727346091 +167 1409 -1.851252373582111 +168 1409 -5.953002142681289 +169 1409 -2.0974438317206 +906 1409 -0.3480751568797861 +911 1409 -1.258797257248723 +916 1409 -0.3993438794593175 +1408 1409 -3.610115669656892 +1409 1409 28.5177470878361 +1410 1409 -2.610956895014994 +1437 1409 -2.362654846033589 +1438 1409 -3.926541245127627 +1439 1409 -2.505655366011108 +168 1410 -2.043827177582076 +169 1410 -7.696561402074731 +170 1410 -2.413677344564031 +911 1410 -0.3885093385323891 +916 1410 -1.609499913929919 +921 1410 -0.4640855936298685 +1409 1410 -2.725353226248887 +1410 1410 31.63380937000458 +1411 1410 -1.654052642084038 +1438 1410 -2.463149547970128 +1439 1410 -5.50281377303564 +1440 1410 -2.737303852825893 +169 1411 -2.328161567086957 +170 1411 -10.02567501042723 +171 1411 -2.893129035576904 +916 1411 -0.4468137969819027 +921 1411 -2.079782261695666 +926 1411 -0.5611620187166858 +1410 1411 -1.839306395492166 +1411 1411 36.43759100088709 +1412 1411 -0.5262443021489633 +1439 1411 -2.667249041544475 +1440 1411 -7.537155660155731 +1441 1411 -3.127378738916661 +170 1412 -2.752089670950028 +171 1412 -13.36939779133956 +172 1412 -3.640702286321758 +921 1412 -0.5326776948603668 +926 1412 -2.756458157370552 +931 1412 -0.7116761462002399 +1411 1412 -0.8338126294823462 +1412 1412 43.87726304445374 +1413 1412 0.977894297714123 +1440 1412 -3.010199337874509 +1441 1412 -10.39316776770271 +1442 1412 -3.762765116247729 +171 1413 -3.40257673545482 +172 1413 -18.32743931041253 +173 1413 -4.814418736682788 +926 1413 -0.6635781752027441 +931 1413 -3.761384419328215 +936 1413 -0.9470057341220472 +1412 1413 0.4579017780216632 +1413 1413 55.42990193904284 +1414 1413 3.047865940874146 +1441 1413 -3.564373123993268 +1442 1413 -14.55212389538227 +1443 1413 -4.784282763308797 +172 1414 -4.399060952657337 +173 1414 -26.28058460903805 +174 1414 -6.809724960680944 +931 1414 -0.863089543484836 +936 1414 -5.374278167003345 +941 1414 -1.347151050519368 +1413 1414 2.141426003760619 +1414 1414 74.23990110956638 +1415 1414 6.555654975340879 +1442 1414 -4.438732869033116 +1443 1414 -21.14677513533659 +1444 1414 -6.514761386591312 +173 1415 -6.063669468956891 +174 1415 -39.40566015444968 +175 1415 -10.1649034292622 +936 1415 -1.19637430566227 +941 1415 -8.036975958750245 +946 1415 -2.019446917483802 +1414 1415 4.931189576288814 +1415 1415 105.429581169226 +1416 1415 12.22708921432406 +1443 1415 -5.897141364910292 +1444 1415 -31.91746253022029 +1445 1415 -9.422420017928129 +174 1416 -8.783874189111568 +175 1416 -62.81995622725408 +176 1416 -16.42486459194304 +941 1416 -1.740233059803807 +946 1416 -12.78664561500559 +951 1416 -3.276500139773443 +1415 1416 9.227547615183935 +1416 1416 160.5221717142473 +1417 1416 23.38188379238955 +1444 1416 -8.285387874614122 +1445 1416 -51.00447347747996 +1446 1416 -14.76847695680441 +175 1417 -13.79000455981411 +176 1417 -105.1918366517918 +177 1417 -27.70088974954469 +946 1417 -2.74351307372216 +951 1417 -21.38295132804356 +956 1417 -5.542362966492271 +1416 1417 17.67253006155051 +1417 1417 259.3149912387019 +1418 1417 43.48510493328378 +1445 1417 -12.61035436051805 +1446 1417 -85.34483763803529 +1447 1417 -24.34602192409215 +176 1418 -22.5770344707338 +177 1418 -187.2350768462837 +178 1418 -50.23868495647234 +951 1418 -4.505214874816516 +956 1418 -38.02841269323121 +961 1418 -10.08302480738768 +1417 1418 32.39454583135514 +1418 1418 447.9007981843909 +1419 1418 85.96815657309129 +1446 1418 -20.15962453526146 +1447 1418 -151.7598863878221 +1448 1418 -43.34093211457647 +177 1419 -40.10637565479128 +178 1419 -344.3953663656411 +179 1419 -91.83308254421395 +956 1419 -8.03025151958677 +961 1419 -69.92802136558531 +966 1419 -18.47614113234305 +1418 1419 63.98447229294746 +1419 1419 806.4406077734757 +1420 1419 165.8032626481497 +1447 1419 -35.02073119180889 +1448 1419 -279.6687312995426 +1449 1419 -78.74863984107679 +178 1420 -72.28296455279748 +179 1420 -649.1509216915415 +180 1420 -171.6617086015906 +961 1420 -14.51059265309575 +966 1420 -131.828887612627 +971 1420 -34.62749956197309 +1419 1420 123.0261184940645 +1420 1420 1499.886860533102 +1421 1420 327.0578050949774 +1448 1420 -62.40345710105022 +1449 1420 -532.4488508616488 +1450 1420 -148.5355633954445 +179 1421 -135.7650437130028 +180 1421 -1202.824952773616 +181 1421 -303.2244558721147 +966 1421 -27.33443825598818 +971 1421 -244.4155622954408 +976 1421 -61.31024682761507 +1420 1421 246.7960567933258 +1421 1421 2773.898503477879 +1422 1421 605.4571510231235 +1449 1421 -117.1241241330479 +1450 1421 -1011.97424202843 +1451 1421 -271.2124504135593 +180 1422 -245.3176364844369 +181 1422 -2116.740215888806 +182 1422 -501.5784816585233 +971 1422 -49.52149278085184 +976 1422 -430.5255568718466 +981 1422 -101.6518051811354 +1421 1422 470.5199426106113 +1422 1422 4937.624586293668 +1423 1422 1057.248532074741 +1450 1422 -216.0752458990102 +1451 1422 -1866.508107856422 +1452 1422 -474.7405562130007 +181 1423 -423.9981664885411 +182 1423 -3396.092723852 +183 1423 -738.615639309838 +976 1423 -85.82227986955979 +981 1423 -691.4491011708326 +986 1423 -149.9736709542802 +1422 1423 863.7221483368467 +1423 1423 8114.342885111351 +1424 1423 1642.373101678344 +1451 1423 -390.4187978851984 +1452 1423 -3199.774155499921 +1453 1423 -749.5129022513311 +182 1424 -657.1562574847919 +183 1424 -4899.528089866933 +184 1424 -992.6330727338004 +981 1424 -133.3182455090457 +986 1424 -998.4389911958717 +991 1424 -201.841867775763 +1423 1424 1420.431407264422 +1424 1424 12063.1181587954 +1425 1424 2317.572196217238 +1452 1424 -645.5759201213791 +1453 1424 -4961.904950022152 +1454 1424 -1072.835000806049 +183 1425 -924.3760459380492 +184 1425 -6445.650884144377 +185 1425 -1233.956722433796 +986 1425 -187.8648715033043 +991 1425 -1314.289080485838 +996 1425 -251.1533582528317 +1424 1425 2114.019153066039 +1425 1425 16299.79092387141 +1426 1425 2988.101165279737 +1453 1425 -971.2906482566266 +1454 1425 -6938.729083327136 +1455 1425 -1394.514441968845 +184 1426 -1186.343308292875 +185 1426 -7924.262091847438 +186 1426 -1465.984392758835 +991 1426 -241.3949374086867 +996 1426 -1616.297558537634 +1001 1426 -298.565222729108 +1425 1426 2835.687380154951 +1426 1426 20410.45932239623 +1427 1426 3638.067565966156 +1454 1426 -1315.128282854951 +1455 1426 -8895.102684125524 +1456 1426 -1700.0401861383 +185 1427 -1436.656331892765 +186 1427 -9378.283858792522 +187 1427 -1703.451572980266 +996 1427 -292.5517845697547 +1001 1427 -1913.1278519108 +1006 1427 -347.0715749039244 +1426 1427 3539.944225092935 +1427 1427 24399.42768482129 +1428 1427 4293.879931999023 +1455 1427 -1647.669562847791 +1456 1427 -10787.98221566337 +1457 1427 -2000.379879218712 +186 1428 -1686.994829386272 +187 1428 -10831.16561817782 +188 1428 -1939.820849167485 +1001 1428 -343.6966066536945 +1006 1428 -2209.589196042547 +1011 1428 -395.3363799931611 +1427 1428 4237.654305533504 +1428 1428 28303.80837857821 +1429 1428 4936.152685034039 +1456 1428 -1970.042313166731 +1457 1428 -12617.9133002849 +1458 1428 -2289.967543405756 +187 1429 -1931.204791255029 +188 1429 -12401.0299278235 +189 1429 -2219.795766979726 +1006 1429 -393.5692833900368 +1011 1429 -2529.821636295831 +1016 1429 -452.4863126561735 +1428 1429 4906.573894806959 +1429 1429 32449.24976770541 +1430 1429 5685.517290926578 +1457 1429 -2273.970072650132 +1458 1429 -14535.07709441402 +1459 1429 -2624.58680857193 +188 1430 -2215.486983677385 +189 1430 -14082.2860932131 +190 1430 -2495.68762241805 +1011 1430 -451.6026663577139 +1016 1430 -2872.7270211391 +1021 1430 -508.791460677708 +1429 1430 5670.804078891756 +1430 1430 36847.69138056357 +1431 1430 6418.196982028463 +1458 1430 -2616.65175596154 +1459 1430 -16551.83304892642 +1460 1430 -2951.566112369576 +189 1431 -2493.500303072025 +190 1431 -16002.1019601083 +191 1431 -2856.566729291564 +1016 1431 -508.3429884550324 +1021 1431 -3264.269001632284 +1026 1431 -582.4296284519802 +1430 1431 6410.826434220138 +1431 1431 41850.06503801507 +1432 1431 7371.061734404266 +1459 1431 -2947.61872429662 +1460 1431 -18833.59981637053 +1461 1431 -3377.162086139512 +16 1432 -3188.413094128221 +150 1432 8310.020571382076 +151 1432 -3759.04159018364 +162 1432 -650.320574545007 +190 1432 -2855.332738093203 +191 1432 -18104.52150041151 +292 1432 -650.3826502795264 +1021 1432 -582.176714400014 +1026 1432 -3693.049249714982 +1431 1432 7366.969831199234 +1432 1432 47321.4151998954 +1460 1432 -3374.989336317043 +1461 1432 -21322.85401110426 +91 1433 -7.552641159613144 +92 1433 -21.63982562812927 +93 1433 -2.651746014255949 +629 1433 -0.4674985470895425 +630 1433 -3.787725767692426 +631 1433 -1.29329884031541 +637 1433 -0.4675360803451477 +638 1433 -3.788076714314711 +639 1433 -1.293422735881502 +1404 1433 0.7579913990986812 +1405 1433 -2.530840329278827 +1433 1433 52.84433288295362 +1434 1433 -18.20172161542543 +1462 1433 8.210226292057943 +1463 1433 -6.164038236648499 +1404 1434 -2.538730678180598 +1405 1434 -0.07844421886679787 +1406 1434 -2.293212947649784 +1433 1434 -18.13008920039716 +1434 1434 45.93691005370391 +1435 1434 -14.09101989154739 +1462 1434 -6.209183814268147 +1463 1434 5.475767880376011 +1464 1434 -4.856246735005392 +1405 1435 -2.310060046634409 +1406 1435 -0.8862554777125573 +1407 1435 -2.170996666496694 +1434 1435 -14.01592218033705 +1435 1435 39.99749901104481 +1436 1435 -11.50996056350342 +1463 1435 -4.895793372326382 +1464 1435 3.306623135406921 +1465 1435 -4.142069636619336 +1406 1436 -2.167595980165262 +1407 1436 -1.780951589718776 +1408 1436 -2.145245735896776 +1435 1436 -11.49557347662784 +1436 1436 37.09550949834949 +1437 1436 -9.562924087183543 +1464 1436 -4.155580127712469 +1465 1436 1.659683855244231 +1466 1436 -3.724824076789598 +1407 1437 -2.132562666912103 +1408 1437 -2.787886393020117 +1409 1437 -2.196881350995465 +1436 1437 -9.578841008211612 +1437 1437 36.16589209056984 +1438 1437 -8.161286475704381 +1465 1437 -3.72461197832971 +1466 1437 0.2113875424427412 +1467 1437 -3.530086416733282 +1408 1438 -2.1730440010786 +1409 1438 -3.967474960467039 +1410 1438 -2.325835393736561 +1437 1438 -8.208612708123017 +1438 1438 36.72969912934196 +1439 1438 -6.854983817816203 +1466 1438 -3.517013100005237 +1467 1438 -1.203992830363647 +1468 1438 -3.473080088448247 +1409 1439 -2.285150485116165 +1410 1439 -5.455532583056687 +1411 1439 -2.558660978540587 +1438 1439 -6.945887891981537 +1439 1439 38.77162033871217 +1440 1439 -5.701196453982453 +1467 1439 -3.44338702916868 +1468 1439 -2.784698831635429 +1469 1439 -3.569790111323583 +1410 1440 -2.491489184388696 +1411 1440 -7.392526531382138 +1412 1440 -2.940372525000889 +1439 1440 -5.857760121795146 +1440 1440 42.67531482436495 +1441 1440 -4.532615281425088 +1468 1440 -3.51605323418324 +1469 1440 -4.663300912449072 +1470 1440 -3.840855672975488 +1411 1441 -2.827928554397775 +1412 1441 -10.12440597252472 +1413 1441 -3.555432527359109 +1440 1441 -4.7993314219491 +1441 1441 49.22515693976642 +1442 1441 -3.163217174741949 +1469 1441 -3.747547221169738 +1470 1441 -7.156836303922442 +1471 1441 -4.350203350305355 +1412 1442 -3.365020031768203 +1413 1442 -14.11184483806179 +1414 1442 -4.538821658933209 +1441 1442 -3.616762220526898 +1442 1442 59.75106551067532 +1443 1442 -1.509923461489763 +1470 1442 -4.190882652690719 +1471 1442 -10.63001676533893 +1472 1442 -5.222192637831862 +1413 1443 -4.207173512952311 +1414 1443 -20.44039628373982 +1415 1443 -6.201770551034722 +1442 1443 -2.299229271790007 +1443 1443 77.00751962702991 +1444 1443 1.210401772173858 +1471 1443 -4.945298634631024 +1472 1443 -15.97527477999452 +1473 1443 -6.699624951393838 +1414 1444 -5.609104064266024 +1415 1444 -30.7785859140416 +1416 1444 -8.991954782915862 +1443 1444 -0.1934830786060493 +1444 1444 105.5032147490832 +1445 1444 5.354459107211199 +1472 1444 -6.209919397697519 +1473 1444 -24.47907304124402 +1474 1444 -9.181858519911787 +1415 1445 -7.90109516391146 +1416 1445 -49.09599232493565 +1417 1445 -14.12124201263092 +1444 1445 2.785335602768686 +1445 1445 155.1559957624342 +1446 1445 13.75903746758051 +1473 1445 -8.291879584710809 +1474 1445 -39.27028401814262 +1475 1445 -13.62161673267228 +1416 1446 -12.05119480630101 +1417 1446 -82.04379377966291 +1418 1446 -23.30588891583239 +1445 1446 8.914923705568452 +1446 1446 242.9623759677404 +1447 1446 28.67085222096693 +1474 1446 -11.95659157433923 +1475 1446 -65.40934730187524 +1476 1446 -21.45295727212989 +1417 1447 -19.29082138084507 +1418 1447 -145.7571407700578 +1419 1447 -41.5214511679131 +1446 1447 19.32617722749147 +1447 1447 408.1296383628513 +1448 1447 61.41784377601951 +1475 1447 -18.26289189504807 +1476 1447 -115.3849463615828 +1477 1447 -36.61536488113755 +1418 1448 -33.54044663942783 +1419 1448 -268.4929639291897 +1420 1448 -75.47209042958431 +1447 1448 42.88189702591924 +1448 1448 720.3919438724453 +1449 1448 123.7817965456805 +1476 1448 -30.30743965937931 +1477 1448 -211.1490640510449 +1478 1448 -64.79644491453865 +1419 1449 -59.78327296348402 +1420 1449 -511.2602121661272 +1421 1449 -142.4196159226382 +1448 1449 87.20635818981984 +1449 1449 1328.962781207647 +1450 1449 256.7384575406505 +1477 1449 -52.30551463579244 +1478 1449 -402.2513869968147 +1479 1449 -121.1347998830778 +1420 1450 -112.2182645844849 +1421 1450 -972.7111417572127 +1422 1450 -260.2447603301861 +1449 1450 185.0504486703223 +1450 1450 2488.134054231461 +1451 1450 504.2655904198506 +1478 1450 -96.17389070025845 +1479 1450 -778.9292555037864 +1480 1450 -226.4690753347181 +1421 1451 -207.0589254105418 +1422 1451 -1797.868811660764 +1423 1451 -456.2461568002923 +1450 1451 372.7164954270262 +1451 1451 4612.205104644559 +1452 1451 959.1171121751869 +1479 1451 -178.6644289175082 +1480 1451 -1508.398121839307 +1481 1451 -422.4542921697013 +1422 1452 -374.4693195513385 +1423 1452 -3091.672079680629 +1424 1452 -721.9272304417447 +1451 1452 739.9717619926458 +1452 1452 8140.963823553348 +1453 1452 1653.701671375919 +1480 1452 -336.5921043865491 +1481 1452 -2819.923941050011 +1482 1452 -739.6748562383237 +1423 1453 -620.4136313646497 +1424 1453 -4811.121166175551 +1425 1453 -1036.128907856499 +1452 1453 1345.055599497287 +1453 1453 13274.19055121774 +1454 1453 2600.653019210214 +1481 1453 -606.0508085486458 +1482 1453 -4917.270795154461 +1483 1453 -1193.627474209954 +1424 1454 -936.2147795458382 +1425 1454 -6748.477133354632 +1426 1454 -1350.184516410107 +1453 1454 2243.486610605593 +1454 1454 19669.02299124779 +1455 1454 3669.829971000903 +1482 1454 -1022.373491878457 +1483 1454 -7768.701908268881 +1484 1454 -1723.01642570503 +1425 1455 -1271.600245900962 +1426 1455 -8669.28877114442 +1427 1455 -1649.352922515045 +1454 1455 3340.599733286842 +1455 1455 26494.37563979556 +1456 1455 4754.561551421597 +1483 1455 -1552.225658688281 +1484 1455 -10996.68247288589 +1485 1455 -2255.602429808839 +1426 1456 -1597.30731468294 +1427 1456 -10525.91182644717 +1428 1456 -1943.69021468444 +1455 1456 4508.860734379206 +1456 1456 33190.29552441736 +1457 1456 5820.812516930091 +1484 1456 -2121.852303250185 +1485 1456 -14231.82216184326 +1486 1456 -2759.735095573874 +1427 1457 -1913.480546587251 +1428 1457 -12317.12863281778 +1429 1457 -2227.372317999274 +1456 1457 5668.110225861997 +1457 1457 39474.66247229143 +1458 1457 6821.282321577703 +1485 1457 -2674.606412925597 +1486 1457 -17249.73020760063 +1487 1457 -3216.761483940612 +1428 1458 -2211.431902752561 +1429 1458 -14190.1855418233 +1430 1458 -2554.845997048919 +1457 1458 6738.555510365934 +1458 1458 45777.76695008262 +1459 1458 7936.166330088045 +1486 1458 -3170.256738950376 +1487 1458 -20218.27509504041 +1488 1458 -3711.680821525325 +1429 1459 -2546.940596814773 +1430 1459 -16158.50699557292 +1431 1459 -2874.613075818737 +1458 1459 7895.210806758643 +1459 1459 52218.72494014632 +1460 1459 9004.60802481652 +1487 1459 -3688.679104213371 +1488 1459 -23201.80238245963 +1489 1459 -4182.920750605827 +1430 1460 -2870.683451835896 +1431 1460 -18384.49973263509 +1432 1460 -3290.566036100876 +1459 1460 8984.721810335184 +1460 1460 59400.33395623849 +1461 1460 10375.35173635369 +1488 1460 -4171.843296677461 +1489 1460 -26491.56670116148 +1490 1460 -4786.575367437466 +150 1461 -3667.63626867823 +151 1461 11780.02283953465 +152 1461 -5305.509398017479 +1431 1461 -3288.405219212179 +1432 1461 -20812.606602823 +1460 1461 10364.78963566067 +1461 1461 67193.88451091149 +1489 1461 -4780.764725416821 +1490 1461 -30041.70887816893 +90 1462 -20.39079185034447 +91 1462 -59.2004481679523 +92 1462 -5.692242483300216 +630 1462 -0.9964661278285452 +631 1462 -10.24983505327784 +632 1462 -3.475438132308312 +638 1462 -0.9965651608834046 +639 1462 -10.25093222042695 +640 1462 -3.475815605977852 +1433 1462 5.239983637291874 +1434 1462 -4.87151329223698 +1462 1462 123.2163121029899 +1463 1462 -45.30658368646951 +1491 1462 28.3973091147181 +1492 1462 -15.46117924565021 +1433 1463 -4.916411855863387 +1434 1463 3.498243884517617 +1435 1463 -3.965611520126593 +1462 1463 -45.10145684086658 +1463 1463 96.37800183295107 +1464 1463 -33.16222955867908 +1491 1463 -15.5545311169403 +1492 1463 19.88629842654585 +1493 1463 -11.35195611858171 +1434 1464 -4.004308933979834 +1435 1464 1.964789880446476 +1436 1464 -3.467615687608971 +1463 1464 -33.00523350851088 +1464 1464 77.14701876707701 +1465 1464 -26.16311524221024 +1492 1464 -11.4199119525983 +1493 1464 13.59404689256832 +1494 1464 -8.997735080319348 +1435 1465 -3.481393540905455 +1436 1465 0.7094401706162183 +1437 1465 -3.192770519387858 +1464 1465 -26.08338791343882 +1465 1465 66.26174431100229 +1466 1465 -21.265740213606 +1493 1465 -9.037247957396435 +1494 1465 9.493805510766517 +1495 1465 -7.484944878811595 +1436 1466 -3.193269706639551 +1437 1466 -0.465835549067172 +1438 1466 -3.082424599061552 +1465 1466 -21.23359191604513 +1466 1466 60.1612615511773 +1467 1466 -18.07059894942446 +1494 1466 -7.505257599019371 +1495 1466 6.501938499519037 +1496 1466 -6.605646403721398 +1437 1467 -3.070547901649342 +1438 1467 -1.680988541488959 +1439 1467 -3.080496438899019 +1466 1467 -18.08013695434513 +1467 1467 57.3365918669445 +1468 1467 -15.4931629600304 +1495 1467 -6.609806714419358 +1496 1467 4.131354843831973 +1497 1467 -6.059425535239607 +1438 1468 -3.052734191427724 +1439 1468 -3.093332592147865 +1440 1468 -3.208156114393678 +1467 1468 -15.55164612260581 +1468 1468 57.01771796322406 +1469 1468 -13.52908427385721 +1496 1468 -6.045809994798478 +1497 1468 1.954962176892999 +1498 1468 -5.818808594091834 +1439 1469 -3.15752040388948 +1440 1469 -4.814950931155111 +1441 1469 -3.491777757758761 +1468 1469 -13.65348406200242 +1469 1469 59.30029676903366 +1470 1469 -11.8743325644184 +1497 1469 -5.782559779444139 +1498 1469 -0.2177468125356956 +1499 1469 -5.842363552473564 +1440 1470 -3.403587164471713 +1441 1470 -7.13524520806758 +1442 1470 -3.995903581754309 +1469 1470 -12.10317302826005 +1470 1470 64.67380624992526 +1471 1470 -10.30014770423128 +1498 1470 -5.771418246525808 +1499 1470 -2.734165029351627 +1500 1470 -6.152516801831895 +1441 1471 -3.845195754101674 +1442 1471 -10.39305851167529 +1443 1471 -4.839413355069583 +1470 1471 -10.69787238165246 +1471 1471 74.29897621603064 +1472 1471 -8.839507933512222 +1499 1471 -6.027087309856227 +1500 1471 -5.880160482851704 +1442 1472 -4.577481996458607 +1443 1472 -15.42541068241814 +1444 1472 -6.257057623263234 +1471 1472 -9.533173006183166 +1472 1472 90.55052520805498 +1473 1472 -6.699480784751298 +1500 1472 -6.641015708446849 +1443 1473 -5.794084372331497 +1444 1473 -23.43884752132342 +1445 1473 -8.626303623301258 +1472 1473 -7.918649287455155 +1473 1473 117.3817079792856 +1474 1473 -3.978726966956168 +1444 1474 -7.785563424296527 +1445 1474 -37.3743806360612 +1446 1474 -12.85505096338268 +1473 1474 -6.173353121008525 +1474 1474 163.2042938511596 +1475 1474 1.83962027284561 +1445 1475 -11.28363418322131 +1446 1475 -61.97875535702716 +1447 1475 -20.3000948220492 +1474 1475 -2.215706996777917 +1475 1475 242.229278810136 +1476 1475 11.57558525312506 +1446 1476 -17.29212652985276 +1447 1476 -108.9866652528547 +1448 1476 -34.68924417844575 +1475 1476 3.901433789070474 +1476 1476 386.4745183558694 +1477 1476 34.5163431255476 +1447 1477 -28.74549045585235 +1448 1477 -199.0185406261623 +1449 1477 -61.39784380198365 +1476 1477 19.50491008624508 +1477 1477 652.9746647573054 +1478 1477 77.98580101322287 +1448 1478 -49.63093924504332 +1449 1478 -378.7413480770405 +1450 1478 -114.7132494458378 +1477 1478 48.46922608097289 +1478 1478 1165.643168755608 +1479 1478 176.2230558097183 +1449 1479 -91.17790804341465 +1450 1479 -733.5840391609186 +1451 1479 -214.3679010859584 +1478 1479 117.0833288253578 +1479 1479 2154.856585323966 +1480 1479 370.0217671373632 +1450 1480 -169.1697233593162 +1451 1480 -1423.356066623906 +1452 1480 -400.0012044589214 +1479 1480 254.6339085887542 +1480 1480 4063.084890497851 +1481 1480 769.6183876271591 +1451 1481 -318.3436918206231 +1452 1481 -2671.707949282013 +1453 1481 -701.6437538283634 +1480 1481 552.1184898578108 +1481 1481 7588.256681899952 +1482 1481 1487.681299659393 +1452 1482 -573.3369861935572 +1453 1482 -4686.786283076685 +1454 1482 -1136.201345221714 +1481 1482 1116.307568244683 +1482 1482 13615.99870907604 +1483 1482 2685.653455473853 +1453 1483 -969.6304072825361 +1454 1483 -7455.34955397076 +1455 1483 -1647.275101616056 +1482 1483 2132.467855757233 +1483 1483 22741.39587130961 +1484 1483 4350.918927379596 +1454 1484 -1478.890998411765 +1455 1484 -10616.97627052315 +1456 1484 -2165.492219365541 +1483 1484 3679.84868061201 +1484 1484 34457.956827691 +1485 1484 6317.722725285503 +1455 1485 -2032.15649218967 +1456 1485 -13796.8063491566 +1457 1485 -2658.399483350111 +1484 1485 5678.046382481377 +1485 1485 47306.77947158284 +1486 1485 8349.76447946219 +1456 1486 -2572.941490999037 +1457 1486 -16758.49214373635 +1458 1486 -3105.834263512549 +1485 1486 7878.607647880295 +1486 1486 59531.64920558143 +1487 1486 10211.70709675239 +1457 1487 -3059.003311721836 +1458 1487 -19659.15251523157 +1459 1487 -3589.716286522075 +1486 1487 9933.614933607303 +1487 1487 71023.5396046455 +1488 1487 12144.11071522559 +1458 1488 -3566.543814232416 +1459 1488 -22564.5472550547 +1460 1488 -4049.79669011948 +1487 1488 12003.63832620808 +1488 1488 81978.64423086074 +1489 1488 13924.74333400895 +1459 1489 -4038.65611736715 +1460 1489 -25762.28093611291 +1461 1489 -4638.338769391509 +1488 1489 13858.63980095977 +1489 1489 93649.11052008567 +1490 1489 16143.23060614997 +151 1490 -5154.835123471613 +152 1490 18546.99694340145 +153 1490 -7508.493110527212 +1460 1490 -4632.512664778037 +1461 1490 -29210.81515448891 +1489 1490 16110.33530111251 +1490 1490 106067.6709232281 +89 1491 -64.1080665857895 +90 1491 -174.6327152834251 +91 1491 -14.60646659610553 +631 1491 -2.533078035934664 +632 1491 -29.9087120042548 +633 1491 -10.86376481875598 +639 1491 -2.533360438860228 +640 1491 -29.91208599944759 +641 1491 -10.86492827116411 +1462 1491 18.56274944229284 +1463 1491 -11.16797666314239 +1491 1491 336.4114880324217 +1492 1491 -130.6640445153705 +1462 1492 -11.25902021277421 +1463 1492 12.87925763975917 +1464 1492 -8.399515564314704 +1491 1492 -130.2489527760645 +1492 1492 251.2690338060658 +1493 1492 -92.15102823527759 +1463 1493 -8.466455823159034 +1464 1493 8.749268218437438 +1465 1493 -6.851012957977908 +1492 1493 -91.81926534349513 +1493 1493 188.4655407717104 +1494 1493 -69.42627404400736 +1464 1494 -6.890457253178285 +1465 1494 6.014006171133945 +1466 1494 -5.864827344153372 +1493 1494 -69.21087400702811 +1494 1494 150.3613627163381 +1495 1494 -54.09724386196291 +1465 1495 -5.885727172254585 +1466 1495 3.92169682439626 +1467 1495 -5.310147485505285 +1494 1495 -53.96078680812144 +1495 1495 126.7082156614397 +1496 1495 -44.44468997664053 +1466 1496 -5.31551769621998 +1467 1496 2.163373090716595 +1468 1496 -4.986305677612541 +1495 1496 -44.37262374581709 +1496 1496 112.5027950793764 +1497 1496 -37.33758545699841 +1467 1497 -4.974733102145695 +1468 1497 0.4420259864884803 +1469 1497 -4.889251975151307 +1496 1497 -37.33094921497038 +1497 1497 104.485401822814 +1498 1497 -32.36818203988638 +1468 1498 -4.856302951396348 +1469 1498 -1.373275998762681 +1470 1498 -5.004140509611334 +1497 1498 -32.43755146893692 +1498 1498 101.6975619362612 +1499 1498 -28.68246848818084 +1469 1499 -4.938610626691007 +1470 1499 -3.568975517943366 +1471 1499 -5.365858750849571 +1498 1499 -28.86133345177112 +1499 1499 103.7447080920173 +1500 1499 -25.77698538342484 +1470 1500 -5.249438559581935 +1471 1500 -6.390563919581275 +1472 1500 -6.082622529240229 +1499 1500 -26.11861056503885 +1500 1500 111.3951004687176 diff --git a/packages/piro/src/Piro_ObserverBase.hpp b/packages/piro/src/Piro_ObserverBase.hpp index 5e823eedcc3d..d6b98917fee1 100644 --- a/packages/piro/src/Piro_ObserverBase.hpp +++ b/packages/piro/src/Piro_ObserverBase.hpp @@ -46,6 +46,7 @@ #include #include "Thyra_VectorBase.hpp" +#include "Thyra_DefaultMultiVectorProductVector.hpp" namespace Piro { @@ -55,25 +56,51 @@ class ObserverBase { virtual void observeSolution( const Thyra::VectorBase &solution); + virtual void observeSolution( + const Thyra::VectorBase &solution, + const Thyra::MultiVectorBase &solution_dxdp); + virtual void observeSolution( const Thyra::VectorBase &solution, const Scalar stamp); + virtual void observeSolution( + const Thyra::VectorBase &solution, + const Thyra::MultiVectorBase &solution_dxdp, + const Scalar stamp); + virtual void observeSolution( const Thyra::VectorBase &solution, const Thyra::VectorBase &solution_dot, const Scalar stamp); + virtual void observeSolution( + const Thyra::VectorBase &solution, + const Thyra::MultiVectorBase &solution_dxdp, + const Thyra::VectorBase &solution_dot, + const Scalar stamp); + virtual void observeSolution( const Thyra::VectorBase &solution, const Thyra::VectorBase &solution_dot, const Thyra::VectorBase &solution_dotdot, const Scalar stamp); - + + virtual void observeSolution( + const Thyra::VectorBase &solution, + const Thyra::MultiVectorBase &solution_dxdp, + const Thyra::VectorBase &solution_dot, + const Thyra::VectorBase &solution_dotdot, + const Scalar stamp); virtual void observeSolution( const Thyra::MultiVectorBase &solution, Scalar time); + virtual void observeSolution( + const Thyra::MultiVectorBase &solution, + const Thyra::MultiVectorBase &solution_dxdp, + Scalar time); + virtual void parameterChanged( const std::string& param); @@ -92,6 +119,25 @@ template void ObserverBase::observeSolution( const Thyra::VectorBase &/*solution*/, + const Thyra::MultiVectorBase &/*solution_dxdp*/) +{ + // Nothing to do by default +} + +template +void +ObserverBase::observeSolution( + const Thyra::VectorBase &/*solution*/, + const Scalar /*stamp*/) +{ + // Nothing to do by default +} + +template +void +ObserverBase::observeSolution( + const Thyra::VectorBase &/*solution*/, + const Thyra::MultiVectorBase &/*solution_dxdp*/, const Scalar /*stamp*/) { // Nothing to do by default @@ -107,6 +153,17 @@ ObserverBase::observeSolution( // Nothing to do by default } +template +void +ObserverBase::observeSolution( + const Thyra::VectorBase &/*solution*/, + const Thyra::MultiVectorBase &/*solution_dxdp*/, + const Thyra::VectorBase &/*solution_dot*/, + const Scalar /*stamp*/) +{ + // Nothing to do by default +} + template void ObserverBase::observeSolution( @@ -121,7 +178,30 @@ ObserverBase::observeSolution( template void ObserverBase::observeSolution( - const Thyra::MultiVectorBase &solution, Scalar time) + const Thyra::VectorBase &/*solution*/, + const Thyra::MultiVectorBase &/*solution_dxdp*/, + const Thyra::VectorBase &/*solution_dot*/, + const Thyra::VectorBase &/*solution_dotdot*/, + const Scalar /*stamp*/) +{ + // Nothing to do by default +} + +template +void +ObserverBase::observeSolution( + const Thyra::MultiVectorBase &/*solution*/, + Scalar /*time*/) +{ + // Nothing to do by default +} + +template +void +ObserverBase::observeSolution( + const Thyra::MultiVectorBase &/*solution*/, + const Thyra::MultiVectorBase &/*solution_dxdp*/, + Scalar /*time*/) { // Nothing to do by default } diff --git a/packages/piro/src/Piro_ObserverToTempusIntegrationObserverAdapter_Def.hpp b/packages/piro/src/Piro_ObserverToTempusIntegrationObserverAdapter_Def.hpp index 730832da5b17..f38ef7e53990 100644 --- a/packages/piro/src/Piro_ObserverToTempusIntegrationObserverAdapter_Def.hpp +++ b/packages/piro/src/Piro_ObserverToTempusIntegrationObserverAdapter_Def.hpp @@ -44,6 +44,7 @@ #include "Teuchos_Ptr.hpp" +//#define DEBUG_OUTPUT // Constructor template @@ -225,25 +226,33 @@ Piro::ObserverToTempusIntegrationObserverAdapter::observeTimeStep() //Get solution typedef Thyra::DefaultMultiVectorProductVector DMVPV; - Teuchos::RCP> x = solutionHistory_->getCurrentState()->getX(); - Teuchos::RCP X = Teuchos::rcp_dynamic_cast(x); - //IKT, 5/12/2020: getX() returns a vector containing the sensitivities for the case of sensitivity calculations for sensitivity integrator. + Teuchos::RCP> x = solutionHistory_->getCurrentState()->getX(); + Teuchos::RCP X = Teuchos::rcp_dynamic_cast(x); + //IKT, 5/12/2020: getX() returns a vector containing the sensitivities for the + //case of sensitivity calculations for sensitivity integrator. //Hence, we extract the first column, which is the solution. - Teuchos::RCP> solution = (sens_method_ == NONE) ? x : X->getMultiVector()->col(0); - //IKT FIXME? Extract the remaining columns which would represent dxdp for the forward sensitivities? - //This is if we want to observe them/write them to Exodus file in Albany. - //if (sens_method == FORWARD) { - //const int num_param = X->getMultiVector()->domain()->dim()-1; - //const Teuchos::Range1D rng(1,num_param); - //Teuchos::RCP> solution_dxdp = X->getMultiVector()->subView(rng); - //} - + Teuchos::RCP> solution = (sens_method_ == NONE) ? x : X->getNonconstMultiVector()->col(0); + Teuchos::RCP > solution_dxdp_mv = Teuchos::null; + if (sens_method_ == FORWARD) { + const int num_param = X->getMultiVector()->domain()->dim()-1; + const Teuchos::Range1D rng(1,num_param); + solution_dxdp_mv = X->getNonconstMultiVector()->subView(rng); +#ifdef DEBUG_OUTPUT + for (int np = 0; np < num_param; np++) { + *out_ << "\n*** Piro::ObserverToTempusIntegrationObserverAdapter dxdp" << np << " ***\n"; + Teuchos::RCP> solution_dxdp = solution_dxdp_mv->col(np); + Teuchos::Range1D range; + RTOpPack::ConstSubVectorView dxdpv; + solution_dxdp->acquireDetachedView(range, &dxdpv); + auto dxdpa = dxdpv.values(); + for (auto i = 0; i < dxdpa.size(); ++i) *out_ << dxdpa[i] << " "; + *out_ << "\n*** Piro::ObserverToTempusIntegrationObserverAdapter dxdp" << np << " ***\n"; + } +#endif + } //Get solution_dot Teuchos::RCP> xdot = solutionHistory_->getCurrentState()->getXDot(); Teuchos::RCP XDot = Teuchos::rcp_dynamic_cast(xdot); - //IKT, 5/11/2020: getXDot() returns a vector containing the sensitivities for the case of sensitivity calculations for sentivity integrator - //Hence, we extract the first column, which is the solution_dot. - Teuchos::RCP> solution_dot = (sens_method_ == NONE) ? xdot : XDot->getMultiVector()->col(0); const Scalar scalar_time = solutionHistory_->getCurrentState()->getTime(); typedef typename Teuchos::ScalarTraits::magnitudeType StampScalar; @@ -252,21 +261,41 @@ Piro::ObserverToTempusIntegrationObserverAdapter::observeTimeStep() //Get solution_dotdot Teuchos::RCP> xdotdot = solutionHistory_->getCurrentState()->getXDotDot(); Teuchos::RCP XDotDot = Teuchos::rcp_dynamic_cast(xdotdot); - //IKT, 5/11/2020: getXDotDot() returns a vector containing the sensitivities for the case of sensitivity calculations. - //Hence, we extract the first column, which is the solution_dotdot. - Teuchos::RCP> solution_dotdot = (sens_method_ == NONE) ? xdot : XDotDot->getMultiVector()->col(0); - if (Teuchos::nonnull(solution_dot)) - { + if (Teuchos::nonnull(xdot)) { + //IKT, 5/11/2020: getXDot() returns a vector containing the sensitivities for + //the case of sensitivity calculations for sentivity integrator + //Hence, we extract the first column, which is the solution_dot. + Teuchos::RCP> solution_dot + = (sens_method_ == NONE) ? xdot : XDot->getMultiVector()->col(0); if (supports_x_dotdot_) { - - wrappedObserver_->observeSolution(*solution, *solution_dot, *solution_dotdot, time); + //IKT, 5/11/2020: getXDotDot() returns a vector containing the sensitivities for + //the case of sensitivity calculations. + //Hence, we extract the first column, which is the solution_dotdot. + Teuchos::RCP> solution_dotdot + = (sens_method_ == NONE) ? xdot : XDotDot->getMultiVector()->col(0); + if (solution_dxdp_mv != Teuchos::null) { + wrappedObserver_->observeSolution(*solution, *solution_dxdp_mv, *solution_dot, *solution_dotdot, time); + } + else { + wrappedObserver_->observeSolution(*solution, *solution_dot, *solution_dotdot, time); + } + } + else { + if (solution_dxdp_mv != Teuchos::null) { + wrappedObserver_->observeSolution(*solution, *solution_dxdp_mv, *solution_dot, time); + } + else { + wrappedObserver_->observeSolution(*solution, *solution_dot, time); + } } - else { - wrappedObserver_->observeSolution(*solution, *solution_dot, time); - } } else { - wrappedObserver_->observeSolution(*solution, time); + if (solution_dxdp_mv != Teuchos::null) { + wrappedObserver_->observeSolution(*solution, *solution_dxdp_mv, time); + } + else { + wrappedObserver_->observeSolution(*solution, time); + } } previous_dt_ = current_dt; } diff --git a/packages/piro/src/Piro_PerformAnalysis.cpp b/packages/piro/src/Piro_PerformAnalysis.cpp index e20f99fdf37f..a3db2d7d0ade 100644 --- a/packages/piro/src/Piro_PerformAnalysis.cpp +++ b/packages/piro/src/Piro_PerformAnalysis.cpp @@ -210,8 +210,19 @@ Piro::PerformROLAnalysis( RCP< Thyra::VectorBase >& p) { auto rolParams = analysisParams.sublist("ROL"); + #ifdef HAVE_PIRO_ROL + int verbose = rolParams.get("Verbosity Level", 3); + Teuchos::EVerbosityLevel verbosityLevel; + switch(verbose) { + case 1: verbosityLevel= Teuchos::VERB_LOW; break; + case 2: verbosityLevel= Teuchos::VERB_MEDIUM; break; + case 3: verbosityLevel= Teuchos::VERB_HIGH; break; + case 4: verbosityLevel= Teuchos::VERB_EXTREME; break; + default: verbosityLevel= Teuchos::VERB_NONE; + } + if(rolParams.isParameter("Use Old Reduced Space Interface") && rolParams.get("Use Old Reduced Space Interface")) { using std::string; @@ -244,7 +255,7 @@ Piro::PerformROLAnalysis( ROL::ThyraVector rol_p(p_prod); - ROL::ThyraProductME_Objective obj(piroModel, g_index, p_indices, Teuchos::rcp(&analysisParams.sublist("Optimization Status"),false)); + ROL::ThyraProductME_Objective obj(piroModel, g_index, p_indices, Teuchos::rcp(&analysisParams.sublist("Optimization Status"),false),verbosityLevel); bool print = rolParams.get("Print Output", false); @@ -450,9 +461,8 @@ Piro::PerformROLAnalysis( Teuchos::RCP> lambda_vec = Thyra::createMember(x_space); ROL::ThyraVector rol_lambda(lambda_vec); - bool always_recompute = true; - ThyraProductME_Objective_SimOpt obj(*model, g_index, p_indices, Teuchos::rcp(&analysisParams.sublist("Optimization Status"),false)); - ThyraProductME_Constraint_SimOpt constr(*model, g_index, p_indices, Teuchos::rcp(&analysisParams.sublist("Optimization Status"),false),always_recompute); + ThyraProductME_Objective_SimOpt obj(*model, g_index, p_indices, Teuchos::rcp(&analysisParams.sublist("Optimization Status"),false),verbosityLevel); + ThyraProductME_Constraint_SimOpt constr(*model, g_index, p_indices, Teuchos::rcp(&analysisParams.sublist("Optimization Status"),false),verbosityLevel); constr.setSolveParameters(rolParams.sublist("ROL Options")); diff --git a/packages/piro/src/Piro_TransientSolver_Def.hpp b/packages/piro/src/Piro_TransientSolver_Def.hpp index 79cf1e45247f..18c393135d1f 100644 --- a/packages/piro/src/Piro_TransientSolver_Def.hpp +++ b/packages/piro/src/Piro_TransientSolver_Def.hpp @@ -58,6 +58,8 @@ #include #include +//#define DEBUG_OUTPUT + template Piro::TransientSolver::TransientSolver( const Teuchos::RCP > &model) : @@ -402,6 +404,21 @@ Piro::TransientSolver::evalConvergedModelResponsesAndSensitivities( { //Get dxdp_mv from Tempus::ForwardIntegratorSensitivity class const RCP > dxdp_mv = piroTempusIntegrator_->getDxDp(); +#ifdef DEBUG_OUTPUT + *out_ << "\n*** Piro::TransientSolver: num_p, num vecs in dxdp = " << num_p_ << ", " << dxdp_mv->domain()->dim() << " ***\n"; +#endif + for (int i=0; i < dxdp_mv->domain()->dim(); ++i) { + Teuchos::RCP> dxdp = dxdp_mv->col(i); +#ifdef DEBUG_OUTPUT + *out_ << "\n*** Piro::TransientSolver dxdp for p = " << i << " ***\n"; + Teuchos::Range1D range; + RTOpPack::ConstSubVectorView dxdpv; + dxdp->acquireDetachedView(range, &dxdpv); + auto dxdpa = dxdpv.values(); + for (auto j = 0; j < dxdpa.size(); ++j) *out_ << dxdpa[j] << " "; + *out_ << "\n*** Piro::TransientSolver dxdp for p = " << i << " ***\n"; +#endif + } //IMPORTANT REMARK: we are currently NOT using DxdotDp and DxdotdotDp in transient sensitivities! //The capability to use them can be added at a later point in time, if desired. //IKT, 5/10/20: throw error if dxdp_mv returned by Tempus is null. Not sure if this can happen in practice or not... diff --git a/packages/piro/test/Piro_TempusSolver_SensitivitySinCosUnitTests.cpp b/packages/piro/test/Piro_TempusSolver_SensitivitySinCosUnitTests.cpp index feeb5d28b0e5..6e986fde4c82 100644 --- a/packages/piro/test/Piro_TempusSolver_SensitivitySinCosUnitTests.cpp +++ b/packages/piro/test/Piro_TempusSolver_SensitivitySinCosUnitTests.cpp @@ -53,6 +53,7 @@ #include "Piro_TempusIntegrator.hpp" #include "SinCosModel.hpp" +#include "Piro_Test_MockObserver.hpp" #include "Teuchos_UnitTestHarness.hpp" @@ -103,6 +104,7 @@ void test_sincos_fsa(const bool use_combined_method, } } + const RCP > observer(new MockObserver); std::vector StepSize; std::vector ErrorNorm; const int nTimeStepSizes = 7; @@ -167,6 +169,11 @@ void test_sincos_fsa(const bool use_combined_method, } integrator->initializeSolutionHistory(t0, x0, Teuchos::null, Teuchos::null, DxDp0, Teuchos::null, Teuchos::null); + const RCP > solutionHistory = integrator->getSolutionHistory(); + const RCP > timeStepControl = integrator->getTimeStepControl(); + const Teuchos::RCP > tempusObserver + = Teuchos::rcp(new ObserverToTempusIntegrationObserverAdapter(solutionHistory, timeStepControl, observer, false, false, sens_method)); + integrator->setObserver(tempusObserver); const RCP > stepSolver = Teuchos::null; @@ -248,6 +255,28 @@ void test_sincos_fsa(const bool use_combined_method, } ftmp.close(); } + + const RCP > solution = + observer->lastSolution(); + const RCP > solution_dxdp = + observer->lastSolution_dxdp(); + + //Compare solution from observer and x to verify observer routines + TEST_COMPARE_FLOATING_ARRAYS( + arrayFromVector(*solution), + arrayFromVector(*x), + tol); + + //Compare solution_dxdp from observer and DxDp to verify observer routines + for (int np = 0; np < DxDp->domain()->dim(); np++) { + Teuchos::RCP> DxDp_vec = DxDp->col(np); + Teuchos::RCP> solution_dxdp_vec = solution_dxdp->col(np); + TEST_COMPARE_FLOATING_ARRAYS( + arrayFromVector(*solution_dxdp_vec), + arrayFromVector(*DxDp_vec), + tol); + } + // Calculate the error RCP > xdiff = x->clone_v(); RCP > DxDpdiff = DxDp->clone_mv(); diff --git a/packages/piro/test/Piro_TempusSolver_SensitivityUnitTests.cpp b/packages/piro/test/Piro_TempusSolver_SensitivityUnitTests.cpp index 2081bca3b9d1..af6e00ba11cf 100644 --- a/packages/piro/test/Piro_TempusSolver_SensitivityUnitTests.cpp +++ b/packages/piro/test/Piro_TempusSolver_SensitivityUnitTests.cpp @@ -81,6 +81,7 @@ using namespace Teuchos; using namespace Piro; using namespace Piro::Test; +//#define DEBUG_OUTPUT namespace Thyra { typedef ModelEvaluatorBase MEB; @@ -491,26 +492,48 @@ TEUCHOS_UNIT_TEST(Piro_TempusSolver, ObserveInitialConditionWhenSensitivitiesReq const Thyra::MEB::InArgs inArgs = solver->getNominalValues(); Thyra::MEB::OutArgs outArgs = solver->createOutArgs(); - { - const int solutionResponseIndex = solver->Ng() - 1; - const int parameterIndex = 0; - const Thyra::MEB::Derivative dxdp_deriv = + + const int solutionResponseIndex = solver->Ng() - 1; + const int parameterIndex = 0; + const Thyra::MEB::Derivative dxdp_deriv = Thyra::create_DgDp_mv(*solver, solutionResponseIndex, parameterIndex, Thyra::MEB::DERIV_MV_JACOBIAN_FORM); - const RCP > dxdp = dxdp_deriv.getMultiVector(); + const RCP > dxdp = dxdp_deriv.getMultiVector(); outArgs.set_DgDp(solutionResponseIndex, parameterIndex, dxdp_deriv); - } solver->evalModel(inArgs, outArgs); - { - const RCP > solution = - observer->lastSolution(); - - const RCP > initialCondition = - model->getNominalValues().get_x(); - + const RCP > solution = + observer->lastSolution(); + + const RCP > solution_dxdp = + observer->lastSolution_dxdp(); + + const RCP > initialCondition = + model->getNominalValues().get_x(); + + TEST_COMPARE_FLOATING_ARRAYS( + arrayFromVector(*solution), + arrayFromVector(*initialCondition), + tol); + + //Test observer output of lastSolution_dxdp + for (int np = 0; np < dxdp->domain()->dim(); np++) { + Teuchos::RCP> solution_dxdp_vec = solution_dxdp->col(np); + Teuchos::RCP> zero_vec = + Thyra::createMember(solution_dxdp_vec->space()); + Thyra::put_scalar(0.0, zero_vec.ptr()); +#ifdef DEBUG_OUTPUT + auto out_ =Teuchos::VerboseObjectBase::getDefaultOStream(); + *out_ << "\n*** Piro::TransientSolver dxdp for p = " << np << " ***\n"; + Teuchos::Range1D range; + RTOpPack::ConstSubVectorView dxdpv; + solution_dxdp_vec->acquireDetachedView(range, &dxdpv); + auto dxdpa = dxdpv.values(); + for (auto j = 0; j < dxdpa.size(); ++j) *out_ << dxdpa[j] << " "; + *out_ << "\n*** Piro::TransientSolver dxdp for p = " << np << " ***\n"; +#endif TEST_COMPARE_FLOATING_ARRAYS( - arrayFromVector(*solution), - arrayFromVector(*initialCondition), + arrayFromVector(*solution_dxdp->col(np)), + arrayFromVector(*zero_vec), tol); } diff --git a/packages/piro/test/Piro_Test_MockObserver.hpp b/packages/piro/test/Piro_Test_MockObserver.hpp index 2601d9dca799..4e05e14368c4 100644 --- a/packages/piro/test/Piro_Test_MockObserver.hpp +++ b/packages/piro/test/Piro_Test_MockObserver.hpp @@ -61,25 +61,51 @@ class MockObserver : public ObserverBase { virtual void observeSolution( const Thyra::VectorBase &solution); + virtual void observeSolution( + const Thyra::VectorBase &solution, + const Thyra::MultiVectorBase &solution_dxdp); + virtual void observeSolution( const Thyra::VectorBase &solution, const Scalar stamp); + + virtual void observeSolution( + const Thyra::VectorBase &solution, + const Thyra::MultiVectorBase &solution_dxdp, + const Scalar stamp); virtual void observeSolution( const Thyra::VectorBase &solution, const Thyra::VectorBase &solution_dot, const Scalar stamp); + virtual void observeSolution( + const Thyra::VectorBase &solution, + const Thyra::MultiVectorBase &solution_dxdp, + const Thyra::VectorBase &solution_dot, + const Scalar stamp); + virtual void observeSolution( const Thyra::VectorBase &solution, const Thyra::VectorBase &solution_dot, const Thyra::VectorBase &solution_dotdot, const Scalar stamp); + + virtual void observeSolution( + const Thyra::VectorBase &solution, + const Thyra::MultiVectorBase &solution_dxdp, + const Thyra::VectorBase &solution_dot, + const Thyra::VectorBase &solution_dotdot, + const Scalar stamp); Teuchos::RCP > lastSolution() const { return lastSolution_; } + Teuchos::RCP > lastSolution_dxdp() const { + return lastSolution_dxdp_; + } + Teuchos::RCP > lastSolution_dot() const { return lastSolution_dot_; } @@ -94,6 +120,7 @@ class MockObserver : public ObserverBase { private: Teuchos::RCP > lastSolution_; + Teuchos::RCP > lastSolution_dxdp_; Teuchos::RCP > lastSolution_dot_; Teuchos::RCP > lastSolution_dotdot_; Scalar lastStamp_; @@ -103,6 +130,7 @@ class MockObserver : public ObserverBase { template MockObserver::MockObserver() : lastSolution_(Teuchos::null), + lastSolution_dxdp_(Teuchos::null), lastSolution_dot_(Teuchos::null), lastSolution_dotdot_(Teuchos::null), lastStamp_(Scalar()) @@ -116,6 +144,17 @@ MockObserver::observeSolution( lastSolution_ = solution.clone_v(); } +template +void +MockObserver::observeSolution( + const Thyra::VectorBase &solution, + const Thyra::MultiVectorBase &solution_dxdp) +{ + lastSolution_ = solution.clone_v(); + lastSolution_dxdp_ = solution_dxdp.clone_mv(); +} + + template void MockObserver::observeSolution( @@ -126,15 +165,55 @@ MockObserver::observeSolution( lastStamp_ = stamp; } +template +void +MockObserver::observeSolution( + const Thyra::VectorBase &solution, + const Thyra::MultiVectorBase &solution_dxdp, + const Scalar stamp) +{ + lastSolution_ = solution.clone_v(); + lastSolution_dxdp_ = solution_dxdp.clone_mv(); + lastStamp_ = stamp; +} + +template +void +MockObserver::observeSolution( + const Thyra::VectorBase &solution, + const Thyra::VectorBase &solution_dot, + const Scalar stamp) +{ + lastSolution_ = solution.clone_v(); + lastSolution_dot_ = solution_dot.clone_v(); + lastStamp_ = stamp; +} + +template +void +MockObserver::observeSolution( + const Thyra::VectorBase &solution, + const Thyra::MultiVectorBase &solution_dxdp, + const Thyra::VectorBase &solution_dot, + const Scalar stamp) +{ + lastSolution_ = solution.clone_v(); + lastSolution_dxdp_ = solution_dxdp.clone_mv(); + lastSolution_dot_ = solution_dot.clone_v(); + lastStamp_ = stamp; +} + template void MockObserver::observeSolution( const Thyra::VectorBase &solution, const Thyra::VectorBase &solution_dot, + const Thyra::VectorBase &solution_dotdot, const Scalar stamp) { lastSolution_ = solution.clone_v(); lastSolution_dot_ = solution_dot.clone_v(); + lastSolution_dotdot_ = solution_dotdot.clone_v(); lastStamp_ = stamp; } @@ -142,11 +221,13 @@ template void MockObserver::observeSolution( const Thyra::VectorBase &solution, + const Thyra::MultiVectorBase &solution_dxdp, const Thyra::VectorBase &solution_dot, const Thyra::VectorBase &solution_dotdot, const Scalar stamp) { lastSolution_ = solution.clone_v(); + lastSolution_dxdp_ = solution_dxdp.clone_mv(); lastSolution_dot_ = solution_dot.clone_v(); lastSolution_dotdot_ = solution_dotdot.clone_v(); lastStamp_ = stamp; diff --git a/packages/rol/adapters/thyra/src/function/ROL_ThyraProductME_Constraint_SimOpt.hpp b/packages/rol/adapters/thyra/src/function/ROL_ThyraProductME_Constraint_SimOpt.hpp index da6a5e0ae984..087daa2f8012 100644 --- a/packages/rol/adapters/thyra/src/function/ROL_ThyraProductME_Constraint_SimOpt.hpp +++ b/packages/rol/adapters/thyra/src/function/ROL_ThyraProductME_Constraint_SimOpt.hpp @@ -52,6 +52,7 @@ #include "ROL_Constraint_SimOpt.hpp" #include "Tpetra_CrsMatrix.hpp" +#include "Teuchos_VerbosityLevel.hpp" using namespace ROL; @@ -61,16 +62,22 @@ class ThyraProductME_Constraint_SimOpt : public Constraint_SimOpt { public: - ThyraProductME_Constraint_SimOpt(Thyra::ModelEvaluatorDefaultBase& thyra_model_, int g_index_, const std::vector& p_indices_,Teuchos::RCP params_ = Teuchos::null, bool recompute = false) : - thyra_model(thyra_model_), g_index(g_index_), p_indices(p_indices_), params(params_) { + ThyraProductME_Constraint_SimOpt(Thyra::ModelEvaluatorDefaultBase& thyra_model_, int g_index_, const std::vector& p_indices_, + Teuchos::RCP params_ = Teuchos::null, Teuchos::EVerbosityLevel verbLevel= Teuchos::VERB_HIGH) : + thyra_model(thyra_model_), g_index(g_index_), p_indices(p_indices_), params(params_), + out(Teuchos::VerboseObjectBase::getDefaultOStream()), + verbosityLevel(verbLevel){ thyra_solver = Teuchos::null; - updateValue = updateJacobian1 = true; - value_ = 0; + computeValue = computeJacobian1 = solveConstraint = true; num_responses = -1; - x_ptr = Teuchos::null; - grad_ptr = Teuchos::null; - if(params != Teuchos::null) + value_ptr_ = Teuchos::null; + rol_u_ptr = Teuchos::null; + rol_z_ptr = Teuchos::null; + jac1 = Teuchos::null; + if(params != Teuchos::null) { params->set("Optimizer Iteration Number", -1); + params->set > >("Optimization Variable", Teuchos::null); + } }; void setExternalSolver(Teuchos::RCP> thyra_solver_) { @@ -82,55 +89,83 @@ class ThyraProductME_Constraint_SimOpt : public Constraint_SimOpt { } void value(Vector &c, const Vector &u, const Vector &z, Real &tol) { +#ifdef HAVE_ROL_DEBUG + //u and z should be updated in the update functions before calling value + TEUCHOS_ASSERT(!u_hasChanged(u)); + TEUCHOS_ASSERT(!z_hasChanged(z)); +#endif - const ThyraVector & thyra_p = dynamic_cast&>(z); - const ThyraVector & thyra_x = dynamic_cast&>(u); - ThyraVector & thyra_f = dynamic_cast&>(c); - Teuchos::RCP > thyra_prodvec_p = Teuchos::rcp_dynamic_cast>(thyra_p.getVector()); - - Thyra::ModelEvaluatorBase::InArgs inArgs = thyra_model.createInArgs(); - Thyra::ModelEvaluatorBase::OutArgs outArgs = thyra_model.createOutArgs(); - - outArgs.set_f(thyra_f.getVector()); - for(std::size_t i=0; igetVectorBlock(i)); - inArgs.set_x(thyra_x.getVector()); - - thyra_model.evalModel(inArgs, outArgs); - + if(verbosityLevel >= Teuchos::VERB_MEDIUM) + *out << "ROL::ThyraProductME_Constraint_SimOpt::value" << std::endl; - /* { - const ThyraVector & thyra_p = dynamic_cast&>(z); - const ThyraVector & thyra_x = dynamic_cast&>(u); - const ThyraVector & thyra_f = dynamic_cast&>(c); + if(!computeValue) { + if(verbosityLevel >= Teuchos::VERB_HIGH) + *out << "ROL::ThyraProductME_Constraint_SimOpt::value, Skipping Value Computation" << std::endl; + TEUCHOS_ASSERT(Teuchos::nonnull(value_ptr_)); + c.set(*value_ptr_); + } + else { + const ThyraVector & thyra_p = dynamic_cast&>(z); + const ThyraVector & thyra_x = dynamic_cast&>(u); + ThyraVector & thyra_f = dynamic_cast&>(c); + Teuchos::RCP > thyra_prodvec_p = Teuchos::rcp_dynamic_cast>(thyra_p.getVector()); - Thyra::ConstDetachedVectorView x_view(thyra_x.getVector()); - Thyra::ConstDetachedVectorView p_view(thyra_p.getVector()); - Thyra::ConstDetachedVectorView f_view(thyra_f.getVector()); + Thyra::ModelEvaluatorBase::InArgs inArgs = thyra_model.createInArgs(); + Thyra::ModelEvaluatorBase::OutArgs outArgs = thyra_model.createOutArgs(); - std::cout << "\nEnd of value... x:" << " "; - for (std::size_t i=0; igetVectorBlock(i)); + inArgs.set_x(thyra_x.getVector()); - std::cout << "Norm: " << c.norm() < & thyra_p = dynamic_cast&>(z); + const ThyraVector & thyra_x = dynamic_cast&>(u); + const ThyraVector & thyra_f = dynamic_cast&>(c); + + Thyra::ConstDetachedVectorView x_view(thyra_x.getVector()); + Thyra::ConstDetachedVectorView p_view(thyra_p.getVector()); + Thyra::ConstDetachedVectorView f_view(thyra_f.getVector()); + + std::cout << "\nEnd of value... x:" << " "; + for (std::size_t i=0; iset(c); - updateValue = false; + computeValue = false; + } } void applyJacobian_1(Vector &jv, const Vector &v, const Vector &u, const Vector &z, Real &tol) { - if(updateJacobian1) { + if(verbosityLevel >= Teuchos::VERB_MEDIUM) + *out << "ROL::ThyraProductME_Constraint_SimOpt::applyJacobian_1" << std::endl; + +#ifdef HAVE_ROL_DEBUG + //u and z should be updated in the update functions before calling applyJacobian_1 + TEUCHOS_ASSERT(!u_hasChanged(u)); + TEUCHOS_ASSERT(!z_hasChanged(z)); +#endif + + if(computeJacobian1) { // Create Jacobian const ThyraVector & thyra_x = dynamic_cast&>(u); const ThyraVector & thyra_p = dynamic_cast&>(z); @@ -150,7 +185,11 @@ class ThyraProductME_Constraint_SimOpt : public Constraint_SimOpt { outArgs.set_W_op(lop); thyra_model.evalModel(inArgs, outArgs); jac1 = lop; - updateJacobian1 = false; + + computeJacobian1 = false; + } else { + if(verbosityLevel >= Teuchos::VERB_HIGH) + *out << "ROL::ThyraProductME_Constraint_SimOpt::applyJacobian_1, Skipping Jacobian Computation" << std::endl; } const ThyraVector & thyra_v = dynamic_cast&>(v); @@ -161,7 +200,15 @@ class ThyraProductME_Constraint_SimOpt : public Constraint_SimOpt { void applyJacobian_2(Vector &jv, const Vector &v, const Vector &u, const Vector &z, Real &tol) { - //std::cout << "Jacobian 2: " << tol <= Teuchos::VERB_MEDIUM) + *out << "ROL::ThyraProductME_Constraint_SimOpt::applyJacobian_2" << std::endl; + +#ifdef HAVE_ROL_DEBUG + //u and z should be updated in the update functions before calling applyJacobian_1 + TEUCHOS_ASSERT(!u_hasChanged(u)); + TEUCHOS_ASSERT(!z_hasChanged(z)); +#endif const ThyraVector & thyra_p = dynamic_cast&>(z); const ThyraVector & thyra_x = dynamic_cast&>(u); @@ -181,59 +228,56 @@ class ThyraProductME_Constraint_SimOpt : public Constraint_SimOpt { auto p_space = thyra_model.get_p_space(i); auto f_space = thyra_model.get_f_space(); - int num_params = p_space->dim(); - int num_resids = f_space->dim(); auto p_space_plus = Teuchos::rcp_dynamic_cast>(p_space); auto f_space_plus = Teuchos::rcp_dynamic_cast>(f_space); - bool p_dist = !p_space_plus->isLocallyReplicated();//p_space->DistributedGlobal(); - bool f_dist = !f_space_plus->isLocallyReplicated();//f_space->DistributedGlobal(); Thyra::ModelEvaluatorBase::DerivativeSupport ds = outArgs.supports(Thyra::ModelEvaluatorBase::OUT_ARG_DfDp,i); // Determine which layout to use for df/dp. Ideally one would look - // at num_params, num_resids, what is supported by the underlying + // at the parameter and residual dimensions, what is supported by the underlying // model evaluator, and the sensitivity method, and make the best // choice to minimze the number of solves. However this choice depends // also on what layout of dg/dx is supported (e.g., if only the operator // form is supported for forward sensitivities, then df/dp must be // DERIV_MV_BY_COL). For simplicity, we order the conditional tests // to get the right layout in most situations. - enum DerivativeLayout { OP, COL, ROW } dfdp_layout; - { // if (sensitivity_method == "Adjoint") - if (ds.supports(Thyra::ModelEvaluatorBase::DERIV_LINEAR_OP)) - dfdp_layout = OP; - else if (ds.supports(Thyra::ModelEvaluatorBase::DERIV_MV_GRADIENT_FORM) && !f_dist) - dfdp_layout = ROW; - else if (ds.supports(Thyra::ModelEvaluatorBase::DERIV_MV_JACOBIAN_FORM) && !p_dist) - dfdp_layout = COL; + + if (ds.supports(Thyra::ModelEvaluatorBase::DERIV_LINEAR_OP)) { + auto dfdp_op = thyra_model.create_DfDp_op(i); + TEUCHOS_TEST_FOR_EXCEPTION( + dfdp_op == Teuchos::null, std::logic_error, + std::endl << "ROL::ThyraProductME_Constraint_SimOpt::applyJacobian_2(): " << + "Needed df/dp operator (" << i << ") is null!" << std::endl); + outArgs.set_DfDp(i,dfdp_op); + } else { + TEUCHOS_TEST_FOR_EXCEPTION(!ds.supports(Thyra::ModelEvaluatorBase::DERIV_LINEAR_OP), + std::logic_error, + std::endl << + "ROL::ThyraProductME_Constraint_SimOpt::applyJacobian_2(): " << + "The code related to df/dp multivector has been commented out because never tested. " << + std::endl); + + /* + if (ds.supports(Thyra::ModelEvaluatorBase::DERIV_MV_GRADIENT_FORM) && f_space_plus->isLocallyReplicated()) { + auto dfdp = Thyra::createMembers(p_space, f_space->dim()); + + Thyra::ModelEvaluatorBase::DerivativeMultiVector + dmv_dfdp(dfdp, Thyra::ModelEvaluatorBase::DERIV_MV_GRADIENT_FORM); + outArgs.set_DfDp(i,dmv_dfdp); + } else if (ds.supports(Thyra::ModelEvaluatorBase::DERIV_MV_JACOBIAN_FORM) && p_space_plus->isLocallyReplicated()) { + auto dfdp = Thyra::createMembers(f_space, p_space->dim()); + Thyra::ModelEvaluatorBase::DerivativeMultiVector + dmv_dfdp(dfdp, Thyra::ModelEvaluatorBase::DERIV_MV_JACOBIAN_FORM); + outArgs.set_DfDp(i,dmv_dfdp); + } else TEUCHOS_TEST_FOR_EXCEPTION( true, std::logic_error, - std::endl << "Piro::NOXSolver::evalModel(): " << + std::endl << "ROL::ThyraProductME_Constraint_SimOpt::applyJacobian_2(): " << "For df/dp(" << i <<") with adjoint sensitivities, " << "underlying ModelEvaluator must support DERIV_LINEAR_OP, " << "DERIV_MV_BY_COL with p not distributed, or " "DERIV_TRANS_MV_BY_ROW with f not distributed." << std::endl); - } - if (dfdp_layout == COL) { - auto dfdp = Thyra::createMembers(f_space, num_params); - Thyra::ModelEvaluatorBase::DerivativeMultiVector - dmv_dfdp(dfdp, Thyra::ModelEvaluatorBase::DERIV_MV_JACOBIAN_FORM); - outArgs.set_DfDp(i,dmv_dfdp); - } - else if (dfdp_layout == ROW) { - auto dfdp = Thyra::createMembers(p_space, num_resids); - - Thyra::ModelEvaluatorBase::DerivativeMultiVector - dmv_dfdp(dfdp, Thyra::ModelEvaluatorBase::DERIV_MV_GRADIENT_FORM); - outArgs.set_DfDp(i,dmv_dfdp); - } - else if (dfdp_layout == OP) { - auto dfdp_op = thyra_model.create_DfDp_op(i); - TEUCHOS_TEST_FOR_EXCEPTION( - dfdp_op == Teuchos::null, std::logic_error, - std::endl << "Piro::NOXSolver::evalModel(): " << - "Needed df/dp operator (" << i << ") is null!" << std::endl); - outArgs.set_DfDp(i,dfdp_op); + */ } } @@ -251,6 +295,14 @@ class ThyraProductME_Constraint_SimOpt : public Constraint_SimOpt { dfdp_op->apply(Thyra::NOTRANS,*thyra_prodvec_v->getVectorBlock(i), temp_jv_ptr->getVector().ptr(),1.0, 0.0); thyra_jv.axpy(1.0, *temp_jv_ptr); } else { + TEUCHOS_TEST_FOR_EXCEPTION( + dfdp_op == Teuchos::null, + std::logic_error, + std::endl << + "ROL::ThyraProductME_Constraint_SimOpt::applyJacobian_2(): " << + "The code related to df/dp multivector has been commented out because never tested. " << + std::endl); + /* Thyra::ModelEvaluatorBase::EDerivativeMultiVectorOrientation dfdp_orient = outArgs.get_DfDp(i).getMultiVectorOrientation(); Thyra::ModelEvaluatorBase::EDerivativeMultiVectorOrientation dgdx_orient = @@ -284,16 +336,27 @@ class ThyraProductME_Constraint_SimOpt : public Constraint_SimOpt { jv_view(ix) += v_view(0,ip)*dfdp_view(ix,ip); } } + */ } } } - virtual void applyInverseJacobian_1(Vector &ijv, + void applyInverseJacobian_1(Vector &ijv, const Vector &v, const Vector &u, const Vector &z, Real &tol) { + + if(verbosityLevel >= Teuchos::VERB_MEDIUM) + *out << "ROL::ThyraProductME_Constraint_SimOpt::applyInverseJacobian_1" << std::endl; + +#ifdef HAVE_ROL_DEBUG + //u and z should be updated in the update functions before calling applyJacobian_2 + TEUCHOS_ASSERT(!u_hasChanged(u)); + TEUCHOS_ASSERT(!z_hasChanged(z)); +#endif + const ThyraVector & thyra_p = dynamic_cast&>(z); const ThyraVector & thyra_x = dynamic_cast&>(u); const ThyraVector & thyra_v = dynamic_cast&>(v); @@ -314,10 +377,13 @@ class ThyraProductME_Constraint_SimOpt : public Constraint_SimOpt { Teuchos::RCP< const Thyra::LinearOpWithSolveFactoryBase > lows_factory = thyra_model.get_W_factory(); TEUCHOS_ASSERT(Teuchos::nonnull(lows_factory)); Teuchos::RCP< Thyra::LinearOpBase > lop; - if(updateJacobian1) + if(computeJacobian1) lop = thyra_model.create_W_op(); - else + else { + if(verbosityLevel >= Teuchos::VERB_HIGH) + *out << "ROL::ThyraProductME_Constraint_SimOpt::applyInverseJacobian_1, Skipping Jacobian Computation" << std::endl; lop = jac1; + } Teuchos::RCP< const ::Thyra::DefaultLinearOpSource > losb = Teuchos::rcp(new ::Thyra::DefaultLinearOpSource(lop)); @@ -331,14 +397,15 @@ class ThyraProductME_Constraint_SimOpt : public Constraint_SimOpt { } const Teuchos::RCP > jacobian = lows_factory->createOp(); - if(updateJacobian1) + if(computeJacobian1) { outArgs.set_W_op(lop); thyra_model.evalModel(inArgs, outArgs); outArgs.set_W_op(Teuchos::null); inArgs.set_x(Teuchos::null); jac1 = lop; - updateJacobian1 = false; + + computeJacobian1 = false; } if (Teuchos::nonnull(prec_factory)) @@ -372,8 +439,18 @@ class ThyraProductME_Constraint_SimOpt : public Constraint_SimOpt { void applyAdjointJacobian_1(Vector &ajv, const Vector &v, const Vector &u, const Vector &z, Real &tol) { +#ifdef HAVE_ROL_DEBUG + //u and z should be updated in the update functions before calling applyAdjointJacobian_1 + TEUCHOS_ASSERT(!u_hasChanged(u)); + TEUCHOS_ASSERT(!z_hasChanged(z)); +#endif + + if(verbosityLevel >= Teuchos::VERB_MEDIUM) + *out << "ROL::ThyraProductME_Constraint_SimOpt::applyAdjointJacobian_1" << std::endl; + + Teuchos::RCP< Thyra::LinearOpBase > lop; - if(updateJacobian1){ + if(computeJacobian1){ const ThyraVector & thyra_p = dynamic_cast&>(z); const ThyraVector & thyra_x = dynamic_cast&>(u); @@ -395,10 +472,15 @@ class ThyraProductME_Constraint_SimOpt : public Constraint_SimOpt { outArgs.set_W_op(lop); thyra_model.evalModel(inArgs, outArgs); jac1 = lop; - updateJacobian1 = false; + + computeJacobian1 = false; } - else + else { + if(verbosityLevel >= Teuchos::VERB_HIGH) + *out << "ROL::ThyraProductME_Constraint_SimOpt::applyAdjointJacobian_1, Skipping Jacobian Computation" << std::endl; lop = jac1; + } + const ThyraVector & thyra_v = dynamic_cast&>(v); ThyraVector & thyra_ajv = dynamic_cast&>(ajv); @@ -406,12 +488,21 @@ class ThyraProductME_Constraint_SimOpt : public Constraint_SimOpt { } - virtual void applyInverseAdjointJacobian_1(Vector &iajv, + void applyInverseAdjointJacobian_1(Vector &iajv, const Vector &v, const Vector &u, const Vector &z, Real &tol) { + if(verbosityLevel >= Teuchos::VERB_MEDIUM) + *out << "ROL::ThyraProductME_Constraint_SimOpt::applyInverseAdjointJacobian_1" << std::endl; + +#ifdef HAVE_ROL_DEBUG + //u and z should be updated in the update functions before calling applyInverseAdjointJacobian_1 + TEUCHOS_ASSERT(!u_hasChanged(u)); + TEUCHOS_ASSERT(!z_hasChanged(z)); +#endif + const ThyraVector & thyra_p = dynamic_cast&>(z); const ThyraVector & thyra_x = dynamic_cast&>(u); const ThyraVector & thyra_v = dynamic_cast&>(v); @@ -431,10 +522,13 @@ class ThyraProductME_Constraint_SimOpt : public Constraint_SimOpt { TEUCHOS_ASSERT(Teuchos::nonnull(lows_factory)); Teuchos::RCP< Thyra::LinearOpBase > lop; - if(updateJacobian1) + if(computeJacobian1) lop = thyra_model.create_W_op(); - else + else { + if(verbosityLevel >= Teuchos::VERB_HIGH) + *out << "ROL::ThyraProductME_Constraint_SimOpt::applyInverseAdjointJacobian_1, Skipping Jacobian Computation" << std::endl; lop = jac1; + } Teuchos::RCP< const ::Thyra::DefaultLinearOpSource > losb = Teuchos::rcp(new ::Thyra::DefaultLinearOpSource(lop)); @@ -448,13 +542,14 @@ class ThyraProductME_Constraint_SimOpt : public Constraint_SimOpt { } const Teuchos::RCP > jacobian = lows_factory->createOp(); - if(updateJacobian1) + if(computeJacobian1) { outArgs.set_W_op(lop); thyra_model.evalModel(inArgs, outArgs); outArgs.set_W_op(Teuchos::null); jac1 = lop; - updateJacobian1 = false; + + computeJacobian1 = false; } if (Teuchos::nonnull(prec_factory)) @@ -487,13 +582,21 @@ class ThyraProductME_Constraint_SimOpt : public Constraint_SimOpt { void applyAdjointJacobian_2(Vector &ajv, const Vector &v, const Vector &u, const Vector &z, Real &tol) { - // std::cout << "Adjoint Jacobian 2" <= Teuchos::VERB_MEDIUM) + *out << "ROL::ThyraProductME_Constraint_SimOpt::applyAdjointJacobian_2" << std::endl; + +#ifdef HAVE_ROL_DEBUG + //u and z should be updated in the update functions before calling applyAdjointJacobian_2 + TEUCHOS_ASSERT(!u_hasChanged(u)); + TEUCHOS_ASSERT(!z_hasChanged(z)); +#endif const ThyraVector & thyra_p = dynamic_cast&>(z); const ThyraVector & thyra_x = dynamic_cast&>(u); const ThyraVector & thyra_v = dynamic_cast&>(v); + ThyraVector & thyra_ajv = dynamic_cast&>(ajv); - //Teuchos::RCP< Thyra::VectorBase > thyra_f = Thyra::createMember(thyra_model.get_f_space()); Teuchos::RCP > thyra_prodvec_p = Teuchos::rcp_dynamic_cast>(thyra_p.getVector()); Teuchos::RCP > thyra_prodvec_ajv = Teuchos::rcp_dynamic_cast>(thyra_ajv.getVector()); @@ -508,59 +611,50 @@ class ThyraProductME_Constraint_SimOpt : public Constraint_SimOpt { auto p_space = thyra_model.get_p_space(i); auto f_space = thyra_model.get_f_space(); - int num_params = p_space->dim(); - int num_resids = f_space->dim(); auto p_space_plus = Teuchos::rcp_dynamic_cast>(p_space); auto f_space_plus = Teuchos::rcp_dynamic_cast>(f_space); - bool p_dist = !p_space_plus->isLocallyReplicated();//p_space->DistributedGlobal(); - bool f_dist = !f_space_plus->isLocallyReplicated();//f_space->DistributedGlobal(); Thyra::ModelEvaluatorBase::DerivativeSupport ds = outArgs.supports(Thyra::ModelEvaluatorBase::OUT_ARG_DfDp,i); - // Determine which layout to use for df/dp. Ideally one would look - // at num_params, num_resids, what is supported by the underlying - // model evaluator, and the sensitivity method, and make the best - // choice to minimze the number of solves. However this choice depends - // also on what layout of dg/dx is supported (e.g., if only the operator - // form is supported for forward sensitivities, then df/dp must be - // DERIV_MV_BY_COL). For simplicity, we order the conditional tests - // to get the right layout in most situations. - enum DerivativeLayout { OP, COL, ROW } dfdp_layout; - { // if (sensitivity_method == "Adjoint") - if (ds.supports(Thyra::ModelEvaluatorBase::DERIV_LINEAR_OP)) - dfdp_layout = OP; - else if (ds.supports(Thyra::ModelEvaluatorBase::DERIV_MV_GRADIENT_FORM) && !f_dist) - dfdp_layout = ROW; - else if (ds.supports(Thyra::ModelEvaluatorBase::DERIV_MV_JACOBIAN_FORM) && !p_dist) - dfdp_layout = COL; + // Determine which layout to use for df/dp. + + if (ds.supports(Thyra::ModelEvaluatorBase::DERIV_LINEAR_OP)) { + auto dfdp_op = thyra_model.create_DfDp_op(i); + TEUCHOS_TEST_FOR_EXCEPTION( + dfdp_op == Teuchos::null, std::logic_error, + std::endl << "ROL::ThyraProductME_Constraint_SimOpt::applyAdjointJacobian_2: " << + "Needed df/dp operator (" << i << ") is null!" << std::endl); + outArgs.set_DfDp(i,dfdp_op); + } else { + TEUCHOS_TEST_FOR_EXCEPTION( + !ds.supports(Thyra::ModelEvaluatorBase::DERIV_LINEAR_OP), + std::logic_error, + std::endl << + "ROL::ThyraProductME_Constraint_SimOpt::applyAdjointJacobian_2(): " << + "The code related to df/dp multivector has been commented out because never tested. " << + std::endl); + + /* + if (ds.supports(Thyra::ModelEvaluatorBase::DERIV_MV_GRADIENT_FORM) && f_space_plus->isLocallyReplicated()) { + auto dfdp = Thyra::createMembers(p_space, f_space->dim()); + + Thyra::ModelEvaluatorBase::DerivativeMultiVector + dmv_dfdp(dfdp, Thyra::ModelEvaluatorBase::DERIV_MV_GRADIENT_FORM); + outArgs.set_DfDp(i,dmv_dfdp); + } else if (ds.supports(Thyra::ModelEvaluatorBase::DERIV_MV_JACOBIAN_FORM) && p_space_plus->isLocallyReplicated()) { + auto dfdp = Thyra::createMembers(f_space, p_space->dim()); + Thyra::ModelEvaluatorBase::DerivativeMultiVector + dmv_dfdp(dfdp, Thyra::ModelEvaluatorBase::DERIV_MV_JACOBIAN_FORM); + outArgs.set_DfDp(i,dmv_dfdp); + } else TEUCHOS_TEST_FOR_EXCEPTION( true, std::logic_error, - std::endl << "Piro::NOXSolver::evalModel(): " << + std::endl << "ROL::ThyraProductME_Constraint_SimOpt::applyAdjointJacobian_2(): " << "For df/dp(" << i <<") with adjoint sensitivities, " << "underlying ModelEvaluator must support DERIV_LINEAR_OP, " << "DERIV_MV_BY_COL with p not distributed, or " "DERIV_TRANS_MV_BY_ROW with f not distributed." << std::endl); - } - if (dfdp_layout == COL) { - auto dfdp = Thyra::createMembers(f_space, num_params); - Thyra::ModelEvaluatorBase::DerivativeMultiVector - dmv_dfdp(dfdp, Thyra::ModelEvaluatorBase::DERIV_MV_JACOBIAN_FORM); - outArgs.set_DfDp(i,dmv_dfdp); - } - else if (dfdp_layout == ROW) { - auto dfdp = Thyra::createMembers(p_space, num_resids); - - Thyra::ModelEvaluatorBase::DerivativeMultiVector - dmv_dfdp(dfdp, Thyra::ModelEvaluatorBase::DERIV_MV_GRADIENT_FORM); - outArgs.set_DfDp(i,dmv_dfdp); - } - else if (dfdp_layout == OP) { - auto dfdp_op = thyra_model.create_DfDp_op(i); - TEUCHOS_TEST_FOR_EXCEPTION( - dfdp_op == Teuchos::null, std::logic_error, - std::endl << "Piro::NOXSolver::evalModel(): " << - "Needed df/dp operator (" << i << ") is null!" << std::endl); - outArgs.set_DfDp(i,dfdp_op); + */ } } @@ -576,6 +670,14 @@ class ThyraProductME_Constraint_SimOpt : public Constraint_SimOpt { dfdp_op->apply(Thyra::TRANS,*thyra_v.getVector(), thyra_prodvec_ajv->getNonconstVectorBlock(i).ptr(),1.0, 0.0); // Thyra::update(1.0, *tmp, thyra_ajv.getMultiVector().ptr()); } else { + TEUCHOS_TEST_FOR_EXCEPTION( + dfdp_op == Teuchos::null, + std::logic_error, + std::endl << + "ROL::ThyraProductME_Constraint_SimOpt::applyAdjointJacobian_2(): " << + "The code related to df/dp multivector has been commented out because never tested. " << + std::endl); + /* Thyra::ModelEvaluatorBase::EDerivativeMultiVectorOrientation dfdp_orient = outArgs.get_DfDp(i).getMultiVectorOrientation(); Thyra::ModelEvaluatorBase::EDerivativeMultiVectorOrientation dgdx_orient = @@ -608,6 +710,7 @@ class ThyraProductME_Constraint_SimOpt : public Constraint_SimOpt { ajv_view(ip) += v_view(0,ix)*dfdp_view(ix,ip); } } + */ } } } @@ -617,6 +720,17 @@ class ThyraProductME_Constraint_SimOpt : public Constraint_SimOpt { const Vector &z, Real &tol) { + if(verbosityLevel >= Teuchos::VERB_MEDIUM) + *out << "ROL::ThyraProductME_Constraint_SimOpt::solve" << std::endl; + + + if(!solveConstraint) { + TEUCHOS_ASSERT(Teuchos::nonnull(rol_u_ptr)); + u.set(*rol_u_ptr); + value(c, u, z, tol); + return; + } + if(thyra_solver.is_null()) Constraint_SimOpt::solve(c,u,z,tol); else { @@ -654,43 +768,91 @@ class ThyraProductME_Constraint_SimOpt : public Constraint_SimOpt { this->update_1(u); } - updateValue = false; + if (Teuchos::is_null(value_ptr_)) + value_ptr_ = c.clone(); + value_ptr_->set(c); + + computeValue = solveConstraint = false; } /** \brief Update constraint functions with respect to Sim variable. x is the optimization variable, - flag = true if optimization variable is changed, + flag = ??, iter is the outer algorithm iterations count. */ - void update_1( const Vector &u, bool flag = true, int iter = -1 ) { - if (flag == true) { - updateValue = true; - updateJacobian1 = true; + void update_1( const Vector &u, bool /*flag*/ = true, int iter = -1 ) { + if(u_hasChanged(u)) { + if(verbosityLevel >= Teuchos::VERB_HIGH) + *out << "ROL::ThyraProductME_Constraint_SimOpt::update_1, The State Changed" << std::endl; + computeValue = computeJacobian1 = true; + + if (Teuchos::is_null(rol_u_ptr)) + rol_u_ptr = u.clone(); + rol_u_ptr->set(u); } + if(params != Teuchos::null) params->set("Optimizer Iteration Number", iter); } /** \brief Update constraint functions with respect to Opt variable. x is the optimization variable, - flag = true if optimization variable is changed, + flag = ??, iter is the outer algorithm iterations count. */ - void update_2( const Vector &z, bool flag = true, int iter = -1 ) { - if (flag == true) { - updateValue = true; - updateJacobian1 = true; + void update_2( const Vector &z, bool /*flag*/ = true, int iter = -1 ) { + if(z_hasChanged(z)) { + if(verbosityLevel >= Teuchos::VERB_HIGH) + *out << "ROL::ThyraProductME_Constraint_SimOpt::update_2, The Parameter Changed" << std::endl; + computeValue = computeJacobian1 = solveConstraint = true; + + if (Teuchos::is_null(rol_z_ptr)) + rol_z_ptr = z.clone(); + rol_z_ptr->set(z); } + if(Teuchos::nonnull(params)) { + auto& z_stored_ptr = params->get > >("Optimization Variable"); + if(Teuchos::is_null(z_stored_ptr) || z_hasChanged(*z_stored_ptr)) { + if(verbosityLevel >= Teuchos::VERB_HIGH) + *out << "ROL::ThyraProductME_Constraint_SimOpt::update_2, Signaling That Parameter Changed" << std::endl; + params->set("Optimization Variables Changed", true); + if(Teuchos::is_null(z_stored_ptr)) + z_stored_ptr = z.clone(); + z_stored_ptr->set(z); + } + params->set("Optimizer Iteration Number", iter); - if(flag == true) - params->set("Optimization Variables Changed",true); } } + bool z_hasChanged(const Vector &rol_z) const { + bool changed = true; + if (Teuchos::nonnull(rol_z_ptr)) { + auto diff = rol_z.clone(); + diff->set(*rol_z_ptr); + diff->axpy( -1.0, rol_z ); + Real norm = diff->norm(); + changed = (norm == 0) ? false : true; + } + return changed; + } + + bool u_hasChanged(const Vector &rol_u) const { + bool changed = true; + if (Teuchos::nonnull(rol_u_ptr)) { + auto diff = rol_u.clone(); + diff->set(*rol_u_ptr); + diff->axpy( -1.0, rol_u ); + Real norm = diff->norm(); + changed = (norm == 0) ? false : true; + } + return changed; + } + public: - bool updateValue, updateJacobian1; + bool computeValue, computeJacobian1, solveConstraint; private: Teuchos::RCP> thyra_solver; @@ -698,10 +860,12 @@ class ThyraProductME_Constraint_SimOpt : public Constraint_SimOpt { const int g_index; const std::vector p_indices; int num_responses; - Real value_; - Teuchos::RCP > x_ptr, grad_ptr; + Teuchos::RCP > value_ptr_; + Teuchos::RCP > rol_u_ptr, rol_z_ptr; Teuchos::RCP params; + Teuchos::RCP out; Teuchos::RCP< Thyra::LinearOpBase > jac1; + Teuchos::EVerbosityLevel verbosityLevel; }; diff --git a/packages/rol/adapters/thyra/src/function/ROL_ThyraProductME_Objective.hpp b/packages/rol/adapters/thyra/src/function/ROL_ThyraProductME_Objective.hpp index a5745b8a8b2a..0bb75042d7fd 100644 --- a/packages/rol/adapters/thyra/src/function/ROL_ThyraProductME_Objective.hpp +++ b/packages/rol/adapters/thyra/src/function/ROL_ThyraProductME_Objective.hpp @@ -50,7 +50,7 @@ //#include "Thyra_DefaultProductVectorSpace.hpp" #include "Thyra_ProductVectorBase.hpp" #include -#include +#include "Teuchos_VerbosityLevel.hpp" /** \class ROL::ThyraProductME_Objective \brief Implements the ROL::Objective interface for a Thyra Model Evaluator Objective. @@ -62,11 +62,14 @@ template class ThyraProductME_Objective : public Objective { public: - ThyraProductME_Objective(Thyra::ModelEvaluatorDefaultBase& thyra_model_, int g_index_, const std::vector& p_indices_,Teuchos::RCP params_ = Teuchos::null) : - thyra_model(thyra_model_), g_index(g_index_), p_indices(p_indices_), params(params_) { - computeValue = true; + ThyraProductME_Objective(Thyra::ModelEvaluatorDefaultBase& thyra_model_, int g_index_, const std::vector& p_indices_, + Teuchos::RCP params_ = Teuchos::null, Teuchos::EVerbosityLevel verbLevel= Teuchos::VERB_HIGH) : + thyra_model(thyra_model_), g_index(g_index_), p_indices(p_indices_), params(params_), + out(Teuchos::VerboseObjectBase::getDefaultOStream()), + verbosityLevel(verbLevel) { + computeValue = computeGradient = true; value_ = 0; - if(params != Teuchos::null) { + if(Teuchos::nonnull(params)) { params->set("Optimizer Iteration Number", -1); params->set("Compute State", true); } @@ -80,8 +83,19 @@ class ThyraProductME_Objective : public Objective { */ Real value( const Vector &rol_x, Real &tol ) { - if(!computeValue) - return value_; +#ifdef HAVE_ROL_DEBUG + //x should be updated in the update function before calling value + TEUCHOS_ASSERT(!x_hasChanged(rol_x)); +#endif + + if(verbosityLevel >= Teuchos::VERB_MEDIUM) + *out << "ROL::ThyraProductME_Objective::value" << std::endl; + + if(!computeValue) { + if(verbosityLevel >= Teuchos::VERB_HIGH) + *out << "ROL::ThyraProductME_Objective::value, Skipping Value Computation" << std::endl; + return value_; + } // Real norm = rol_x.norm(); // std::cout << "Value norm: " << norm << std::endl; @@ -119,6 +133,20 @@ class ThyraProductME_Objective : public Objective { */ void gradient( Vector &rol_g, const Vector &rol_x, Real &tol ) { +#ifdef HAVE_ROL_DEBUG + //x should be updated in the update function before calling value + TEUCHOS_ASSERT(!x_hasChanged(rol_x)); +#endif + + if(verbosityLevel >= Teuchos::VERB_MEDIUM) + *out << "ROL::ThyraProductME_Objective::gradient" << std::endl; + + if(!computeGradient) { + if(verbosityLevel >= Teuchos::VERB_HIGH) + *out << "ROL::ThyraProductME_Objective::gradient, Skipping Gradient Computation" << std::endl; + return rol_g.set(*grad_ptr_); + } + // Real norm = rol_x.norm(); // std::cout << "In Gradient, Value norm: " << norm << std::endl; @@ -139,6 +167,8 @@ class ThyraProductME_Objective : public Objective { Teuchos::RCP< Thyra::VectorBase > g; if(computeValue) { + if(verbosityLevel >= Teuchos::VERB_HIGH) + *out << "ROL::ThyraProductME_Objective::gradient, Computing Value" << std::endl; g = Thyra::createMember(thyra_model.get_g_space(g_index)); outArgs.set_g(g_index, g); } @@ -164,28 +194,58 @@ class ThyraProductME_Objective : public Objective { value_ = ::Thyra::get_ele(*g,0); computeValue = false; } + + if (grad_ptr_ == Teuchos::null) + grad_ptr_ = rol_g.clone(); + grad_ptr_->set(rol_g); + + computeGradient = false; }; - void update( const Vector & /*x*/, bool flag = true, int iter = -1 ) { - computeValue = flag; + void update( const Vector & x, bool flag = true, int iter = -1 ) { if(Teuchos::nonnull(params)) { params->set("Optimizer Iteration Number", iter); - if(flag == true) { + } + + if(x_hasChanged(x)) { + + if(verbosityLevel >= Teuchos::VERB_HIGH) + *out << "ROL::ThyraProductME_Objective::update, The Parameter Changed" << std::endl; + computeValue = computeGradient = true; + + if(Teuchos::nonnull(params)) { params->set("Compute State", true); params->set("Optimization Variables Changed", true); } } } + + bool x_hasChanged(const Vector &rol_x) { + bool changed = true; + if (Teuchos::nonnull(rol_x_ptr)) { + rol_x_ptr->axpy( -1.0, rol_x ); + Real norm = rol_x_ptr->norm(); + changed = (norm == 0) ? false : true; + } else { + rol_x_ptr = rol_x.clone(); + } + rol_x_ptr->set(rol_x); + return changed; + } public: - bool computeValue; + bool computeValue, computeGradient; private: Thyra::ModelEvaluatorDefaultBase& thyra_model; const int g_index; const std::vector p_indices; Real value_; + Teuchos::RCP > grad_ptr_; + Teuchos::RCP > rol_x_ptr; Teuchos::RCP params; + Teuchos::RCP out; + Teuchos::EVerbosityLevel verbosityLevel; }; // class Objective diff --git a/packages/rol/adapters/thyra/src/function/ROL_ThyraProductME_Objective_SimOpt.hpp b/packages/rol/adapters/thyra/src/function/ROL_ThyraProductME_Objective_SimOpt.hpp index 3faec1f2b38d..fae187499e71 100644 --- a/packages/rol/adapters/thyra/src/function/ROL_ThyraProductME_Objective_SimOpt.hpp +++ b/packages/rol/adapters/thyra/src/function/ROL_ThyraProductME_Objective_SimOpt.hpp @@ -48,6 +48,7 @@ #include "ROL_StdVector.hpp" #include "ROL_Objective_SimOpt.hpp" #include "ROL_Types.hpp" +#include "Teuchos_VerbosityLevel.hpp" using namespace ROL; @@ -57,44 +58,77 @@ class ThyraProductME_Objective_SimOpt : public Objective_SimOpt { public: - ThyraProductME_Objective_SimOpt(Thyra::ModelEvaluatorDefaultBase& thyra_model_, int g_index_, const std::vector& p_indices_,Teuchos::RCP params_ = Teuchos::null) : - thyra_model(thyra_model_), g_index(g_index_), p_indices(p_indices_), params(params_) { - updateValue = true; + ThyraProductME_Objective_SimOpt(Thyra::ModelEvaluatorDefaultBase& thyra_model_, int g_index_, const std::vector& p_indices_, + Teuchos::RCP params_ = Teuchos::null, Teuchos::EVerbosityLevel verbLevel= Teuchos::VERB_HIGH) : + thyra_model(thyra_model_), g_index(g_index_), p_indices(p_indices_), params(params_), + out(Teuchos::VerboseObjectBase::getDefaultOStream()), + verbosityLevel(verbLevel) { + computeValue = computeGradient1 = computeGradient2 = true; value_ = 0; - x_ptr = Teuchos::null; + rol_u_ptr = rol_z_ptr = Teuchos::null; if(params != Teuchos::null) { params->set("Optimizer Iteration Number", -1); + params->set > >("Optimization Variable", Teuchos::null); } }; Real value(const Vector &u, const Vector &z, Real &tol ) { - if(updateValue) { - const ThyraVector & thyra_p = dynamic_cast&>(z); - const ThyraVector & thyra_x = dynamic_cast&>(u); - Teuchos::RCP< Thyra::VectorBase > g = Thyra::createMember(thyra_model.get_g_space(g_index)); - Teuchos::RCP > thyra_prodvec_p = Teuchos::rcp_dynamic_cast>(thyra_p.getVector()); +#ifdef HAVE_ROL_DEBUG + //u and z should be updated in the update functions before calling applyAdjointJacobian_2 + TEUCHOS_ASSERT(!u_hasChanged(u)); + TEUCHOS_ASSERT(!z_hasChanged(z)); +#endif - Thyra::ModelEvaluatorBase::InArgs inArgs = thyra_model.createInArgs(); - Thyra::ModelEvaluatorBase::OutArgs outArgs = thyra_model.createOutArgs(); + if(verbosityLevel >= Teuchos::VERB_MEDIUM) + *out << "ROL::ThyraProductME_Objective_SimOpt::value" << std::endl; - outArgs.set_g(g_index, g); - for(std::size_t i=0; igetVectorBlock(i)); - inArgs.set_x(thyra_x.getVector()); + if(!computeValue) { + if(verbosityLevel >= Teuchos::VERB_HIGH) + *out << "ROL::ThyraProductME_Objective_SimOpt::value, Skipping Computation of Value" << std::endl; + return value_; + } - thyra_model.evalModel(inArgs, outArgs); + const ThyraVector & thyra_p = dynamic_cast&>(z); + const ThyraVector & thyra_x = dynamic_cast&>(u); + Teuchos::RCP< Thyra::VectorBase > g = Thyra::createMember(thyra_model.get_g_space(g_index)); + Teuchos::RCP > thyra_prodvec_p = Teuchos::rcp_dynamic_cast>(thyra_p.getVector()); - value_ = ::Thyra::get_ele(*g,0); + Thyra::ModelEvaluatorBase::InArgs inArgs = thyra_model.createInArgs(); + Thyra::ModelEvaluatorBase::OutArgs outArgs = thyra_model.createOutArgs(); + + outArgs.set_g(g_index, g); + for(std::size_t i=0; igetVectorBlock(i)); + inArgs.set_x(thyra_x.getVector()); + + thyra_model.evalModel(inArgs, outArgs); + + value_ = ::Thyra::get_ele(*g,0); + + computeValue = false; - updateValue = false; - } return value_; } void gradient_1(Vector &g, const Vector &u, const Vector &z, Real &tol ) { +#ifdef HAVE_ROL_DEBUG + //u and z should be updated in the update functions before calling gradient_1 + TEUCHOS_ASSERT(!u_hasChanged(u)); + TEUCHOS_ASSERT(!z_hasChanged(z)); +#endif + + if(verbosityLevel >= Teuchos::VERB_MEDIUM) + *out << "ROL::ThyraProductME_Objective_SimOpt::gradient_1" << std::endl; + + if(!computeGradient1) { + if(verbosityLevel >= Teuchos::VERB_HIGH) + *out << "ROL::ThyraProductME_Objective_SimOpt::gradient_1, Skipping Computation of Gradient 1" << std::endl; + return g.set(*grad1_ptr_); + } + const ThyraVector & thyra_p = dynamic_cast&>(z); const ThyraVector & thyra_x = dynamic_cast&>(u); @@ -111,7 +145,7 @@ class ThyraProductME_Objective_SimOpt : public Objective_SimOpt { Teuchos::RCP< Thyra::VectorBase > thyra_g; - if(updateValue) { + if(computeValue) { thyra_g = Thyra::createMember(thyra_model.get_g_space(g_index)); outArgs.set_g(g_index, thyra_g); } @@ -133,14 +167,38 @@ class ThyraProductME_Objective_SimOpt : public Objective_SimOpt { } thyra_model.evalModel(inArgs, outArgs); - if(updateValue) { + if(computeValue) { + if(verbosityLevel >= Teuchos::VERB_HIGH) + *out << "ROL::ThyraProductME_Objective_SimOpt::gradient_1, Computing Value" << std::endl; value_ = ::Thyra::get_ele(*thyra_g,0); - updateValue = false; + computeValue = false; } + + if (Teuchos::is_null(grad1_ptr_)) + grad1_ptr_ = g.clone(); + grad1_ptr_->set(g); + + computeGradient1 = false; } void gradient_2(Vector &g, const Vector &u, const Vector &z, Real &tol ) { +#ifdef HAVE_ROL_DEBUG + //u and z should be updated in the update functions before calling gradient_2 + TEUCHOS_ASSERT(!u_hasChanged(u)); + TEUCHOS_ASSERT(!z_hasChanged(z)); +#endif + + if(verbosityLevel >= Teuchos::VERB_MEDIUM) + *out << "ROL::ThyraProductME_Objective_SimOpt::gradient_2" << std::endl; + + + if(!computeGradient2) { + if(verbosityLevel >= Teuchos::VERB_HIGH) + *out << "ROL::ThyraProductME_Objective_SimOpt::gradient_2, Skipping Computation of Gradient 2" << std::endl; + return g.set(*grad2_ptr_); + } + const ThyraVector & thyra_p = dynamic_cast&>(z); const ThyraVector & thyra_x = dynamic_cast&>(u); @@ -160,7 +218,9 @@ class ThyraProductME_Objective_SimOpt : public Objective_SimOpt { Teuchos::RCP< Thyra::VectorBase > thyra_g; - if(updateValue) { + if(computeValue) { + if(verbosityLevel >= Teuchos::VERB_HIGH) + *out << "ROL::ThyraProductME_Objective_SimOpt::gradient_2, Computing Value" << std::endl; thyra_g = Thyra::createMember(thyra_model.get_g_space(g_index)); outArgs.set_g(g_index, thyra_g); } @@ -182,31 +242,86 @@ class ThyraProductME_Objective_SimOpt : public Objective_SimOpt { } thyra_model.evalModel(inArgs, outArgs); - if(updateValue) { + if(computeValue) { value_ = ::Thyra::get_ele(*thyra_g,0); - updateValue = false; + computeValue = false; } + + if (grad2_ptr_ == Teuchos::null) + grad2_ptr_ = g.clone(); + grad2_ptr_->set(g); + + computeGradient2 = false; } - void update( const Vector &/*u*/, const Vector &/*z*/, bool flag = true, int iter = -1) { - updateValue = flag; + void update( const Vector &u, const Vector &z, bool /*flag*/ = true, int iter = -1) { + if(z_hasChanged(z) || u_hasChanged(u)) { + if(verbosityLevel >= Teuchos::VERB_HIGH) + *out << "ROL::ThyraProductME_Objective_SimOpt::update, Either The State Or The Parameters Changed" << std::endl; + computeValue = computeGradient1 = computeGradient2 = true; + + if (Teuchos::is_null(rol_z_ptr)) + rol_z_ptr = z.clone(); + rol_z_ptr->set(z); + + if (Teuchos::is_null(rol_u_ptr)) + rol_u_ptr = u.clone(); + rol_u_ptr->set(u); + } + if(params != Teuchos::null) { + auto& z_stored_ptr = params->get > >("Optimization Variable"); + if(Teuchos::is_null(z_stored_ptr) || z_hasChanged(*z_stored_ptr)) { + if(verbosityLevel >= Teuchos::VERB_HIGH) + *out << "ROL::ThyraProductME_Objective_SimOpt::update, Signaling That Parameter Changed" << std::endl; + params->set("Optimization Variables Changed", true); + if(Teuchos::is_null(z_stored_ptr)) + z_stored_ptr = z.clone(); + z_stored_ptr->set(z); + } params->set("Optimizer Iteration Number", iter); - if(flag == true) - params->set("Optimization Variables Changed",true); } } + bool z_hasChanged(const Vector &rol_z) const { + bool changed = true; + if (Teuchos::nonnull(rol_z_ptr)) { + auto diff = rol_z.clone(); + diff->set(*rol_z_ptr); + diff->axpy( -1.0, rol_z ); + Real norm = diff->norm(); + changed = (norm == 0) ? false : true; + } + return changed; + } + + bool u_hasChanged(const Vector &rol_u) const { + bool changed = true; + if (Teuchos::nonnull(rol_u_ptr)) { + auto diff = rol_u.clone(); + diff->set(*rol_u_ptr); + diff->axpy( -1.0, rol_u ); + Real norm = diff->norm(); + changed = (norm == 0) ? false : true; + } + return changed; + } + public: - bool updateValue; + bool computeValue, computeGradient1, computeGradient2; private: Thyra::ModelEvaluatorDefaultBase& thyra_model; const int g_index; const std::vector p_indices; Real value_; - Teuchos::RCP > x_ptr; + Teuchos::RCP > grad1_ptr_; + Teuchos::RCP > grad2_ptr_; + Teuchos::RCP > rol_z_ptr; + Teuchos::RCP > rol_u_ptr; Teuchos::RCP params; + Teuchos::RCP out; + Teuchos::EVerbosityLevel verbosityLevel; }; diff --git a/packages/rol/src/function/constraint/ROL_ConstraintDef.hpp b/packages/rol/src/function/constraint/ROL_ConstraintDef.hpp index 9e9645f22257..22e75d8a810b 100644 --- a/packages/rol/src/function/constraint/ROL_ConstraintDef.hpp +++ b/packages/rol/src/function/constraint/ROL_ConstraintDef.hpp @@ -592,6 +592,7 @@ Real Constraint::checkAdjointConsistencyJacobian(const Vector &w, ROL::Ptr > Jv = dualw.clone(); ROL::Ptr > Jw = dualv.clone(); + this->update(x); applyJacobian(*Jv,v,x,tol); applyAdjointJacobian(*Jw,w,x,tol); diff --git a/packages/rol/src/step/ROL_AugmentedLagrangianStep.hpp b/packages/rol/src/step/ROL_AugmentedLagrangianStep.hpp index b32976ff1817..9d29feb3ae6a 100644 --- a/packages/rol/src/step/ROL_AugmentedLagrangianStep.hpp +++ b/packages/rol/src/step/ROL_AugmentedLagrangianStep.hpp @@ -450,6 +450,7 @@ class AugmentedLagrangianStep : public Step { algo_state.snorm = s.norm(); algo_state.iter++; // Update objective function value + obj.update(x); algo_state.value = augLag.getObjectiveValue(x); // Update constraint value augLag.getConstraintVec(*(state->constraintVec),x); diff --git a/packages/rol/src/step/augmentedlagrangian/ROL_QuadraticPenalty.hpp b/packages/rol/src/step/augmentedlagrangian/ROL_QuadraticPenalty.hpp index 29dd5f426013..b9504bc34ebf 100644 --- a/packages/rol/src/step/augmentedlagrangian/ROL_QuadraticPenalty.hpp +++ b/packages/rol/src/step/augmentedlagrangian/ROL_QuadraticPenalty.hpp @@ -180,6 +180,7 @@ class QuadraticPenalty : public Objective { virtual void hessVec( Vector &hv, const Vector &v, const Vector &x, Real &tol ) { // Apply objective Hessian to a vector if (HessianApprox_ < 3) { + con_->update(x); con_->applyJacobian(*primalConVector_,v,x,tol); con_->applyAdjointJacobian(hv,primalConVector_->dual(),x,tol); if (!useScaling_) { diff --git a/packages/sacado/CMakeLists.txt b/packages/sacado/CMakeLists.txt index ac34eca63a24..add024520a9a 100644 --- a/packages/sacado/CMakeLists.txt +++ b/packages/sacado/CMakeLists.txt @@ -28,7 +28,7 @@ TRIBITS_ADD_OPTION_AND_DEFINE( ${PACKAGE_NAME}_NEW_FAD_DESIGN_IS_DEFAULT SACADO_NEW_FAD_DESIGN_IS_DEFAULT "Make the new Fad design the default, replacing the old one." - FALSE + ON ) TRIBITS_ADD_OPTION_AND_DEFINE( diff --git a/packages/shylu/shylu_node/hts/test/CMakeLists.txt b/packages/shylu/shylu_node/hts/test/CMakeLists.txt index 956ed73a32cc..87e391cda041 100644 --- a/packages/shylu/shylu_node/hts/test/CMakeLists.txt +++ b/packages/shylu/shylu_node/hts/test/CMakeLists.txt @@ -5,8 +5,8 @@ TRIBITS_ADD_EXECUTABLE( TRIBITS_ADD_ADVANCED_TEST( hts_test_1 TEST_0 EXEC hts_test NOEXEPREFIX - ENVIRONMENT OMP_NUM_THREADS=2 - FINAL_PASS_REGULAR_EXPRESSION Passed + NUM_MPI_PROCS 1 + NUM_TOTAL_CORES_USED 2 + PASS_REGULAR_EXPRESSION Passed COMM serial mpi - OVERALL_NUM_MPI_PROCS 1 - OVERALL_NUM_TOTAL_CORES_USED 2) + ENVIRONMENT OMP_NUM_THREADS=2) diff --git a/packages/shylu/shylu_node/tacho/src/impl/Tacho_NumericTools.hpp b/packages/shylu/shylu_node/tacho/src/impl/Tacho_NumericTools.hpp index 95e46c752e80..ca7ffbca282b 100644 --- a/packages/shylu/shylu_node/tacho/src/impl/Tacho_NumericTools.hpp +++ b/packages/shylu/shylu_node/tacho/src/impl/Tacho_NumericTools.hpp @@ -491,7 +491,10 @@ namespace Tacho { timer.reset(); { - value_type_array buf(do_not_initialize_tag("buf"), _info.max_schur_size*(_info.max_schur_size + 1)); + /// valgrind reports the following buf array as uninitialized even if it is initialized + /// while the task is executed. to remove the valgrind error, we initialize the array with zero. + /// value_type_array buf(do_not_initialize_tag("buf"), _info.max_schur_size*(_info.max_schur_size + 1)); + value_type_array buf("buf", _info.max_schur_size*(_info.max_schur_size + 1)); const size_t bufsize = buf.span()*sizeof(value_type); track_alloc(bufsize); @@ -540,7 +543,10 @@ namespace Tacho { const ordinal_type nb = panelsize > 0 ? panelsize : _info.max_schur_size; timer.reset(); { - value_type_array buf(do_not_initialize_tag("buf"), _info.max_schur_size*(nb + 1)); + /// valgrind reports the following buf array as uninitialized even if it is initialized + /// while the task is executed. to remove the valgrind error, we initialize the array with zero. + /// value_type_array buf(do_not_initialize_tag("buf"), _info.max_schur_size*(nb + 1)); + value_type_array buf("buf", _info.max_schur_size*(nb + 1)); const size_t bufsize = buf.span()*sizeof(value_type); track_alloc(bufsize); diff --git a/packages/tpetra/core/src/Tpetra_Details_Behavior.cpp b/packages/tpetra/core/src/Tpetra_Details_Behavior.cpp index c17dcb98b479..a769c7aef494 100644 --- a/packages/tpetra/core/src/Tpetra_Details_Behavior.cpp +++ b/packages/tpetra/core/src/Tpetra_Details_Behavior.cpp @@ -358,6 +358,17 @@ size_t Behavior::longRowMinNumEntries () (value_, initialized_, envVarName, defaultValue); } +size_t Behavior::multivectorKernelLocationThreshold () +{ + constexpr char envVarName[] = "TPETRA_VECTOR_DEVICE_THRESHOLD"; + constexpr size_t defaultValue (10000); + + static size_t value_ = defaultValue; + static bool initialized_ = false; + return idempotentlyGetEnvironmentVariableAsSize + (value_, initialized_, envVarName, defaultValue); +} + bool Behavior::profilingRegionUseTeuchosTimers () { constexpr char envVarName[] = "TPETRA_USE_TEUCHOS_TIMERS"; diff --git a/packages/tpetra/core/src/Tpetra_Details_Behavior.hpp b/packages/tpetra/core/src/Tpetra_Details_Behavior.hpp index 3f248bca2fb5..1bc24215d64e 100644 --- a/packages/tpetra/core/src/Tpetra_Details_Behavior.hpp +++ b/packages/tpetra/core/src/Tpetra_Details_Behavior.hpp @@ -200,6 +200,15 @@ class Behavior { /// separate question. static size_t longRowMinNumEntries (); + /// \brief the threshold for transitioning from device to host + /// + /// If the number of elements in the multivector does not exceed this + /// threshold and the data is on host, then run the calculation on + /// host. Otherwise, run on device. + /// By default this is 10000, but may be altered by the environment + /// variable TPETRA_VECTOR_DEVICE_THRESHOLD + static size_t multivectorKernelLocationThreshold (); + /// \brief Use Teuchos::Timer in Tpetra::ProfilingRegion /// /// This is disabled by default. You may control this at run time via the diff --git a/packages/tpetra/core/src/Tpetra_MultiVector_def.hpp b/packages/tpetra/core/src/Tpetra_MultiVector_def.hpp index d8e69ac71980..9f3d157794a2 100644 --- a/packages/tpetra/core/src/Tpetra_MultiVector_def.hpp +++ b/packages/tpetra/core/src/Tpetra_MultiVector_def.hpp @@ -329,9 +329,23 @@ namespace { // (anonymous) } } + template + bool + runKernelOnHost ( Kokkos::DualView imports ) + { + if (! imports.need_sync_device ()) { + return false; // most up-to-date on device + } + else { // most up-to-date on host + size_t localLengthThreshold = Tpetra::Details::Behavior::multivectorKernelLocationThreshold(); + return imports.extent(0) <= localLengthThreshold; + } + } + + template bool - multiVectorRunNormOnHost (const ::Tpetra::MultiVector& X) + runKernelOnHost (const ::Tpetra::MultiVector& X) { if (! X.need_sync_device ()) { return false; // most up-to-date on device @@ -360,7 +374,7 @@ namespace { // (anonymous) const bool isConstantStride = X.isConstantStride (); const bool isDistributed = X.isDistributed (); - const bool runOnHost = multiVectorRunNormOnHost (X); + const bool runOnHost = runKernelOnHost (X); if (runOnHost) { using view_type = typename dual_view_type::t_host; using array_layout = typename view_type::array_layout; @@ -981,7 +995,7 @@ namespace Tpetra { << permuteFromLIDs.extent (0) << "."); // We've already called checkSizes(), so this cast must succeed. - const MV& sourceMV = dynamic_cast (sourceObj); + MV& sourceMV = const_cast(dynamic_cast (sourceObj)); const size_t numCols = this->getNumVectors (); // sourceMV doesn't belong to us, so we can't sync it. Do the @@ -990,7 +1004,7 @@ namespace Tpetra { (sourceMV.need_sync_device () && sourceMV.need_sync_host (), std::logic_error, "Input MultiVector needs sync to both host " "and device."); - const bool copyOnHost = sourceMV.need_sync_device (); + const bool copyOnHost = runKernelOnHost(sourceMV); if (verbose) { std::ostringstream os; os << *prefix << "copyOnHost=" << (copyOnHost ? "true" : "false") << endl; @@ -998,12 +1012,12 @@ namespace Tpetra { } if (copyOnHost) { - if (this->need_sync_host ()) { - this->sync_host (); - } + sourceMV.sync_host(); + this->sync_host (); this->modify_host (); } else { + sourceMV.sync_device(); if (this->need_sync_device ()) { this->sync_device (); } @@ -1296,7 +1310,7 @@ namespace Tpetra { } // We've already called checkSizes(), so this cast must succeed. - const MV& sourceMV = dynamic_cast (sourceObj); + MV& sourceMV = const_cast(dynamic_cast (sourceObj)); const size_t numCols = sourceMV.getNumVectors (); @@ -1349,7 +1363,7 @@ namespace Tpetra { (sourceMV.need_sync_device () && sourceMV.need_sync_host (), std::logic_error, "Input MultiVector needs sync to both host " "and device."); - const bool packOnHost = sourceMV.need_sync_device (); + const bool packOnHost = runKernelOnHost(sourceMV); auto src_dev = sourceMV.getLocalViewHost (); auto src_host = sourceMV.getLocalViewDevice (); if (printDebugOutput) { @@ -1369,6 +1383,7 @@ namespace Tpetra { // Clearing the sync flags prevents this possible case. exports.clear_sync_state (); exports.modify_host (); + sourceMV.sync_host(); } else { // nde 06 Feb 2020: If 'exports' does not require resize @@ -1378,6 +1393,7 @@ namespace Tpetra { // Clearing the sync flags prevents this possible case. exports.clear_sync_state (); exports.modify_device (); + sourceMV.sync_device(); } if (numCols == 1) { // special case for one column only @@ -1582,7 +1598,7 @@ namespace Tpetra { // mfh 12 Apr 2016, 04 Feb 2019: Decide where to unpack based on // the memory space in which the imports buffer was last modified. // DistObject::doTransferNew gets to decide this. - const bool unpackOnHost = imports.need_sync_device (); + const bool unpackOnHost = runKernelOnHost(imports); if (printDebugOutput) { std::ostringstream os; @@ -1594,15 +1610,13 @@ namespace Tpetra { // We have to sync before modifying, because this method may read // as well as write (depending on the CombineMode). if (unpackOnHost) { - if (this->need_sync_host ()) { - this->sync_host (); - } + imports.sync_host(); + this->sync_host (); this->modify_host (); } else { - if (this->need_sync_device ()) { - this->sync_device (); - } + imports.sync_device(); + this->sync_device (); this->modify_device (); } auto X_d = this->getLocalViewDevice (); @@ -2319,9 +2333,10 @@ namespace Tpetra { // avoids sync'ing, which could violate users' expectations. // // If we need sync to device, then host has the most recent version. - const bool runOnHost = this->need_sync_device (); + const bool runOnHost = runKernelOnHost(*this); - if (! runOnHost) { // last modified in device memory + this->clear_sync_state(); + if (! runOnHost) { this->modify_device (); auto X = this->getLocalViewDevice (); if (this->isConstantStride ()) { diff --git a/packages/tpetra/core/test/MultiVector/MultiVector_UnitTests.cpp b/packages/tpetra/core/test/MultiVector/MultiVector_UnitTests.cpp index f4ba0759ea2c..5f0eeb0a1a1a 100644 --- a/packages/tpetra/core/test/MultiVector/MultiVector_UnitTests.cpp +++ b/packages/tpetra/core/test/MultiVector/MultiVector_UnitTests.cpp @@ -282,6 +282,83 @@ namespace { } + //// + TEUCHOS_UNIT_TEST_TEMPLATE_4_DECL( MultiVector, large, LO, GO, Scalar , Node ) + { + using map_type = Tpetra::Map; + using MV = Tpetra::MultiVector; + using vec_type = Tpetra::Vector; + typedef typename ScalarTraits::magnitudeType Magnitude; + constexpr bool debug = true; + + RCP outPtr = debug ? + Teuchos::getFancyOStream (Teuchos::rcpFromRef (std::cerr)) : + Teuchos::rcpFromRef (out); + Teuchos::FancyOStream& myOut = *outPtr; + + myOut << "Test: MultiVector, basic" << endl; + Teuchos::OSTab tab0 (myOut); + + const global_size_t INVALID = OrdinalTraits::invalid (); + RCP > comm = getDefaultComm (); + const int numImages = comm->getSize (); + + myOut << "Create Map" << endl; + const size_t numLocal = 15000; + const size_t numVecs = 10; + const GO indexBase = 0; + RCP map = + rcp (new map_type (INVALID, numLocal, indexBase, comm)); + + myOut << "Test MultiVector's & Vector's default constructors" << endl; + { + MV defaultConstructedMultiVector; + auto dcmv_map = defaultConstructedMultiVector.getMap (); + TEST_ASSERT( dcmv_map.get () != nullptr ); + if (dcmv_map.get () != nullptr) { + TEST_EQUALITY( dcmv_map->getGlobalNumElements (), + Tpetra::global_size_t (0) ); + } + vec_type defaultConstructedVector; + auto dcv_map = defaultConstructedVector.getMap (); + TEST_ASSERT( dcv_map.get () != nullptr ); + if (dcv_map.get () != nullptr) { + TEST_EQUALITY( dcv_map->getGlobalNumElements (), + Tpetra::global_size_t (0) ); + } + } + + myOut << "Test MultiVector's usual constructor" << endl; + RCP mvec; + TEST_NOTHROW( mvec = rcp (new MV (map, numVecs, true)) ); + if (mvec.is_null ()) { + myOut << "MV constructor threw an exception: returning" << endl; + return; + } + TEST_EQUALITY( mvec->getNumVectors(), numVecs ); + TEST_EQUALITY( mvec->getLocalLength(), numLocal ); + TEST_EQUALITY( mvec->getGlobalLength(), numImages*numLocal ); + + myOut << "Test that all norms are zero" << endl; + Array norms(numVecs), zeros(numVecs); + std::fill(zeros.begin(),zeros.end(),ScalarTraits::zero()); + TEST_NOTHROW( mvec->norm2(norms) ); + TEST_COMPARE_FLOATING_ARRAYS(norms,zeros,ScalarTraits::zero()); + TEST_NOTHROW( mvec->norm1(norms) ); + TEST_COMPARE_FLOATING_ARRAYS(norms,zeros,ScalarTraits::zero()); + TEST_NOTHROW( mvec->normInf(norms) ); + TEST_COMPARE_FLOATING_ARRAYS(norms,zeros,ScalarTraits::zero()); + // print it + myOut << *mvec << endl; + + // Make sure that the test passed on all processes, not just Proc 0. + int lclSuccess = success ? 1 : 0; + int gblSuccess = 1; + reduceAll (*comm, REDUCE_MIN, lclSuccess, outArg (gblSuccess)); + TEST_ASSERT( gblSuccess == 1 ); + } + + //// TEUCHOS_UNIT_TEST_TEMPLATE_4_DECL( MultiVector, BadConstLDA, LO, GO, Scalar , Node ) { @@ -1221,6 +1298,331 @@ namespace { TEST_ASSERT( gblSuccess == 1 ); } + // Test Tpetra::MultiVector::elementWiseMultiply on a large multivector + // + // Be sure to exercise all combinations of the cases alpha = + // {-1,0,1,other} and beta = {-1,0,1,other}, as these commonly have + // special cases. + // + // Also be sure to exercise the common case (also often with a + // special-case implementation) where all the MultiVectors have one + // column. + TEUCHOS_UNIT_TEST_TEMPLATE_4_DECL( MultiVector, ElementWiseMultiplyLg, LO , GO , ST , Node ) + { + using Teuchos::View; + typedef Tpetra::global_size_t GST; + typedef Teuchos::ScalarTraits STS; + typedef typename STS::magnitudeType MT; + typedef Teuchos::ScalarTraits STM; + typedef Tpetra::Map map_type; + typedef Tpetra::MultiVector MV; + typedef Tpetra::Vector V; + typedef typename Kokkos::Details::ArithTraits::val_type IST; + + out << "Tpetra::MultiVector::elementWiseMultiplyLg test" << endl; + Teuchos::OSTab tab0 (out); + + // Create a Map. + RCP > comm = getDefaultComm (); + const size_t lclNumRows = 15000; + const GST gblNumRows = comm->getSize () * lclNumRows; + const GO indexBase = 0; + RCP map3n = + rcp (new map_type (gblNumRows, lclNumRows, indexBase, comm)); + + const MT M0 = STM::zero (); + const ST S0 = STS::zero (); + const ST S1 = STS::one (); + + // In what follows, '@' (without single quotes) denotes + // element-wise multiplication -- that is, what + // MultiVector::elementWiseMultiply implements. + + const size_t maxNumVecs = 3; + + // Test for various numbers of columns. + for (size_t numVecs = 1; numVecs <= maxNumVecs; ++numVecs) { + out << "Test numVecs = " << numVecs << endl; + Teuchos::OSTab tab1 (out); + + // A (always) has 1 vector, and B and C have numVecs vectors. + V A (map3n); + MV B (map3n, numVecs); + MV C (map3n, numVecs); + MV C_exp (map3n, numVecs); + Array C_norms (C.getNumVectors ()); + Array C_zeros (C.getNumVectors ()); + std::fill (C_zeros.begin (), C_zeros.end (), M0); + + int caseNum = 0; + + caseNum++; + out << "Case " << caseNum << ": C = 0*C + 0*(A @ B)" << endl; + // Fill A and B initially with nonzero values, just for + // generality. C should get filled with zeros afterwards. + // Prefill C with NaN, to ensure that the method follows BLAS + // update rules. + { + A.putScalar (S1); + B.putScalar (S1); + + // Prefill C with NaN, if NaN exists for ST. + const ST nan = static_cast (Kokkos::Details::ArithTraits::nan ()); + C.putScalar (nan); + + C.elementWiseMultiply (S0, A, B, S0); + + C_exp.putScalar (S0); + C_exp.update (S1, C, -S1); + C_exp.normInf (C_norms ()); + + TEST_COMPARE_FLOATING_ARRAYS( C_norms, C_zeros, M0 ); + } + + caseNum++; + out << "Case " << caseNum << ": C = 1*C + 0*(A @ B)" << endl; + // Fill A and B with NaN to check that the method follows BLAS + // update rules. + { + const ST S3 = S1 + S1 + S1; + + // Prefill A and B with NaN, if NaN exists for ST. + const ST nan = static_cast (Kokkos::Details::ArithTraits::nan ()); + A.putScalar (nan); + B.putScalar (nan); + C.putScalar (S3); + + C.elementWiseMultiply (S0, A, B, S1); + + C_exp.putScalar (S3); + C_exp.update (S1, C, -S1); + C_exp.normInf (C_norms ()); + + TEST_COMPARE_FLOATING_ARRAYS( C_norms, C_zeros, M0 ); + } + + caseNum++; + out << "Case " << caseNum << ": C = (-1)*C + 0*(A @ B)" << endl; + // Fill A and B with NaN to check that the method follows BLAS + // update rules. + { + // Prefill A and B with NaN, if NaN exists for ST. + const ST nan = static_cast (Kokkos::Details::ArithTraits::nan ()); + A.putScalar (nan); + B.putScalar (nan); + C.putScalar (S1); + + C.elementWiseMultiply (S0, A, B, -S1); + + C_exp.putScalar (-S1); + C_exp.update (S1, C, -S1); + C_exp.normInf (C_norms ()); + + TEST_COMPARE_FLOATING_ARRAYS( C_norms, C_zeros, M0 ); + } + + caseNum++; + out << "Case " << caseNum << ": C = 2*C + 0*(A @ B)" << endl; + // Fill A and B with NaN to check that the method follows BLAS + // update rules. + { + const ST S2 = S1 + S1; + + // Prefill A and B with NaN, if NaN exists for ST. + const ST nan = static_cast (Kokkos::Details::ArithTraits::nan ()); + A.putScalar (nan); + B.putScalar (nan); + C.putScalar (S1); + + C.elementWiseMultiply (S0, A, B, S2); + + C_exp.putScalar (S2); + C_exp.update (S1, C, -S1); + C_exp.normInf (C_norms ()); + + TEST_COMPARE_FLOATING_ARRAYS( C_norms, C_zeros, M0 ); + } + + caseNum++; + out << "Case " << caseNum << ": C = 0*C + 1*(A @ B)" << endl; + // A and B will be filled with 1s, so C should get filled with 1s. + // Prefill C with NaN, to ensure that the method follows BLAS + // update rules. + { + A.putScalar (S1); + B.putScalar (S1); + + // Prefill C with NaN, if NaN exists for ST. + const ST nan = static_cast (Kokkos::Details::ArithTraits::nan ()); + C.putScalar (nan); + + C.elementWiseMultiply (S1, A, B, S0); + + C_exp.putScalar (S1); + C_exp.update (S1, C, -S1); + C_exp.normInf (C_norms ()); + + TEST_COMPARE_FLOATING_ARRAYS( C_norms, C_zeros, M0 ); + } + + caseNum++; + out << "Case " << caseNum << ": C = 0*C + (-1)*(A @ B)" << endl; + // A and B will be filled with 1, so C should get filled with -1. + // Prefill C with NaN, to ensure that the method follows BLAS + // update rules. + { + A.putScalar (S1); + B.putScalar (S1); + + // Prefill C with NaN, if NaN exists for ST. + const ST nan = static_cast (Kokkos::Details::ArithTraits::nan ()); + C.putScalar (nan); + + C.elementWiseMultiply (-S1, A, B, S0); + + C_exp.putScalar (-S1); + C_exp.update (S1, C, -S1); + C_exp.normInf (C_norms ()); + + TEST_COMPARE_FLOATING_ARRAYS( C_norms, C_zeros, M0 ); + } + + caseNum++; + out << "Case " << caseNum << ": C = 1*C + 1*(A @ B)" << endl; + // Fill A with 1, B with 2, and C with 3. C should be 5 after. + { + const ST S2 = S1 + S1; + const ST S3 = S1 + S1 + S1; + const ST S5 = S2 + S3; + A.putScalar (S1); + B.putScalar (S2); + C.putScalar (S3); + + C.elementWiseMultiply (S1, A, B, S1); + + C_exp.putScalar (S5); + C_exp.update (S1, C, -S1); + C_exp.normInf (C_norms ()); + + TEST_COMPARE_FLOATING_ARRAYS( C_norms, C_zeros, M0 ); + } + + caseNum++; + out << "Case " << caseNum << ": C = (-1)*C + 1*(A @ B)" << endl; + // Fill A with 1, B with 2, and C with 3. C should be -1 after. + { + const ST S2 = S1 + S1; + const ST S3 = S1 + S1 + S1; + A.putScalar (S1); + B.putScalar (S2); + C.putScalar (S3); + + C.elementWiseMultiply (S1, A, B, -S1); + + C_exp.putScalar (-S1); + C_exp.update (S1, C, -S1); + C_exp.normInf (C_norms ()); + + TEST_COMPARE_FLOATING_ARRAYS( C_norms, C_zeros, M0 ); + } + + caseNum++; + out << "Case " << caseNum << ": C = 1*C + (-1)*(A @ B)" << endl; + // Fill A with 2, B with 3, and C with 1. C should be -5 after. + { + const ST S2 = S1 + S1; + const ST S3 = S2 + S1; + const ST S5 = S2 + S3; + + A.putScalar (S2); + B.putScalar (S3); + C.putScalar (S1); + + C.elementWiseMultiply (-S1, A, B, S1); + + C_exp.putScalar (-S5); + C_exp.update (S1, C, -S1); + C_exp.normInf (C_norms ()); + + TEST_COMPARE_FLOATING_ARRAYS( C_norms, C_zeros, M0 ); + } + + caseNum++; + out << "Case " << caseNum << ": C = (-1)*C + (-1)*(A @ B)" << endl; + // Fill A with 1, B with 2, and C with 3. C should be -5 after. + { + const ST S2 = S1 + S1; + const ST S3 = S1 + S1 + S1; + const ST S5 = S2 + S3; + A.putScalar (S1); + B.putScalar (S2); + C.putScalar (S3); + + C.elementWiseMultiply (-S1, A, B, -S1); + + C_exp.putScalar (-S5); + C_exp.update (S1, C, -S1); + C_exp.normInf (C_norms ()); + + TEST_COMPARE_FLOATING_ARRAYS( C_norms, C_zeros, M0 ); + } + + caseNum++; + out << "Case " << caseNum << ": C = 0*C + 2*(A @ B)" << endl; + // Fill A with 3 and B with 4. C should be 24 after. + { + const ST S2 = S1 + S1; + const ST S3 = S2 + S1; + const ST S4 = S3 + S1; + const ST S24 = S2 * S3 * S4; + + A.putScalar (S3); + B.putScalar (S4); + + // Prefill C with NaN, if NaN exists for ST. + const ST nan = static_cast (Kokkos::Details::ArithTraits::nan ()); + C.putScalar (nan); + + C.elementWiseMultiply (S2, A, B, S0); + + C_exp.putScalar (S24); + C_exp.update (S1, C, -S1); + C_exp.normInf (C_norms ()); + + TEST_COMPARE_FLOATING_ARRAYS( C_norms, C_zeros, M0 ); + } + + caseNum++; + out << "Case " << caseNum << ": C = (-2)*C + 2*(A @ B)" << endl; + // Fill A with 3, B with 4, and C with 5. C should be 14 after. + { + const ST S2 = S1 + S1; + const ST S3 = S2 + S1; + const ST S4 = S3 + S1; + const ST S5 = S4 + S1; + const ST S14 = S5 * S2 + S4; + + A.putScalar (S3); + B.putScalar (S4); + C.putScalar (S5); + + C.elementWiseMultiply (S2, A, B, -S2); + + C_exp.putScalar (S14); + C_exp.update (S1, C, -S1); + C_exp.normInf (C_norms ()); + + TEST_COMPARE_FLOATING_ARRAYS( C_norms, C_zeros, M0 ); + } + } + + // Make sure that the test passed on all processes, not just Proc 0. + int lclSuccess = success ? 1 : 0; + int gblSuccess = 1; + reduceAll (*comm, REDUCE_MIN, lclSuccess, outArg (gblSuccess)); + TEST_ASSERT( gblSuccess == 1 ); + } + //// TEUCHOS_UNIT_TEST_TEMPLATE_4_DECL( MultiVector, BadConstAA, LO , GO , Scalar , Node ) @@ -4800,6 +5202,7 @@ namespace { #define UNIT_TEST_GROUP_BASE( SCALAR, LO, GO, NODE ) \ TEUCHOS_UNIT_TEST_TEMPLATE_4_INSTANT( MultiVector, basic , LO, GO, SCALAR, NODE ) \ + TEUCHOS_UNIT_TEST_TEMPLATE_4_INSTANT( MultiVector, large , LO, GO, SCALAR, NODE ) \ TEUCHOS_UNIT_TEST_TEMPLATE_4_INSTANT( MultiVector, NonMemberConstructors, LO, GO, SCALAR, NODE ) \ TEUCHOS_UNIT_TEST_TEMPLATE_4_INSTANT( MultiVector, BadConstLDA , LO, GO, SCALAR, NODE ) \ TEUCHOS_UNIT_TEST_TEMPLATE_4_INSTANT( MultiVector, BadConstAA , LO, GO, SCALAR, NODE ) \ @@ -4822,6 +5225,7 @@ namespace { TEUCHOS_UNIT_TEST_TEMPLATE_4_INSTANT( MultiVector, SingleVecNormalize, LO, GO, SCALAR, NODE ) \ TEUCHOS_UNIT_TEST_TEMPLATE_4_INSTANT( MultiVector, Multiply , LO, GO, SCALAR, NODE ) \ TEUCHOS_UNIT_TEST_TEMPLATE_4_INSTANT( MultiVector, ElementWiseMultiply,LO, GO, SCALAR, NODE ) \ + TEUCHOS_UNIT_TEST_TEMPLATE_4_INSTANT( MultiVector, ElementWiseMultiplyLg,LO, GO, SCALAR, NODE ) \ TEUCHOS_UNIT_TEST_TEMPLATE_4_INSTANT( MultiVector, NonContigView , LO, GO, SCALAR, NODE ) \ TEUCHOS_UNIT_TEST_TEMPLATE_4_INSTANT( MultiVector, Describable , LO, GO, SCALAR, NODE ) \ TEUCHOS_UNIT_TEST_TEMPLATE_4_INSTANT( MultiVector, Typedefs , LO, GO, SCALAR, NODE ) \ diff --git a/packages/trilinoscouplings/examples/scaling/TrilinosCouplings_EpetraIntrepidPoissonExample.cpp b/packages/trilinoscouplings/examples/scaling/TrilinosCouplings_EpetraIntrepidPoissonExample.cpp index 7f5ffbb4b8ab..9709b7f7038a 100644 --- a/packages/trilinoscouplings/examples/scaling/TrilinosCouplings_EpetraIntrepidPoissonExample.cpp +++ b/packages/trilinoscouplings/examples/scaling/TrilinosCouplings_EpetraIntrepidPoissonExample.cpp @@ -1433,7 +1433,7 @@ sourceTerm (Scalar& x, Scalar& y, Scalar& z) { Scalar u; Scalar grad_u[3]; - Scalar flux[3]; + Scalar flux[3] = {0.0, 0.0, 0.0}; Scalar material[3][3]; Scalar f = 0.; diff --git a/packages/trilinoscouplings/examples/scaling/TrilinosCouplings_TpetraIntrepidHybridPoisson2DExample.cpp b/packages/trilinoscouplings/examples/scaling/TrilinosCouplings_TpetraIntrepidHybridPoisson2DExample.cpp index 9566e9c847a5..5a04e3936e13 100644 --- a/packages/trilinoscouplings/examples/scaling/TrilinosCouplings_TpetraIntrepidHybridPoisson2DExample.cpp +++ b/packages/trilinoscouplings/examples/scaling/TrilinosCouplings_TpetraIntrepidHybridPoisson2DExample.cpp @@ -1336,7 +1336,7 @@ sourceTerm (Scalar& x, Scalar& y, Scalar& z) { Scalar u; Scalar grad_u[3]; - Scalar flux[3]; + Scalar flux[3] = {0.0, 0.0, 0.0}; Scalar material[3][3]; Scalar f = 0.; diff --git a/packages/trilinoscouplings/examples/scaling/TrilinosCouplings_TpetraIntrepidHybridPoisson3DExample.cpp b/packages/trilinoscouplings/examples/scaling/TrilinosCouplings_TpetraIntrepidHybridPoisson3DExample.cpp index ce21b6a98efd..3fcd95596071 100644 --- a/packages/trilinoscouplings/examples/scaling/TrilinosCouplings_TpetraIntrepidHybridPoisson3DExample.cpp +++ b/packages/trilinoscouplings/examples/scaling/TrilinosCouplings_TpetraIntrepidHybridPoisson3DExample.cpp @@ -1338,7 +1338,7 @@ sourceTerm (Scalar& x, Scalar& y, Scalar& z) { Scalar u; Scalar grad_u[3]; - Scalar flux[3]; + Scalar flux[3] = {0.0, 0.0, 0.0}; Scalar material[3][3]; Scalar f = 0.; diff --git a/packages/trilinoscouplings/examples/scaling/TrilinosCouplings_TpetraIntrepidPoissonExample.cpp b/packages/trilinoscouplings/examples/scaling/TrilinosCouplings_TpetraIntrepidPoissonExample.cpp index 5c47e5c39e90..9211af969ddb 100644 --- a/packages/trilinoscouplings/examples/scaling/TrilinosCouplings_TpetraIntrepidPoissonExample.cpp +++ b/packages/trilinoscouplings/examples/scaling/TrilinosCouplings_TpetraIntrepidPoissonExample.cpp @@ -1870,7 +1870,7 @@ sourceTerm (Scalar& x, Scalar& y, Scalar& z) { Scalar u; Scalar grad_u[3]; - Scalar flux[3]; + Scalar flux[3] = {0.0, 0.0, 0.0}; Scalar material[3][3]; Scalar f = 0.; diff --git a/packages/trilinoscouplings/examples/scaling/TrilinosCouplings_TpetraIntrepidStructuredPoissonExample.cpp b/packages/trilinoscouplings/examples/scaling/TrilinosCouplings_TpetraIntrepidStructuredPoissonExample.cpp index 06662777134c..e9083969fbca 100644 --- a/packages/trilinoscouplings/examples/scaling/TrilinosCouplings_TpetraIntrepidStructuredPoissonExample.cpp +++ b/packages/trilinoscouplings/examples/scaling/TrilinosCouplings_TpetraIntrepidStructuredPoissonExample.cpp @@ -1330,7 +1330,7 @@ sourceTerm (Scalar& x, Scalar& y, Scalar& z) { Scalar u; Scalar grad_u[3]; - Scalar flux[3]; + Scalar flux[3] = {0.0, 0.0, 0.0}; Scalar material[3][3]; Scalar f = 0.; diff --git a/packages/trilinoscouplings/examples/scaling/example_Poisson.cpp b/packages/trilinoscouplings/examples/scaling/example_Poisson.cpp index 052d12613f26..8556cd536438 100644 --- a/packages/trilinoscouplings/examples/scaling/example_Poisson.cpp +++ b/packages/trilinoscouplings/examples/scaling/example_Poisson.cpp @@ -1407,7 +1407,7 @@ const Scalar sourceTerm(Scalar& x, Scalar& y, Scalar& z){ Scalar u; Scalar grad_u[3]; - Scalar flux[3]; + Scalar flux[3] = {0.0, 0.0, 0.0}; Scalar material[3][3]; Scalar f = 0.; diff --git a/packages/trilinoscouplings/examples/scaling/example_Poisson2D.cpp b/packages/trilinoscouplings/examples/scaling/example_Poisson2D.cpp index 7c5ccb803bee..069b0b43f3b7 100644 --- a/packages/trilinoscouplings/examples/scaling/example_Poisson2D.cpp +++ b/packages/trilinoscouplings/examples/scaling/example_Poisson2D.cpp @@ -1296,7 +1296,7 @@ const Scalar sourceTerm(Scalar& x, Scalar& y){ Scalar u; Scalar grad_u[2]; - Scalar flux[2]; + Scalar flux[2] = {0.0, 0.0}; Scalar material[2][2]; Scalar f = 0.; diff --git a/packages/trilinoscouplings/examples/scaling/example_Poisson2D_p2.cpp b/packages/trilinoscouplings/examples/scaling/example_Poisson2D_p2.cpp index c2a27edfc52b..338612bf32a0 100644 --- a/packages/trilinoscouplings/examples/scaling/example_Poisson2D_p2.cpp +++ b/packages/trilinoscouplings/examples/scaling/example_Poisson2D_p2.cpp @@ -1367,7 +1367,7 @@ const Scalar sourceTerm(Scalar& x, Scalar& y){ Scalar u; Scalar grad_u[2]; - Scalar flux[2]; + Scalar flux[2] = {0.0, 0.0}; Scalar material[2][2]; Scalar f = 0.; diff --git a/packages/trilinoscouplings/examples/scaling/example_Poisson2D_p2_tpetra.cpp b/packages/trilinoscouplings/examples/scaling/example_Poisson2D_p2_tpetra.cpp index c0a68a0cd2b6..5888f9b8e4d9 100644 --- a/packages/trilinoscouplings/examples/scaling/example_Poisson2D_p2_tpetra.cpp +++ b/packages/trilinoscouplings/examples/scaling/example_Poisson2D_p2_tpetra.cpp @@ -1446,7 +1446,7 @@ const Scalar sourceTerm(Scalar& x, Scalar& y){ Scalar u; Scalar grad_u[2]; - Scalar flux[2]; + Scalar flux[2] = {0.0, 0.0}; Scalar material[2][2]; Scalar f = 0.; diff --git a/packages/trilinoscouplings/examples/scaling/example_Poisson2D_pn.cpp b/packages/trilinoscouplings/examples/scaling/example_Poisson2D_pn.cpp index b19ed44d46ef..20974e98b7c4 100644 --- a/packages/trilinoscouplings/examples/scaling/example_Poisson2D_pn.cpp +++ b/packages/trilinoscouplings/examples/scaling/example_Poisson2D_pn.cpp @@ -1339,7 +1339,7 @@ const Scalar sourceTerm(Scalar& x, Scalar& y){ Scalar u; Scalar grad_u[2]; - Scalar flux[2]; + Scalar flux[2] = {0.0, 0.0}; Scalar material[2][2]; Scalar f = 0.; diff --git a/packages/trilinoscouplings/examples/scaling/example_Poisson2D_pn_tpetra.cpp b/packages/trilinoscouplings/examples/scaling/example_Poisson2D_pn_tpetra.cpp index e98bf01b322e..8a46fdc6d77d 100644 --- a/packages/trilinoscouplings/examples/scaling/example_Poisson2D_pn_tpetra.cpp +++ b/packages/trilinoscouplings/examples/scaling/example_Poisson2D_pn_tpetra.cpp @@ -1856,7 +1856,7 @@ const Scalar sourceTerm(Scalar& x, Scalar& y){ Scalar u; Scalar grad_u[2]; - Scalar flux[2]; + Scalar flux[2] = {0.0, 0.0}; Scalar material[2][2]; Scalar f = 0.; diff --git a/packages/trilinoscouplings/examples/scaling/example_Poisson_BlockMaterials.cpp b/packages/trilinoscouplings/examples/scaling/example_Poisson_BlockMaterials.cpp index 700b74223ae6..7a9b7838f11a 100644 --- a/packages/trilinoscouplings/examples/scaling/example_Poisson_BlockMaterials.cpp +++ b/packages/trilinoscouplings/examples/scaling/example_Poisson_BlockMaterials.cpp @@ -1402,7 +1402,7 @@ const Scalar sourceTerm(Scalar& x, Scalar& y, Scalar& z){ Scalar u; Scalar grad_u[3]; - Scalar flux[3]; + Scalar flux[3] = {0.0, 0.0, 0.0}; Scalar material[3][3]; Scalar f = 0.; diff --git a/packages/trilinoscouplings/examples/scaling/example_Poisson_NoFE.cpp b/packages/trilinoscouplings/examples/scaling/example_Poisson_NoFE.cpp index a88d39d2d629..5167e9393036 100644 --- a/packages/trilinoscouplings/examples/scaling/example_Poisson_NoFE.cpp +++ b/packages/trilinoscouplings/examples/scaling/example_Poisson_NoFE.cpp @@ -1401,7 +1401,7 @@ const Scalar sourceTerm(Scalar& x, Scalar& y, Scalar& z){ Scalar u; Scalar grad_u[3]; - Scalar flux[3]; + Scalar flux[3] = {0.0, 0.0, 0.0}; Scalar material[3][3]; Scalar f = 0.; diff --git a/packages/trilinoscouplings/examples/scaling/example_Poisson_NoFE_Epetra.cpp b/packages/trilinoscouplings/examples/scaling/example_Poisson_NoFE_Epetra.cpp index dd548bf7ec2f..a2ea04f0c9dc 100644 --- a/packages/trilinoscouplings/examples/scaling/example_Poisson_NoFE_Epetra.cpp +++ b/packages/trilinoscouplings/examples/scaling/example_Poisson_NoFE_Epetra.cpp @@ -1348,7 +1348,7 @@ const Scalar sourceTerm(Scalar& x, Scalar& y, Scalar& z){ Scalar u; Scalar grad_u[3]; - Scalar flux[3]; + Scalar flux[3] = {0.0, 0.0, 0.0}; Scalar material[3][3]; Scalar f = 0.; diff --git a/packages/trilinoscouplings/examples/scaling/example_Poisson_NoFE_Tpetra.cpp b/packages/trilinoscouplings/examples/scaling/example_Poisson_NoFE_Tpetra.cpp index 54aa5c6d5bbf..5a0e53ed4752 100644 --- a/packages/trilinoscouplings/examples/scaling/example_Poisson_NoFE_Tpetra.cpp +++ b/packages/trilinoscouplings/examples/scaling/example_Poisson_NoFE_Tpetra.cpp @@ -1459,7 +1459,7 @@ const Scalar sourceTerm(Scalar& x, Scalar& y, Scalar& z){ Scalar u; Scalar grad_u[3]; - Scalar flux[3]; + Scalar flux[3] = {0.0, 0.0, 0.0}; Scalar material[3][3]; Scalar f = 0.; diff --git a/packages/trilinoscouplings/examples/scaling/example_Poisson_stk.cpp b/packages/trilinoscouplings/examples/scaling/example_Poisson_stk.cpp index f81c6a6613be..99395e73ac50 100644 --- a/packages/trilinoscouplings/examples/scaling/example_Poisson_stk.cpp +++ b/packages/trilinoscouplings/examples/scaling/example_Poisson_stk.cpp @@ -1064,7 +1064,7 @@ const Scalar sourceTerm(Scalar& x, Scalar& y, Scalar& z){ Scalar u; Scalar grad_u[3]; - Scalar flux[3]; + Scalar flux[3] = {0.0, 0.0, 0.0}; Scalar material[3][3]; Scalar f = 0.; diff --git a/packages/trilinoscouplings/examples/scaling/example_StabilizedADR.cpp b/packages/trilinoscouplings/examples/scaling/example_StabilizedADR.cpp index cf0814517933..d15203cbcca7 100644 --- a/packages/trilinoscouplings/examples/scaling/example_StabilizedADR.cpp +++ b/packages/trilinoscouplings/examples/scaling/example_StabilizedADR.cpp @@ -1281,7 +1281,7 @@ const Scalar sourceTerm(Scalar& x, Scalar& y, Scalar& z){ Scalar u; Scalar grad_u[3]; - Scalar flux[3]; + Scalar flux[3] = {0.0, 0.0, 0.0}; Scalar diffusion[3][3]; Scalar advection[3]; Scalar f = 0.;